三次样条插值 实验_数值计算实验7 代数插值实验(2)

实验旨在深入理解并实现三次样条插值,通过MATLAB编程解决插值问题,验证算法正确性。实验内容包括求解特定条件下的三次样条函数,对比手工解算与机器解算的一致性。
摘要由CSDN通过智能技术生成

实验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个点的9b2d3688f18f0f3b2e4c5d86ff68f7fc.png及其一阶导数的边界条件58c5a01d20c92df9581abfd99a796d29.pngff07e59fe2a0417d283386144bcab342.png,则存在唯一的三次样条曲线。

e3c23572425dbea0fe4417a7f23aed47.png,构造并求解下列线性方程组

5483c7c36b87a96bb4225dd17d54d292.png

其中e4d6f93593fd3df1d8276804dba0a02f.png

依据上述方程组使用追赶法求解6a38ff2cb127f344653bea0f6f2e0e94.png,构造分段函数S(x),在每个小区间段4e14870b60b5eefbe7bc1cd71226daa4.png上构造三次埃尔米特插值函数。即得三次样条插值函数

实验说明:编程计算并求三次样条插值函数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

e4a3c4214d2a297d1c574a67e02615e3.png

二、实验总结

通过本次实验,我学会了spline(样条)插值算法和追赶法的基本原理和算法; 掌握了spline插值算法内容;训练了我的把数学问题转化为编程问题的能力;发现了自己在编程方面和思考问题方面的不足; 今后学习中我的编程能力和思考问题的能力有待提高。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值