多项式插值和次样条插值.doc
文本预览下载声明
已知某产品从1900年到2010年每隔10年的产量,用多项式插值和三次样条插值的方法,画出每隔一年的插值曲线的图形, 试计算并比较在不同方法下的2005年以及2015年的产量。
年份
1900
1910
1920
1930
1940
1950
产量
75.995
91.972
105.711
123.203
131.699
150.697
年份
1960
1970
1980
1990
2000
2010
产量
179.323
203.212
226.505
251.525
291.854
325.433
思想算法:多项式插值采用牛顿多项式插值法,该算法可以克服多项式插值和拉格朗日插值法的缺点,即:当用已知的n+1个数据点求出插值多项式后,又获得了新的数据点,要用它连同原有的n+1个数据点一起求出插值多项式,从原已计算出的n次插值多项式计算出新的n+1次插值多项式是很困难的,必须全部重新计算。而牛顿插值法可以克服这一缺点。
三次样条插值不仅在节点增多使子区间减少时,误差随之减少,也使曲线具有足够的光滑性。
Matlab程序如下
程序一:牛顿插值法
源程序名称Newton.m
clear all;
x=0:10:110;
y=[75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,251.525,291.854,325.433];
n=length(x);syms t;
for k=2:n
for i=n:-1:k
y(i)=(y(i)-y(i-1))/(x(i)-x(i-k+1));
end;
end;
N=y(1);
for i=2:n
W=1;
for j=1:(i-1)
W=W*(t-x(j));
end;
N=N+y(i)*W;
end;
N=expand(N);
ezplot(N,[0,120]);
hold on;
format short;
Q=[];
for i=0:120
Q(i+1)=subs(N,t,i);
end;
T=0:120;
plot(T,Q,^);
title(产量随时间变化曲线);
xlabel(T/时间);
ylabel(Q/产量);
N105=subs(N,t,105);
N115=subs(N,t,115);
程序二:三次样条插值
源程序名称SPLINEM.m
clear all;
x=0:10:110;
y=[75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,251.525,291.854,325.433];
n=length(x);syms t;
for i=1:n
p(i)=y(i);
end;
for k=2:3
for i=n:-1:k
p(i)=(p(i)-p(i-1))/(x(i)-x(i+1-k));
end;
end;
h(2)=x(2)-x(1);
for i=2:(n-1)
h(i+1)=x(i+1)-x(i);
c(i)=h(i+1)/(h(i)+h(i+1));
a(i)=1-c(i);
b(i)=2;
p(i)=6*p(i+1);
end;
p(1)=0;p(n)=0;c(1)=0;b(1)=2;b(n)=2;a(n)=0;
u(1)=b(1);z(1)=p(1);
for k=2:n
l(k)=a(k)/u(k-1);u(k)=b(k)-l(k)*c(k-1);
z(k)=p(k)-l(k)*z(k-1);
end;
M(n)=z(n)/u(n);
for k=(n-1):-1:1
M(k)=(z(k)-c(k)*M(k+1))/u(k);
end;
for i=2:n
S(i)=M(i-1)*(x(i)-t)^3/(6*h(i))+M(i)*(t-x(i-1))^3/(6*h(i))+(y(i-1)-M(i-1)*h(i)^2/6)*(x(i)-t)/h(i)+(y(i)-M(i)*h(i)^2/6)*(t-x(
显示全部