第一型 三次样条插值matlab程序
第一型三次样条插值问题求解
一:解题过程
根据书上关于三次样条的步骤,列出相关的矩阵。
编写追赶法的求解函数,求解矩阵
得到
根据求解结果得到分段函数,画图表示,并求解
利用MATLAB内置三次样条函数求解问题
二:结果以及结果对比
1. (因显示问题,把表格中的精度变小了)
自编程序所得的 中间值
MATLAB内置三次样条 中间值
2.样条图像
自编程序所得的图像
MATLAB内置三次样条 图像
可得,自编程序解得的结果与MATLAB解的结果完全一致。
三:程序通用性分析
程序对于输入点的顺序进行优化,自变量X不需要从小到大进行排序,随机输入以后,程序会自动排序。数据的输入不限点数,自变量之间的间隔也不限。输入数据相对比较自由。
四:程序使用演示、通用性演示
运行文件 yzy.m,即可得到中间值以及三次样条图像
(里面内置了需要输入的数据)
1.按书上数据输入
得到图像
2.颠倒书上数据输入
得到同样的图像
在原有数据上多输入三组数据
根据上面三张图,可以发现,数据量不同、数据顺序不同、数据自变量X间隔不同,都可以得出结果,可以说明程序具有很好的通用性。
附录
yzy.m
A=[10,1,2,3,4,5,6,7,8,9,0,11,13,15;5.8,3.3,4.04,4.7,5.22,5.54,5.78,5.4,5.57,5.7,2.51,6,8,10.3];
A=A'; %转置排序
A=sortrows(A);
nn=size(A,1);
A=A';
f1=0.8;f2=0.2;
n=size(A,2);
M=eye(n);
M=M*2;
N=zeros(n,1);
for i=2:n-1
M(i,i-1)=(A(1,i)-A(1,i-1))/(A(1,i+1)-A(1,i-1));
M(i,i+1)=1-M(i,i-1);
N(i)=6*(((A(2,i+1)-A(2,i))/(A(1,i+1)-A(1,i))-((A(2,i)-A(2,i-1)))/(A(1,i)-A(1,i-1)))/(A(1,i+1)-A(1,i-1)));
end
M(1,2)=1;
M(n,n-1)=1; %M为三次样条 的 矩阵
N(1)=6*(((A(2,2)-A(2,1))/(A(1,2)-A(1,1))-f1));
N(n)=6*(f2-((A(2,n)-A(2,n-1))/(A(1,n)-A(1,n-1))));
NE=zeros(n,n+1); %追赶法
NE(1,1)=M(1,1);
NE(1,n+1)=N(1);
for i=2:n
l=M(i,i-1)/NE(i-1,i-1);
NE(i,i)=M(i,i)-l*M(i-1,i);
NE(i,n+1)=N(i)-l*NE(i-1,n+1);
end
AN=zeros(n,1);
AN(n)=NE(n,n+1)/NE(n,n);
for i=1:n-1
j=n-i;
AN(j)=(NE(j,n+1)-M(j,j+1)*AN(j+1))/NE(j,j);
end
M=AN; %追赶法 结束
S=zeros(n-1,5);
for i=1:n-1;
S(i,1)=A(2,i);
S(i,2)=(A(2,i+1)-A(2,i))/(A(1,i+1)-A(1,i))-(1/3*M(i)+1/6*M(i+1))*(A(1,i+1)-A(1,i));
S(i,3)=1/2*M(i);
S(i,4)=(M(i+1)-M(i))/(6*(A(1,i+1)-A(1,i)));
S(i,5)=S(i,1)+S(i,2)*((A(1,i+1)-A(1,i))/2)+S(i,3)*((A(1,i+1)-A(1,i))/2).^2+S(i,4)*((A(1,i+1)-A(1,i))/2).^3; % 三次样条函数 系数
end
n=size(S,1);
title('三次样条图像');
hold on;
for i=1:n
x=A(1,i):(A(1,i+1)-A(1,i))/100:A(1,i+1);
y=S(i,1)+S(i,2)*(x-A(1,i))+S(i,3)*(x-A(1,i)).^2+S(i,4)*(x-A(1,i)).^3;
plot(x,y);
plot(A(1,i),A(2,i),'o');
end
plot(A(1,n+1),A(2,n+1),'o');
hold off;