牛顿后插公式
数值计算实验牛顿前插和后插插值

数值计算实验二姓名:方小开学号:20060810202 班级:计科0602一. 实验目的:1、差分的matlab实现;2、Newton插值的matlab实现;二. 实验原理:MATLAB在线性代数,矩阵分析,数值及优化,数理统计和随机信号分析,电路系统,系统动力学,信号与图像处理,控制理论分析和系统设计,过程控制,建模和仿真,通信系统,等有广泛的应用。
它具有功能强大,界面友好,语言自然即开放性等特点。
三.试验环境MATLAB7.0四. 试验过程及现象:1、牛顿插值公式:把下面的matlab程序在matlab中建立M-file文件并保存;function [d,v1]=newtonjz(x,y,v) %d 插商表 v是要插入x v1是插入的y值n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=j:nd(i,j)=(d(i,j-1)-d(i-1,j-1))/(x(i)-x(i-j+1));endendw=1;v1=d(1,1);for i=2:nw=w*(v-x(i-1));v1=v1+d(i,i)*w;end分别给x,y赋初值,并调用Newton插值函数得到结果如下:x=[0.40,0.55,0.65,0.80,0.90,1.05];y=[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382];[z,xy]=newtonjz(x,y,0.596);z =0.4108 0 0 0 0 00.5782 1.1160 0 0 0 00.6967 1.1860 0.2800 0 0 00.8881 1.2757 0.3589 0.1973 0 01.0265 1.3841 0.4335 0.2130 0.0312 01.2538 1.5153 0.5249 0.2287 0.0314 0.0003xy =0.63192Newton前插公式:把Newton前插公式的matlab程序写在matlab中建立M-file文件并保存;function [d,v1]=newtonBefore(x,y,t)n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=1:n-j+1d(i,j)=(d(i+1,j-1)-d(i,j-1));endendw=1;m=1;v1=d(1,1);for i=2:nw=w*(t-i+2);m=m*(i-1);v1=v1+d(1,i)*(w/m);end分别给x,y赋初值,并调用Newton前插函数得到结果如下;x=[1 1.05 1.10 1.15 1.20 1.25 1.30];y=[1 1.0247 1.04881 1.07238 1.09544 1.11803 1.14017];>> [z,qc]=newtonBefore(x,y,0.2);qc =1.004992263808003、Newton后插公式:把Newton后插公式的matlab程序写在matlab中建立M-file文件并保存;function [d,v1]=newtonAfter(x,y,t)n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=j:nd(i,j)=(d(i,j-1)-d(i-1,j-1));endendw=1;m=1;v1=d(1,1);for i=2:nw=w*(t+i-2);m=m*(i-1);v1=v1+d(n,i)*(w/m);end分别给x,y赋初值,并调用Newton后插函数得到结果如下;x=[1 1.05 1.10 1.15 1.20 1.25 1.30];y=[1 1.0247 1.04881 1.07238 1.09544 1.11803 1.14017];>> [z,hc]=newtonAfter(x,y,-0.4);hc=1.13136982835200五.遇到的问题在调试的过程中也遇到了一些小小的问题,如输出的结果只显示4位有效数字,结果的精度太低了,不能满足要求,因此在matlab中把数据的格式从short型改成了long型,这样就大大的提高了结果的精确度,减少了误差。
计算方法 3 牛顿插值

