牛顿插值法原理及应用.docx
《牛顿插值法原理及应用.docx》由会员分享,可在线阅读,更多相关《牛顿插值法原理及应用.docx(12页珍藏版)》请在冰豆网上搜索。
牛顿插值法原理及应用
牛顿插值法
U也u.5U.E-UJBEUYT11
插值法是利用函数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)。
插值函数
插值函数的概念及相关性质⑴定义:
设连续函数y-f(x)在区间[a,b]上有定义,已知在n+1个互异的点
x0,x1,…xn上取值分别为y0,y1,…yn(设a若在函数类中存在以简单函数P(x),使得P(xi)=yi,则称P(x)为f(x)的插值函数.称x1,x2,…xn为插值节点,称[a,b]为插值区间。
定理:
n次代数插值问题的解存在且唯一。
牛顿插值法C程序
|祕年・“
■
RHI屯予耳
■4・JT屮m
程序框图#include
voidmain()
{
floatx[11],y[11][11],xx,temp,newton;
inti,j,n;
printf("Newton插值:
\n请输入要运算的值:
x=");
scanf("%f",&xx);
printf("请输入插值的次数(n<11):
n=");
scanf("%d",&n);
printf("请输入%d组值:
\n",n+1);
for(i=0;i{printf("x%d=",i);
scanf("%f",&x[i]);
printf("y%d=",i);
scanf("%f",&y[0][i]);
«仪腿B
①sa)
OOH(匚Lo
_(x)llo)u①-Hu
((A)£6U2hh(x)£6u①一)七
】siuAs(oxsx)uoweNH4uoloua性胆qe_13ww迴B犀宀
CLlu①&=二A+uog①uHuog①u
二L.'vxxhdlu晋dlu2〉
(+土=+uv~U_)」O4
xo=omhuow①匚LHdlu9宀
a巨A-=uv&=)主」d
WL-qx-mxMD-mL'M-nKL'MHmuM
①SO5
a-=x
-mxgD-mL'M-nKL'MHnKM
(LAW7
(++rL+uvrHD」04
(+土=+uv~U_)」O4
宀
報仪旺u
disp('x和y的维数不相等!
');
return;
end
f=y(i);
y1=0;
l=1;
for(i=1:
n-1)
for(j=i+1:
n)
yi(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=yi;
if(i==n-1)
if(nargin==3)
f=subs(f,'t',xO);
else
f=collect(f);
将插值多项式展开
f=vpa(f,6);
end
end
牛顿插值法
摘要:
值法利用函数f(X)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。
如果这特定函数是多项式,就称它为插值多项式。
利用插值基函数很容易得到拉格朗日插值多项式,公式
结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很
不方便的,为了克服这一缺点,提出了牛顿插值。
牛顿插值通过求各阶差商,递推得到的一个公式:
f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+・・・f[xO,・・・xn](x-x0)…(x-xn-1)+Rn(x)
关键词:
牛顿插值法流程图程序实现
一、插值法的由来
在许多实际问题及科学研究中,因素之间往往存在着函数关系,然而,这种关系经常很难有明显的解析表达,通常只是由观察与测试
得到一些离散数值。
有时,即使给出了解析表达式,却由于表达式过于复杂,不仅使用不便,而且不易于进行计算与理论分析。
解决这类问题的方法有两种:
一种是插值法,另一种是拟合法。
插值法是一种古老的数学方法,它来自生产实践,早在一千多年前,我国科学家在
研究历法上就应用了线性插值与二次插值,但它的基本理论却是在微积分产生之后才逐渐完善的,其应用也日益增多,特别是在计算机软件中,许多库函数,如等的计算实际上归结于它的逼近函数的计算。
逼近函数一般为只含有算术运算的简单函数,如多项式、有理分式(即多项式的商)。
在工程实际问题当中,我们也经常会碰到诸如此类的函数值计算问题。
被计算的函数有时不容易直接计算,如表达式过于复杂或者只能通过某种手段获取该函数在某些点处的函数值信息或者导数值信息等。
因此,我们希望能用一个“简单函数”逼近被计算函数,然后用该简单函数的函数值近似替代被计算函数的函数值。
这
种方法就叫插值逼近或者插值法。
逐次线性插值法优点是能够最有效地计算任何给定点的函数值,而不需要写出各步用到的插值多项式的表达式。
但如果解决某个问题时需要插值多项式的表达式,那么,它的这个优点就成了它的缺点了。
能不能根据插值条件构造一个插值多项式,它既有具体的表达式,又很容易用它计算任何点的函数值呢?
牛顿插值法能作到这一点。
二、牛顿插值法的概念
牛顿插值多项式的表达式
设
N/0G(XX)C2(XxXxX)G(XxXxX(X
问题是如何根据插值条件
Nnx",i=o,i,2n
来计算待定系数Go,Ci,C2…O?
由
知,
Nn(Xo)=y。
二f(Xo)
c。
=y。
二f(x。
)。
由
知
Nn(Xl)=y广f(Xl)
因而
CoCi(xiX0)=yi
廿yc-jKx。
)fX°,xJ
Xi一X。
Xi一Xo
其中fX0,X」称为函数f(x)在X0,x1点的一阶商
CoCi(Xi一X。
)C2(X2一Xo)(X2_Xi)=y2
由
知
因而
_y2_y°_gw?
X。
)
2(X2-X0)(X2-X1)
『2%%y。
-%,为映X。
)
(X2X0)(X2X1)
y^y_f[xo,xi](xi—x。
)—f[xo,xi](x2—x。
)
(X2X0)(X2X1)
(X2X。
)
f[Xi,X2]—f[Xo,Xi][]
()[X。
,Xi,X2]
(X2一X。
)
其中flxvXiy』称为函数f(X)在X°,Xi,X2点的二阶差商。
实际上,它是一阶差商的差商。
一般地,如果已知一阶差商f[Xi-,Xi],f[Xi,Xii],
那么就可以计算二
阶差商
f[Xi"Xi,Xi]
_f[Xi,Xi」-f[Xi-i,Xi]
X1—Xi」
类似于上述过程不断地推导下去,可得
cbJkwxLMxx2]f[
(X3—X。
)
XoXX2,X3]
(X4一X。
)
Xo,Xi,X2,X3,X4]
f[Xl,X<'Xn]一f[X。
,Xi,X2'''Xn』Arr】
(Xn—X。
)
C41--。
12—flXzXiXXn]
其中,
f[Xo,Xi,X2,X』,f[Xo,Xi,X2,X3,X4],f[Xo,Xi,X2,X3,X4,X5],分别称为函数
f(x)在相应点处的三阶差商,四阶差商和n阶差商。
实际上,
C0C,C2Cn的计算可通过以下简易地构造函数的差商来完成。
X。
f(X。
)p
X1
f(X1)
f[Xo,X1^C1
X2
f(X2)
f[X1,X2]
f[X0,X1,X2]=C2
X3
f(X3)
f[X2,X3]
f[X1,X2,X3]
f[X0,X1,X2,X3]=C3
X4
f(X4)
f[X3,X4]
f[X2,X3,X4]
f[X1,X2,X3,X4]
f[X0,X1,X2,X3,X4]=C4
.
.
.
.
.
.
按上述方式构造插值多项式的方法叫做牛顿插值法。
根据插值多项式
的惟一性知,其截断误差与拉格朗日插值法相同,
即:
1「⑴十)芦
Rn=(n■1)!
f()nni(x)
但也可以表示成差商形式。
这是因为以lx。
/*'''Xn为节点的多项式
Nn1(X)二Nn(X)f[Xo,XlXnJ二n1(X)
从而f(Xn1)"Nn'1(Xn"=Nn(X"1)f[X。
,XiX"二n1(Xn1)
于是Nn(x)的截断误差可表为
Rn(x)=f[Xo'Xl,Xn1,X匸nl(x)
顺便指出,因为牛顿插值多项式具有性质:
Nn(X)二Nn」(X)f[X0,XXn](X一X)(X一(X一刘J
所以,类似于逐次线性插值法,也可以把上述和式中的第二项
f[Xo,X与差商概念密切联系的另一个概念是差分,它是指在等距节点上函数
值的差。
所谓等距节点,是指对给定的常数h(称为步长),节点X*ih,(i=0,1,2''n)称f(Xi』-f(XiWAfk为x处的一阶向前差分;
称f(Xi)-f(Xi」)人fi
为X处的一阶向后差分;
称f(Xi+%)-f(Xi1%Zfi
为x处的中心差分。
一阶差分的差分称为二阶差分,
称为x处的二阶向前差分
般地,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,…,刈-f[x0,…,xi-1]|<,则p为最终结果Ni-1(x),
余项Ri-1=f[x0,…,xi](xx-xi-1)T。
(2)、否则(xx-xi-1)*T7,p+f[x0,…,xi]*T5,转步骤4。
步骤4:
若ii,转步骤2;否则终止。
2、【流程图】
NO
qk—
了gk
J
k
\/CQ
YEs
q(xx-Xn-i)*T>R
STOP2
3、【程序清单】#include"stdio.h"
#definen4〃牛顿插值的次数
voidmain()
{
floata[n+1][n+2]={0},s=0,t=1,x;
inti,j;
printf("请输入xi及yi的值//要求先输入xi再输入yi然后输入下一组
\n");
for(i=0;ifor(j=0;j<2;j++)
scanf("%f",&a[i][j]);
for(j=1;jfor(i=j;ia[i][j+1]=(a[i][j]-a[i-1][j])/(a[i][O]-a[i-j][O]);
printf(”输出xi,yi及各阶均差\n");
for(i=0;i{
for(j=0;jprintf("%6.5f",a[i][j]);
printf("\n");
}
printf("输出牛顿插值表达式\n");
printf("N%d(x)二",n);
for(i=0;i{
printf("%6.5f",a[i][i+1]);
for(j=0;j
printf("(x-%3.2f)",a[j][0]);
if(i=二n)
break;
printf("+");
}
printf("\n");
printf(”输入插值点x=");
seanf("%f",&x);
for(i=0;i{
for(j=0;j
}printf("N%d(%4.3f)=%6.5f\n",n,x,s);}
4.【程序实现】
帝xJS—乜|悩"血Si—小人|・》
B.4&3.41075
a.550.5781S
0,650.69675
0,800,88811
W.PB1.Q2652
愉岀小必及各阶均差
N4(x>=0.41075+1.11600*0.28bW0P.65>+0.03132
轨人插值点x=0-5?
t
M<0.596>=0,6299#
Pfi&ssanykeytocontinue
参考文献:
RichardL.Burden,J.DouglasFaires,NumericalAnalysis
(SeventhEdition),BrooksPub.Co.,2001.
2.
1998.
2001.
蔡大用,白峰杉.高等数值分析.清华大学出版社,北京,
3.邓建中,刘之行.计算方法(第二版).西安交通大学出版社,
4.韩旭里.数值分析.中南大学出版社,2003.
致谢
本文得以顺利完成,非常感谢我的指导教师。
从论文的选题直到论文的
最终完成,他都给予我尽心尽力的指导。
老师严谨的治学态度深深地影响着我,对我今后的学习,工作,生活必将产生影响。
借此机会,特向老师表示最诚挚的感谢。
感谢南昌工程学院理学系的所有领导和老师。
他们严谨的学风,渊博的知识,诲人不倦的品格一直感染和激励着我不断上进,使我大学四年的时光充实而有意义,“自强不息,格物致知”,在这里我所学到的一切,必将使我受益终生。
在本论文的写作中,我也参照了大量的著作和文章,许多学者的科研成果及写作思路给了我很大的启发,在此向这些学者们表示由衷的感谢,感谢我的家人,同学,朋友对我的大力支持,他们的无私奉献,关爱和支持使我能够继续去追求自己的人生理想和目标。
感谢所有关心,帮助和支持我的人。