插值法是利用函数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)。
目
录
· 1插值函数
· 2程序设计
· C程序
· Matlab程序
1插值函数
插值函数的概念及相关性质[1]
定义:设连续函数y-f(x)在区间[a,b]上有定义,已知在n+1个互异的点x0,x1,…xn上取值分别为y0,y1,…yn(设a≤x1≤x2……≤xn≤b)。若在函数类中存在以简单函数P(x),使得P(xi)=yi,则称P(x) 为f(x)的插值函数.
称x1,x2,…xn 为插值节点,称[a,b]为插值区间。
定理:n次代数插值问题的解存在且唯一。
2程序设计
牛顿插值法C程序
void main()
{
floatx[11],y[11][11],xx,temp,newton;
int i,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<n+1;i++)
{ printf("x%d=",i);
scanf("%f",&x[i]);
printf("y%d=",i);
scanf("%f",&y[0][i]);
}
for(i=1;i<n+1;i++)
for(j=i;j<n+1;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]);
printf("%f\n",y[i][i]);
}
temp=1;newton=y[0][0];
for(i=1;i<n+1;i++)
{ temp=temp*(xx-x[i-1]);
newton=newton+y[i][i]*temp;
}
printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);
牛顿插值法Matlab程序
function f = Newton(x,y,x0)
syms t;
if(length(x) == length(y))
n =length(x);
c(1:n) = 0.0;
else
disp('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
end