2
分析
显然, L2 ( x0 ) y0,L2 ( x1 ) y1;利用插值 条件, L2 ( x2 ) y2 y1 y0 y 2 y0 ( x2 x0 ) a ( x2 x0 )( x2 x1 ) x1 x0 y2 y0 y1 y0 x2 x0 x1 x0 y1 y0 a L2 y0 ( x x0 ) x2 x1 x1 x0 y2 y0 y1 y0 x2 x0 x1 x0 ( x x0 )( x x1 ) x2 x1
计算方法(2016/2017 第一学期) 贾飞 西南科技大学 制造科学与工程学院
9
牛顿基本插值公式
其中,线性部分 N 1 ( x ) f ( x0 ) f [ x0 , x1 ]( x x0 ) 满足 N 1 ( x0 ) f ( x 0 ) f ( x1 ) f ( x0 ) N 1 ( x1 ) f ( x0 ) ( x1 x0 ) f ( x1 ) x1 x0 N 1 ( x ) 为 f ( x ) 以 x0,x1 为插值结点的 线性插值函数,即: N ( 1 x ) L1 ( x )
西南科技大学
制造科学与工程学院
16
解:构造差商表如下,
xi -2 0 f(xi ) 1阶 17 1 -8 1 17 3 8 1.25 2阶 3阶
1
2
2
19
N 3 ( x ) 17 8( x 2) 3( x 2) x 1.25( x 2) x ( x 1) f 0.9 N 3 (0.9) 1.30375, R3 0.9 1.25 0.9 2 0.9 0.9 1 0.9 2 0.358875
第2章 3.牛顿插值公式

r yi r 1 yi r 1 yi 1
中心差分
/ centered difference /
r y i r 1 y i r 1 y i
1 2
1 2
其中 yi 1 y( xi h ) 2
2
差分的重要性质: 线性:例如 (a f ( x ) b g( x )) a f b g 若 f (x)是 m 次多项式,则 k f ( x) (0 k m) 是 m k 次多项 k 式,而 f ( x) 0 (k m) 差分值可由函数值算出:
同理有:N 2 ( x ) f ( x0 ) f [ x0 , x1 ]( x x0 ) f [ x0 , x1 , x2 ]( x x0 )( x x1 )
1 ( 3) f [ x0 , x1 , x2 , x ] f ( ) 3!
一般地f ( x)在x0 , x1 , xn为插值结点的n次插值多项式为
牛顿插值公式
邹昌文
问题的提出
以x0 , x1为插值结点的一阶插值公式为 x x0 x x1 L1 ( x ) y0 y1 x0 x1 x1 x0 y1 y0 y0 ( x x0 ) x1 x0
现考虑增加一个插值结x2,且使原有项不变 点
可令
L2 ( x) L1 a( x x0 )( x x1 )
设x x0 th 则N n ( x ) N n ( x0 th)
f ( x0 ) f [ x0 , x1 ]( x x0 ) f [ x0 , x1 , x2 ]( x x0 )( x x1 ) f [ x0 , x1 , xn ]( x x0 )( x x1 )( x xn1 )
牛顿法代数插值ndash差商表的求法

牛顿法代数插值ndash 差商表的求法原文地址:牛顿法代数插值–差商表的求法作者:大关牛顿法代数插值–差商表的求法下面的求插商的方法并不是好的求插商的方式,因为他的效率并不是很高,不论是从空间效率还是时间效率,但是下面主要探讨的是一种将塔形的数据转换成一位数组的方式。
实际上求插商仅通过一个n个元素的一位数组就能解决,但本文强调的是一种思路,希望对大家有所借鉴。
牛顿插商公式:f[xi,xj]=(f(xj)– f(xi))/(xj– xi)f[xi,xj,xk]=(f[xj,xk]– f[xi,xj])/(xk– xi)….f[x0,x1,x2…,xn]=(f[x1,x2,…,xn]– f[x0,x1,…,xn-1])/(xn– x0)转换成均插表(或称差商表)形式如下:定义1:f[xi,xi+1,…xj]简记为f(i,j)其中i=0&&i=n&&j=0&&j=n&&i j;记f(xi)为f[xi,xi]即f(i,i)根据定义1可以推出:f[x0,x1]=f(0,1),f[x0,x1…xn]=f(0,n)….根据定义1:可以将插商表转换为如下形式。
根据上图,可以给出实际一维数组存储时的序列关系,如下图所示:此时f(0,0)位置是数组下标0,f(1,1)是数组下标为1….这样,我们从中找出相应的规律。
推论1:已知f(i,j),n为变量的数目,令k=j– i。
当k不等于0时,f(i,j)在数组中的下标通过计算得:Index=k*n–((k-1)*k)/2+i当k等于0时Index=i。
推论1很容易证明(实际就是一个等差数列求和问题)这里证明略。
推论2:n为变量的数目,则一维数组的长度可以计算得((1+n)*n)/2推论2可以通过等差数列求和得以证明。
证明略。
推论3:各阶插商就是f(0,k)k=1,2….n.推论3:根据插商的定义和定义1可以直接推出。
牛顿插值公式

