实验7 代数插值实验(2)
成绩 |
实验类型:●验证性实验 ○综合性实验 ○设计性实验
实验目的:进一步熟练掌握spline(样条)插值算法,提高编程能力和解决插值问题的实践技能。
实验内容:求被插函数f(x)在区间[-1,2]上的三次样条函数S(x),被插函数f(x)和插值函数S(x)的曲线都经过点(-1,-1),(0,0),(1,1)和(2,0),而且一阶导数边界条件S‘(-1)=f‘(-1)=0和S‘(2)=f‘(2)=1
实验原理 若已知N+1个点的及其一阶导数的边界条件和,则存在唯一的三次样条曲线。
设,构造并求解下列线性方程组
其中
依据上述方程组使用追赶法求解,构造分段函数S(x),在每个小区间段上构造三次埃尔米特插值函数。即得三次样条插值函数
实验说明:编程计算并求三次样条插值函数S(x),手工计算并和计算机程序计算的主要中间结果进行比较,验证手工解算和机器解算是否一致。要求将手工解算过程及中间结果写在A4纸上和实验报告一并提交。
实验步骤
1 要求上机实验前先编写出程序代码
2 编辑录入程序
3 调试程序并记录调试过程中出现的问题及修改程序的过程
4 经反复调试后,运行程序并验证程序运行是否正确。
5 记录运行时的输入和输出,以便与手工解算过程及中间结果作比较。
实验报告: 根据实验情况和结果撰写并递交实验报告。
实验总结 (学会了......; 掌握了......; 训练了......; 发现了......; 今后学习中......有待提高。)
程序代码(MATLAB程序)
电子报告word文件命名规则:专业班级-学号后两位-实验X-姓名.doc, 如信息123班学号为201212030315的郭海涛同学实验7报告word文件命名则应是:信息123-15-实验7-郭海涛.doc, 其中 .doc是Word文件扩展名。特别提醒:电子报告文件命名不规范的报告将不予接收。
参考程序(MATLAB程序)
一、程序代码
function S = daishuchazhi(X,Y,dx0,dxn)
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
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
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
plot(X,Y,'ko');
hold on
style = ['r','g','b'];
for k = 1:N
x1 = X(k):0.01:X(k+1);
y1 = polyval(S(k,:),x1 - X(k));
plot(x1,y1,style(k));
hold on
end
二、输出结果:
>> X = [0,1,2,3];
>> Y = [0 0.5 2.0 1.5];
>> dx0 = 0.2;
>> dxn = -1;
>> S = daishuchazhi(X,Y,dx0,dxn)
S =
0.4800 -0.1800 0.2000 0
-1.0400 1.2600 1.2800 0.5000
0.6800 -1.8600 0.6800 2.0000
二、实验总结
通过本次实验,我学会了spline(样条)插值算法和追赶法的基本原理和算法; 掌握了spline插值算法内容;训练了我的把数学问题转化为编程问题的能力;发现了自己在编程方面和思考问题方面的不足; 今后学习中我的编程能力和思考问题的能力有待提高。