牛顿插值多项式的计算步骤如下:
牛顿插值多项式:(x0,f(x0)),(x1,f(x1)),(x2,f(x2)),……,(xn,f(xn))。牛顿插值法相对于拉格朗日插值法具有承袭性的优势,即在增加额外的插值点时,可以利用之前的运算结果以降低运算量。
插值法利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。
如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
1.差商(均差)及其性质 :
2.牛顿基本插值公式:图1.
图2.
3. 差分及其性质。图1:
图2:
4. 牛顿向前向后插值公式。
5. 牛顿插值多项式小结。
优点:计算简单
缺点:和拉格朗日插值方法相同,插值曲线在节点处有尖点,不光滑,节点处不可导。
程序代码如下。希望能帮助到你!
牛顿插值法
#include<stdio.h>
#include<math.h>
#define
n
4
void
difference(float
*x,float
*y,int
n)
{
float
*f
int
k,i
f=(float
*)malloc(n*sizeof(float))
for(k=1k<=nk
)
{
f[0]=y[k]
for(i=0i<ki
)
f[i
1]=(f[i]-y[i])/(x[k]-x[i])
y[k]=f[k]
}
return
}
main()
{
int
i
float
varx=0.895,b
float
x[n
1]={0.4,0.55,0.65,0.8,0.9}
float
y[n
1]={0.41075,0.57815,0.69675,0.88811,1.02652}
difference(x,(float
*
好2处数组下标溢出1、g数组只有N个元素,下标可访问区间为[0 , N-1],下面这个代码相当于访问了g[N]了
for(j=Nj>ij--)
{
g[j]=(g[j]-g[j-1])/(x[j]-x[j-i-1])
}
2、g数组最大不能到达N,当i=N的时候,tmp*g[i]这里会访问溢出
for(i=1i<=Ni++)
{
tmp*=(u-x[i-1])
newton=newton+tmp*g[i]
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)