f ( x ) = f ( x0 ) + f [ x0 , x1 ]( x x0 ) + f [ x0 , x1 , x2 ]( x x0 )( x x1 ) + ...
+ f [ x 0 , ... , x n ]( x x 0 )...( x x n 1 )
+ f [ x , x0 , ... , xn ]( x x0 )...( x xn1 )( x xn )
f ( k ) (ξ ) f [ x 0 , ... , x k ] = , ξ ∈ ( x min , x max ) k!
实际计算过程为
f (x0) f (x1) f (x2) … f (xn1) f (xn) f (xn+1) f [x0, x1] f [x1, x2] …… …… f [xn1, xn] f [xn, xn+1]
Rn ( x ) = f (ξ ) t ( t 1)...( t n)h n+1 , ξ ∈ ( x0 , x n ) ( n + 1)!
( n +1 )
k =0
k
牛顿后插公式( 时用) 牛顿后插公式(一般当 x 靠近 xn 时用) 将节点顺序倒置: 将节点顺序倒置:
Nn( x) = f ( xn ) + f [xn , xn1](x xn ) + ...+ f [xn , ..., x0 ](x xn )...(x x1 )
当节点等距分布时: 当节点等距分布时 x i = x 0 + i h ( i = 0 , ... , n ) 等距分布时 牛顿前插公式( 时用) 牛顿前插公式(一般当 x 靠近 x0 时用) n 设 x = x 0 + t h ,则 N n ( x ) = N n ( x 0 + t h ) = Σ t k f ( x 0 )
2.2 牛顿插值法

f ( x ) = f ( x 0 ) + f [ x 0 , x 1 ]( x - x 0 ) + f [ x , x 0 , x 1 ]( x - x 0 )( x - x 1 )
又
f [ x , x 0 , x1 , x 2 ] =
f [ x 0 , x1 , x 2 ] - f [ x , x 0 , x1 ] x2 - x
a2=
依次递推可得到a3, …, an. 为写出系数 ak的一般表达式, 均差定义
2.3.2 均差及其性质
1、均差的定义 称 f [ x0 , xk ] =
f ( xk ) - f ( x0 ) xk - x0
为 f ( x ) 关于点 x 0 , x k 的一阶差商。 称 f [ x 0 , x1 , x k ] =
注:均差与节点的排列次序无关——均差 的对称性
f[x0,x1,…,xn]= f[x1,x0,x2,…,xn]=… = f[x1, …, xn ,x0]
因此 f [ x 0 , x 1 , , x k ] = f [ x 1 , x k - 1 , x 0 , x k ]
= f [ x 1 , x 2 , , x k -1 , x k ] - f [ x 1 , x 2 , , x k -1 , x 0 ] xk - x0 f [ x 1 , x 2 , , x k -1 , x k ] - f [ x 0 , x 1 , x 2 , , x k -1 ] xk - x0
f (xj)
k
j=0
j=0
( x j - xi )
i=0 j i
1ºn 阶均差可表示为函数值f(x0), f(x1),…, f(xn) 的线性组合
牛顿插值公式

