牛顿插值法原理及应用Word格式.docx
《牛顿插值法原理及应用Word格式.docx》由会员分享,可在线阅读,更多相关《牛顿插值法原理及应用Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
Newton插值:
\n请输入要运算的值:
x="
);
scanf("
%f"
&
xx);
请输入插值的次数(n<
11):
n="
%d"
n);
请输入%d组值:
\n"
n+1);
for(i=0;
i<
n+1;
i++)
{
x%d="
i);
x[i]);
y%d="
y[0][i]);
}
for(i=1;
for(j=i;
j<
j++)
if(i>
1)
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);
else
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]);
%f\n"
y[i][i]);
temp=1;
newton=y[0][0];
temp=temp*(xx-x[i-1]);
newton=newton+y[i][i]*temp;
求得的结果为:
N(%.4f)=%9f\n"
xx,newton);
牛顿插值法Matlab程序
functionf=Newton(x,y,x0)
symst;
if(length(x)==length(y))
n=length(x);
c(1:
n)=0.0;
else
disp(&
apos;
x和y的维数不相等!
&
return;
end
f=y
(1);
y1=0;
l
=1;
for(i=1:
n-1)
for(j=i+1:
n)
y1(j)=(y(j)-y(i))/(x(j)-x(i));
end
c(i)=y1(i+1);
l=l*(t-x(i));
f=f+c(i)*l;
simplify(f);
y=y1;
if(i==n-1)
if(nargin==3)
f=subs(f,&
t&
x0);
else
f=collect(f);
%将插值多项式展开
f=vpa(f,6);
end
摘要:
值法利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。
利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
牛顿插值通过求各阶差商,递推得到的一个公式:
f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...xn](x-x0)...(x-xn-1)+Rn(x)
关键词:
牛顿插值法流程图程序实现
一、插值法的由来
在许多实际问题及科学研究中,因素之间往往存在着函数关系,然而,这种关系经常很难有明显的解析表达,通常只是由观察与测试得到一些离散数值。
有时,即使给出了解析表达式,却由于表达式过于复杂,不仅使用不便,而且不易于进行计算与理论分析。
解决这类问题的方法有两种:
一种是插值法,另一种是拟合法。
插值法是一种古老的数学方法,它来自生产实践,早在一千多年前,我国科学家在研究历法上就应用了线性插值与二次插值,但它的基本理论却是在微积分产生之后才逐渐完善的,其应用也日益增多,特别是在计算机软件中,许多库函数,如等的计算实际上归结于它的逼近函数的计算。
逼近函数一般为只含有算术运算的简单函数,如多项式、有理分式(即多项式的商)。
在工程实际问题当中,我们也经常会碰到诸如此类的函数值计算问题。
被计算的函数有时不容易直接计算,如表达式过于复杂或者只能通过某种手段获取该函数在某些点处的函数值信息或者导数值信息等。
因此,我们希望能用一个“简单函数”逼近被计算函数,然后用该简单函数的函数值近似替代被计算函数的函数值。
这种方法就叫插值逼近或者插值法。
逐次线性插值法优点是能够最有效地计算任何给定点的函数值,而不需要写出各步用到的插值多项式的表达式。
但如果解决某个问题时需要插值多项式的表达式,那么,它的这个优点就成了它的缺点了。
能不能根据插值条件构造一个插值多项式,它既有具体的表达式,又很容易用它计算任何点的函数值呢?
牛顿插值法能作到这一点。
二、牛顿插值法的概念
牛顿插值多项式的表达式
设
问题是如何根据插值条件
i=0,1,2
n
来计算待定系数
?
由
知,
。
知
因而
,
其中
称为函数f(x)在
点的一阶商。
知
因而
其中
称为函数f(x)在
点的二阶差商。
实际上,它是一阶差商的差商。
一般地,如果已知一阶差商
那么就可以计算二
阶差商
类似于上述过程不断地推导下去,可得
其中,
分别称为函数f(x)在相应点处的三阶差商,四阶差商和n阶差商。
实际上,
的计算可通过以下简易地构造函数的差商来完成。
.
按上述方式构造插值多项式的方法叫做牛顿插值法。
根据插值多项式的惟一性知,其截断误差与拉格朗日插值法相同,
即:
但也可以表示成差商形式。
这是因为以
为节点的多项式
从而
于是
的截断误差可表为
顺便指出,因为牛顿插值多项式具有性质:
所以,类似于逐次线性插值法,也可以把上述和式中的第二项
看成是估计
的一种实用误差估计式。
与差商概念密切联系的另一个概念是差分,它是指在等距节点上函数值的差。
所谓等距节点,是指对给定的常数h(称为步长),节点
称
为
处的一阶向前差分;
称
处的一阶向后差分;
处的中心差分。
一阶差分的差分称为二阶差分,
即
称为
处的二阶向前差分。
一般地,m阶向前和向后差分可定义如下:
三、牛顿插值法的实现
1、【算法】
步骤1:
输入节点(xj,yj),精度
,计值点xx,f0
p,1
T,1
i;
步骤2:
对k=1,2,……,i依次计算k阶均差
f[xi-k,xi-k+1,…,xi]=(f[xi-k+1,…,xi]-f[xi-k,…,xi])/(xi-xi-k)
步骤3:
(1)、若|f[x1,…,xi]-f[x0,…,xi-1]|<
,则p为最终结果Ni-1(x),余项Ri-1=f[x0,…,xi](xx-xi-1)T。
(2)、否则(xx-xi-1)*T
T,p+f[x0,…,xi]*T
p,转步骤4。
步骤4:
若i<
n,则i+1
i,转步骤2;
否则终止。
2、【流程图】
i+1
i
YES
NO
i
3、【程序清单】#include"
stdio.h"
#definen4//牛顿插值的次数
floata[n+1][n+2]={0},s=0,t=1,x;
inti,j;
请输入xi及yi的值//要求先输入xi再输入yi然后输入下一组\n"
for(j=0;
2;
a[i][j]);
for(j=1;
n+2;
j++)//计算各阶均差
for(i=j;
a[i][j+1]=(a[i][j]-a[i-1][j])/(a[i][0]-a[i-j][0]);
输出xi,yi及各阶均差\n"
{
%6.5f"
a[i][j]);
输出牛顿插值表达式\n"
N%d(x)="
n);
%6.5f"
a[i][i+1]);
i;
(x-%3.2f)"
a[j][0]);
if(i==n)
break;
+"
输入插值点x="
x);
i++)//计算插值点的近似值
t*=(x-a[j][0]);
s+=a[i][i+1]*t;
}printf("
N%d