三次样条插值代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 三次样条插值程序 三次样条插值利用方案二(求解固支样条或压紧样条)
按照要求要起点和终点的一阶导数值已知, 可得关于01,,.....,n M M M 的严格对角占优势的三对角方程组
然后利用三对角法(追赶法)解此线性方程组。
(1)编写M 文件,并保存文件名scfit.m
% x,y 分别为n 个节点的横坐标和纵坐标值组成的向量
% dx0和dxn 分别为S 的导数在x0和xn 处的值,即m 0和m n
n=length(x)-1;
h=diff(x);
d=diff(y)./h;
a=h(2:n-1);
b=2*(h(1:n-1)+h(2:n));
c=h(2:n);
u=6*diff(d);
b(1)=b(1)-h(1)/2;
u(1)=u(1)-3*(d(1)-dx0);
b(n-1)=b(n-1)-h(n)/2;
u(n-1)=u(n-1)-3*(dxn-d(n));
%追赶法部分
for k=2:n-1
temp=a(k-1)/b(k-1);
b(k)=b(k)-temp*c(k-1);
u(k)=u(k)-temp*u(k-1);
end
m(n)=u(n-1)/b(n-1);
for k=n-2:-1:1
m(k+1)=(u(k)-c(k)*m(k+2))/b(k);
end
%求S K1,S K2,S K3,S K4
m(1)=3*(d(1)-dx0)/h(1)-m(2)/2;
m(n+1)=3*(dxn-d(n))/h(n)-m(n)/2;
for k=0:n-1
00
()S x m '=()n n S x m '=0011111111212212n n n n n n M d M d M d M d μλμλ----⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦
S(k+1,1)=(m(k+2)-m(k+1))/(6*h(k+1));
S(k+1,2)=m(k+1)/2;
S(k+1,3)=d(k+1)-h(k+1)*(2*m(k+1)+m(k+2))/6;
S(k+1,4)=y(k+1);
End
P=mkpp(x,S);
ppval(P,x);
plot(x,y ,'-*')
(或fnplt(P))
(2)在Command window 内输入已知条件(课本数值试验一后例子,令x0和xn 处一阶导数为0)
>> x=[1 2 3 4 5 6 7 8 9 10];
>> y=[3.56 2.56 1.54 0.53 0.26 0.90 1.81 2.12 1.53 0.56];
>> dx0=0;dxn=0;
调用编写的M 文件
>> S=scfit(x,y ,dx0,dxn)
回车
计算结果:
S =
0.7390 -1.7390 0 3.5600
-0.2369 0.4780 -1.2610 2.5600
0.2387 -0.2328 -1.0159 1.5400
0.0120 0.4834 -0.7654 0.5300
-0.1167 0.5193 0.2373 0.2600
-0.1853 0.1693 0.9260 0.9000
-0.0122 -0.3865 0.7088 1.8100
-0.0658 -0.4232 -0.1010 2.1200
0.7953 -0.6205 -1.1447 1.5300
即插值结果为
.().()().,[,]
.().().().,[,]()........................
.().().().,[,]32232322073901173901013561202369204780212610225623079539062059114479153910x x x x x x x x s x x x x x ⎧---+-+∈⎪--+---+∈⎪=⎨
⎪⎪-----+∈⎩
第一个图是利用ppval(P,x);plot(x,y)显示的图形,图中*为数据点 第二个图是利用fnplt(P)显示的图形