I — 不变算子(恒等算子); If k = f k 不变算子(恒等算子); Ef k ≡ f k +1 , E m f k ≡ f k + m E — 位移算子
为两算子, (4)设A与B为两算子 与 为两算子 则称算子A与 为相等 为相等。 若 Afk = Bfk ,则称算子 与B为相等。记为 A = B; 则称A为 的逆算子 的逆算子。 若 AB = BA = I ,则称 为B的逆算子。记为B = A −1 ( A = B −1 ); (a ) ∆ = E − I , 如 (Q ∆f k = f k +1 − f k = Ef k − If k = ( E − I ) f k ) (b )∇ = I − E −1 (自己证) 自己证)
∆ f k = ∑ ( −1) ( ) f n− j + k ,
n j =0 j n j n
∇ f k = ∑ ( −1) j ( n ) f k − j . j
n j =0
n
其中 (n ) = Cnj = j
n(n − 1)L(n − j + 1) n . ( E − I ) n f k = ∑ ( −1) j ( nj ) E n− j I j f k j! j =0 n 证明:用算子二项式定理: 证明:用算子二项式定理: j n n− j −1 n −1
f
1 k+ 2
≡E
1 2
fk , f
1 2
1 k− 2
≡E
−
1 2
f k = ( E ) −1 f k , δ fk = f
1 2
⇒δ = E −EFra bibliotek−1 2
=E
−
1 2
1 k+ 2
1.5 牛顿插值公式

性质3:
P45 T3
3,利用差商表计算差商
利用差商的递推定义,可以用递推来计算差商。 如下表:
零阶差商
如要计算四阶差商,再增加一个节点,表中还要增加一行。
4,牛顿插值公式
从差分表中看到三阶差分近似于0,计算时只需二阶差分。 当4000≤B≤10500时用有限差分公式(牛顿前插公式)
• P49 题3,题4
作业 P56 题17、20、21
x2 x0
x1 x0
x2 x1
依次可得到 a3, a4 , , an 。为写出系数 ak
的一般表达式,现引入差商(均差)定义
1,差商(均差)的定义
2,差商(均差)的性质
性质1:
P44 T1
性质2:(差商的对称性) 差商与节点的排列顺序无关
f [x0, x1] f [x1, x0 ] f [x0, x1, x2 ] f [x1, x0, x2 ] f [x0, x2, x1]
(差商形式的插值公式)
P44-45 T2, P47 题1
差商与导数的关系
xk
0.40 0.55 0.65 0.80 0.90 1.05
f (xk )
0.41075 0.57815 0.69675 0.88811 1.02652 1.25386
一阶
1.1160 1.1860 1.2757 1.3841 1.5156
6.1 差分的概念
向后差分(▽表示向后差分算子 )
中心差分( 表示中心差分算子 )
其他常用的算子符号
y
△y △2y △3y
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012-2013(1)专业课程实践论文
牛顿后插公式
王瑜,0818180218,R数学08-2班
一、算法理论
由牛顿前插公式
)()!1())...(1()()1(1ξ+++--=n a n n f h n n t t t x R ,),(0n x x ∈ξ
如果要求表示函数在n x 附近的值)(x f ,此时应用Newton 插值公式,插值点应按的次序排列,有
)
()](,,,[))(](,,[)](,[)()(1011211x x x x x x x f x x x x x x x f x x x x f x f x N n n n n n n n n n n n n n --++--+-+=----- 作变换)01(≤≤-+=t th x x n 错误!未找到引用源。
,并利用公式代入上式带入得
n n n n n n n f n n t t t f t t f t f th x N ∇-++++∇++∇+=+!)1()1(!2)1()(2
称为Newton 后插公式,其余项。
。
),(,)!
1()()()1()()()(0)1(1n n n n n n x x n f h n t t t th x N x f x R ∈+++=+-=++ξξ 若用Newton 后插公式求)(x f 的值,因x 在n x 附近,则其系数)(x f 在点n x 的各阶向后差分。
二、算法框图
结束
判断是否
继续输入
提示是否继续输
入
输出结果
判断输入
区间合法性
Input x 提示正确的X 区
间信息
开始
是
否是
否
三、算法程序
class Interpolation
{
public:
Interpolation(int num, double x1, double x2, double func[]);
double ComputeBackwardValue(double x); // compute backward interpolation value ~Interpolation();
private:
// Check(); // checking the inputs
void GetBackwardTable(); // get the backward differential table
private:
int m_num; // the number of interpolation points
double m_x1, m_x2; // the first point m_x1 and last point m_x2
double m_step; // the interpolation step
double* m_func; // the function value of interpolation points
double* m_btable; // the backward differential table
};
#include <iostream>
#include <limits>
using namespace std;
#define NUM 15
//样本个数
#define MIN 4000
//上面输入区间下限
#define MAX 11000
//上面输入区间上限
int main()
{
double func[NUM]=
{
1.38, 1.48, 1.58, 1.69, 1.81,
1.94,
2.10, 2.28, 2.50, 2.76,
3.06, 3.41, 3.83,
4.33, 4.93
};
//输入对应的函数值
double x1=MIN, x2=MAX, x;
int num=NUM;
char flag='Y';
Interpolation test(num, x1, x2, func);
while(flag=='Y')
{
cout<<"Input x: ";
cin>>x;
if (!cin)
{
cin.clear();
cin.ignore(numeric_limits<int>::max(), '\n'); // clear input buffer
continue;
}
if(x<x1 || x>x2)
{
cout<<"---Invalid input: "<<x<<"---"<<endl;
cout<<"Only the number between "<<x1<<" and "<<x2<<" is valid..."<<endl; }
else
{
cout<<"Backward interpolation value:
"<<puteBackwardValue(x)<<endl;
}
cout<<endl<<"Do you want to process? please input(Y/N):"<<endl;
cin>>flag;
}
return 0;
}
Interpolation::Interpolation(int num, double x1, double x2, double func[]) {
m_num = num;
m_x1 = x1;
m_x2 = x2;
m_step = (m_x2-m_x1)/(num-1);
m_func = new double[m_num];
m_btable = new double[m_num];
for (int i=0; i<m_num; ++i)
{
m_func[i] = func[i];
m_btable[i] = func[i];
}
GetBackwardTable();
}
Interpolation::~Interpolation()
{
delete m_func;
delete m_btable;
}
void Interpolation::GetBackwardTable()
{
// get the backward differential table
int i, j;
double tmp;
for (i=1; i<m_num; ++i) {
tmp = m_btable[m_num-1];
for (j=m_num-1; j>=i; --j) {
m_btable[j] = m_btable[j]-m_btable[j-1];
}
m_btable[i-1] = tmp;
}
}
double Interpolation::ComputeBackwardValue(double x)
{
// compute backward interpolation value
double* coef; //coefficient talbe
double result, t;
int i;
coef = new double[m_num];
t = (x-m_x2)/m_step;
for (i=1, coef[0]=1; i<m_num; ++i) //compute the coefficient table {
coef[i] = coef[i-1]*(t+i-1)/i;
}
for (i=0, result=0; i<m_num; ++i)
{
result += m_btable[i]*coef[i];
}
delete coef;
return result;
}
四、算法实现
例1.
在微电机设计计算中需要查磁化曲线表,通常给出的表如图是磁密B每间隔100高斯磁路每厘米长所需安匝数at的值,下面要解决B从4000到11000区间的查表问题
书上给出的可以用后插公式的区间为10500<B≤11000
解:在此谨以10500以上的数为例,首先输入样本个数和所在区间然后逐一输入对应的函数值。
运行结果:
例2.已知f(x)=sinx+1 求任意插值区间的函数值(0≤x≤5)
1,1.02,1.035,1.052,1.07,1.087区间为0-10应用公式求出结果解:分别输入3,1.5查看结果,运行后输入非法数字4555查看结果。
运行结果:。