三次样条插值课后题集
第三章 插值法 三次样条插值

问题
分段低次插值
在处理实际问题时,总是希望将所得到的数据点用得越多越好。
最简单的方法是用直线将函数值点直接连接。
分段低次插值
基本思想:用分段低次多项式来代替单个多项式。
具体作法:(1) 把整个插值区间分割成多个小区间;
(2) 在每个小区间上作低次插值多项式;
(3) 将所有插值多项式拼接整一个多项式。
优点:公式简单、运算量小、稳定性好、收敛性…
缺点:节点处的导数不连续,失去原函数的光滑性。
三次样条函数
样条函数
由一些按照某种光滑条件分段拼接起来的多项式组成的函数。
最常用的样条函数为三次样条函数,即由三次多项式组成,满足处处有二阶连续导数。
定义设节点a =x 0< x 1 < …< x n -1 < x n =b ,若函数
在每个小区间[x i , x i +1 ]上是三次多项式,则称其为三次样条函数。
如果同时满足s (x i ) = f (x i ) (i = 0, 1, 2, …, n ),则称s (x ) 为f (x ) 在[a , b ]上的三次样条函数。
],[)(2b a C x s ∈
利用线性插值公式,即可得的表达式:
求导得:
即:
:第一类边界条件(缺省边界条件)。
练习题三 插值法

用Lagrange插值法求三次插值多项式,并给出函数 插值法求三次插值多项式, 插值法求三次插值多项式 的近似值。 在 x = 4.011的近似值。 2.对第1题所给的数据,计算差商表, 2.对第1题所给的数据,计算差商表,用Newton 对第 插值法求三次插值多项式, 插值法求三次插值多项式,并给出函数在 x = 4.011的近 似值。 似值。
(4)用 的近似值, (4)用3次样条插值求 f ( x ) 在 x = 0.425的近似值, 并与准确值作比较; 并与准确值作比较; 取值如下, 5. 已知函数 f ( x )取值如下,试求
x f (x) 0 .25 0 .5000 0 . 30 0 .5477 0 . 39 0 .6245 0 .45 0 .6708 0 .53 0 .7280
对第1题所给的数据计算差商表用newton插值法求三次插值多项式并给出函数在对函数在区间选取不同个数的等距插值节点用分段线性插值代替次插值函数观察插值节点增多时误差的变化情况
练习题
1. 给定数据
x y
4.0002 0.6020817 4.0104 0.6031877 4.0233 0.6045824 4.0294 0.6052404
1 − 3. 对函数 2 在区间 [−4,4] 选取不同个数的等 1+ x 距插值节点, 次插值函数, 距插值节点,用分段线性插值代替 n 次插值函数,观
察插值节点增多时误差的变化情况。 察插值节点增多时误差的变化情况。 4. 给出 f ( x ) = sin x 在 xk = 0.1k , k = 0,1,L,10 的函 数值 f ( xk ) = yk 。 (1)用9次Lagrange插值多项式求 f ( x ) 在 x = 0.425 (1)用 插值多项式求 的近似值,并与准确值作比较; 的近似值,并与准确值作比较; (2)用 (2)用9次Newton插值多项式计算 f ( x ) 在 x = 0.425 插值多项式计算 的近似值,并与准确值作比较; 的近似值,并与准确值作比较; (3)用分段线性插值求 的近似值, (3)用分段线性插值求 f ( x ) 在 x = 0.425的近似值, 并与准确值作比较; 并与准确值作比较;
matlab三次样条插值例题解析

文章标题:深度解析Matlab三次样条插值1. 前言在数学和工程领域中,插值是一种常见的数值分析技术,它可以用来估计不连续数据点之间的值。
而三次样条插值作为一种常用的插值方法,在Matlab中有着广泛的应用。
本文将从简单到复杂,由浅入深地解析Matlab中的三次样条插值方法,以便读者更深入地理解这一技术。
2. 三次样条插值概述三次样条插值是一种利用分段三次多项式对数据点进行插值的方法。
在Matlab中,可以使用spline函数来进行三次样条插值。
该函数需要输入数据点的x和y坐标,然后可以根据需要进行插值操作。
3. 三次样条插值的基本原理在进行三次样条插值时,首先需要对数据点进行分段处理,然后在每个分段上构造出一个三次多项式函数。
这些多项式函数需要满足一定的插值条件,如在数据点处函数值相等、一阶导数相等等。
通过这些条件,可以得到一个关于数据点的插值函数。
4. Matlab中的三次样条插值实现在Matlab中,可以使用spline函数来进行三次样条插值。
通过传入数据点的x和y坐标,可以得到一个关于x的插值函数。
spline函数也支持在已知插值函数上进行插值点的求值,这为用户提供了极大的灵活性。
5. 三次样条插值的适用范围和局限性虽然三次样条插值在许多情况下都能够得到较好的插值效果,但也存在一些局限性。
在数据点分布不均匀或有较大噪音的情况下,三次样条插值可能会出现较大的误差。
在实际应用中,需要根据具体情况选择合适的插值方法。
6. 个人观点和总结通过对Matlab中三次样条插值的深度解析,我深刻地理解了这一插值方法的原理和实现方式。
在实际工程应用中,我会根据数据点的情况选择合适的插值方法,以确保得到准确且可靠的结果。
我也意识到插值方法的局限性,这为我在实际工作中的决策提供了重要的参考。
通过以上深度解析,相信读者已经对Matlab中的三次样条插值有了更加全面、深刻和灵活的理解。
在实际应用中,希望读者能够根据具体情况选择合适的插值方法,以提高工作效率和准确性。
中南大学matlab课后习题(1)

%用循环结构实现
a=0;
for i=1:n
a=a+1/(i^2);
end
disp(a);
j=1:n;
%用 sum 函数实现
b=sum(1./(j.^2)); 输入一个数:34
b=
(2)( )( )( ) (
) (= )
clear n=input('输入一个数:'); a=1; for i=1:n a=((2*i*i*2)/((2*i-1)*(2*i+1)))*a; end disp(a); 输入一个数:8
1/5 1/6 1/7 1/8
1/5
1/6
1/7
1/8
1/9
P=pascal(5)
P= 1 1 1 1 1
1
1
1
1
2
3
4
5
3
6
10
15
4
10
20
35
5
15
35
70
Hh=det(H)
Hh = 1/0000
Hp=det(P)
Hp = 1
Th=cond(H)
Th = 476607
Tp=cond(P)
Tp = 178868/21 P 矩阵性能更好,因为 Tp 更接近 1. 5.已知 A,求 A 的特征值及特征向量,并分析其数学意义。 A=[-29,6,18;20,5,12;-8,8,5]
min=a(i); end end max min 请输入二十个数[ 3 4 6 5 3 44 5 5 5 6 6 5 5 4 3 32 2 2 2 6]
max =
44
min =
2
4.
,当 a 取、、、…、、、时,求各点的函数值。要求分别用顺序结
三次样条插值算法详解知识讲解

mn
Mn
18
稍加整理得
2m0m13y1h0y0h20M0 g0 m n12m n3ynh n y 1n1hn 21M n gn
联合基本方程组得一个n+1阶三对角方程组, 化成矩阵形式为:仍然是严格对角占优
2 1
1
2
1
m0 m1
g0 g1
2 2 2
3 2
m 2 g2
x [ x i,x i 1 ]h i, x i 1 x i,i 0 , 1 , ,n 1
( x ) ( 2 x 1 )x ( 1 ) 2 ,1 ( x ) x ( x 1 ) 2 12
对Si(x)求二阶,导 并数 整理后得
Si(x)6(xix hii3 12x)(yi1yi) 6 x 2 x h ii2 4 x i 1m i6 x 4 x h ii2 2 x i 1m i 1
3
(1)因为s(x)在每个小区间上是一个次小于三次的多 项式,故有四个未知系数; (2)因为s(x)有n分段,从而共有4n个未知系数! (3)但插值条件与样条条件仅给出4n-2个条件,无法 定出4n个未知系数,还差2个条件!这2个条件我们用 边界条件给出!
4
通常我们对插值多项式在两端点的状态加以要求也就是 所谓的边界条件:
6
第三类又称周期边界条件: 由区间端点处的函数值或导数值满足周期条件给出
s3 (x0 0) s3 (xn 0)
s3
(
x0
0)
s3 ( xn
0)
s3(x0 0) s3(xn 0)
这样三次样条插 值问题就分成三 类!其实不止这
三类!
7
样条函数的例子
容易验证: (11x326x215x)15 0x1
计算方法大作业1 克服Runge现象

x3
x2
x
1
S1 ( x)
-0.34685
0.2086
0.073964
0.038462
S2 (x)
S (xi 0 ) S x(i 0 )
S
'
(xi
0) S
xi' (
0 )i
S
'
'
x(i
0)S
xi' ' (
0)
1 ,n2, . . . , 1
(1)
这里共有了 3n-3 个条件,再加上条件(2)中的 n+1 个插值条件,共有 4n-2 个条件,
因此还需要 2 个方程才能确定 S (x) .通常可在区间[a, b]的端点 a x0,b xn 上各加一个边
dn1
1
2
Mn
dn
(6)
2 1
2
2
2
1 M1 d1
M2
d2
n 1
2
n
1
M
n
1
dn1
n
n 2 M n dn
由式(1)内点拼接条件,可得
i M i1 2M i i M i1 d j i 1, 2,..., n 1
(3) (4)
其中
i
hi 1 hi1
, hi
i
hi hi 1
三次样条插值作业题

例1 设)(x f 为定义在[0,3]上的函数,有下列函数值表:且2.0)('0=x f ,1)('3-=x f ,试求区间[0,3]上满足上述条件的三次样条插值函数)(x s本算法求解出的三次样条插值函数将写成三弯矩方程的形式:)()6()()6()(6)(6)(211123131j j jj j j jj j j j jj j jj x x h h M y x x h h M y x x h M x x h M x s --+--+-+-=+++++其中,方程中的系数jj h M 6,jj h M 61+,jj j j h h M y )6(2-,jjj j h h M y )6(211++-将由Matlab代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。
以下为Matlab 代码:%============================= % 本段代码解决作业题的例1 %============================= clear all clc% 自变量x 与因变量y ,两个边界条件的取值 IndVar = [0, 1, 2, 3]; DepVar = [0, 0.5, 2, 1.5];LeftBoun = 0.2;RightBoun = -1;% 区间长度向量,其各元素为自变量各段的长度h = zeros(1, length(IndVar) - 1);for i = 1 : length(IndVar) - 1h(i) = IndVar(i + 1) - IndVar(i);end% 为向量μ赋值mu = zeros(1, length(h));for i = 1 : length(mu) - 1mu(i) = h(i) / (h(i) + h(i + 1));endmu(i + 1) = 1;% 为向量λ赋值lambda = zeros(1, length(h));lambda(1) = 1;for i = 2 : length(lambda)lambda(i) = h(i) / (h(i - 1) + h(i)); end% 为向量d赋值d = zeros(1, length(h) + 1);d(1) = 6 * ( (DepVar(2) - DepVar(1) ) / ( IndVar(2) - IndVar(1) ) - LeftBoun) / h(1); for i = 2 : length(h)a = ( DepVar(i) - DepVar(i - 1) ) / ( IndVar(i) - IndVar(i - 1) );b = ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) );c = (b - a) / ( IndVar(i + 1) - IndVar(i - 1) );d(i) = 6 * c;endd(i + 1) = 6 *( RightBoun - ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) ) ) / h(i);% 为矩阵A赋值% 将主对角线上的元素全部置为2A = zeros( length(d), length(d) );for i = 1 : length(d)A(i, i) = 2;end% 将向量λ的各元素赋给主对角线右侧第一条对角线for i = 1 : length(d) - 1A(i, i + 1) = lambda(i);end% 将向量d的各元素赋给主对角线左侧第一条对角线for i = 1 : length(d) - 1A(i + 1, i) = mu(i);end% 求解向量MM =A \ d';% 求解每一段曲线的函数表达式for i = 1 : length(h)Coefs_1 = M(i) / (6 * h(i));Part_1 = conv( Coefs_1, ...conv( [-1, IndVar(i + 1)], ...conv( [-1, IndVar(i + 1)], [-1, IndVar(i + 1)] ) ) ); S_1 = polyval (Part_1, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_2 = M(i + 1)/(6 * h(i));Part_2 = conv( Coefs_2, ...conv( [1, -IndVar(i)], ...conv( [1, -IndVar(i)], [1, -IndVar(i)] ) ) );S_2 = polyval (Part_2, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_3 = (DepVar(i) - M(i) * h(i)^2 / 6) / h(i);Part_3 = conv(Coefs_3, [-1, IndVar(i + 1)]);S_3 = polyval (Part_3, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_4 = (DepVar(i + 1) - M(i + 1) * h(i)^2 / 6) / h(i);Part_4 = conv(Coefs_4, [1, -IndVar(i)]);S_4 = polyval (Part_4, [IndVar(i) : 0.01 : IndVar(i + 1)]);S = S_1 + S_2 + S_3 + S_4;plot ([IndVar(i) : 0.01 : IndVar(i + 1)], S, 'LineWidth', 1.25)% 在样条插值曲线的相应位置标注该段曲线的函数表达式text(i - 1, polyval(Part_1, 3), ...['\itS', num2str(i), '(x)=', num2str(Coefs_1), '(', num2str( IndVar(i + 1) ), '-x)^{3}+', ...num2str(Coefs_2), '(x-', num2str( IndVar(i) ), ')^{3}+', num2str(Coefs_3), ...'(', num2str( IndVar(i + 1) ), '-x)+', num2str(Coefs_4), '(x-',num2str( IndVar(i) ), ')'], ...'FontName', 'Times New Roman', 'FontSize', 14)hold onend% 过x=1和x=2两个横轴点作垂线 %line([1, 1], [2.5, -0.5], 'LineStyle', '--');line([2, 2], [2.5, -0.5], 'LineStyle', '--');% 为x轴和y轴添加标注xlabel( '\itx', 'FontName', 'Times New Roman', ...'FontSize', 14, 'FontWeight', 'bold');ylabel( '\its(x)', 'FontName', 'Times New Roman', ...'Rotation', 0, 'FontSize', 14, 'FontWeight', 'bold');最终,三次样条插值函数s(x)表达式为:[][][]⎪⎩⎪⎨⎧∈-+-+-+--∈-+-+---∈+-++--=.3,2,)2(44.1)3(62.2)2(06.0)3(62.0,2,1,)1(62.2)2(08.0)1(62.0)2(42.0,1,0,08.0)1(06.042.0)1(06.0)(333333x x x x x x x x x x x x x x x x s曲线的图像如图所示:例2 已知函数值表:试求在区间[1,5]上满足上述函数表所给出的插值条件的三次自然样条插值函数)(x s本算法求解出的三次样条插值函数将写成三弯矩方程的形式:)()6()()6()(6)(6)(211123131j j jj j j jj j j j jj j jj x x h h M y x x h h M y x x h M x x h M x s --+--+-+-=+++++其中,方程中的系数jj h M 6,jj h M 61+,jj j j h h M y )6(2-,jjj j h h M y )6(211++-将由Matlab代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。
科学计算实习题二 三次样条插值

for(i=0;i<12;i++){ for(k=1;k<19;k++){
if((X[i]>x[k-1])&&(X[i]<x[k]))
S[i]=M[k-1]/(6*h[k])*pow(x[k]-X[i],3)+M[k]/(6*h[k])*pow(X[i]-x[k-1],3)+(y[k-1]-M[k-1]/ 6*pow(h[k],2))*(x[k]-X[i])/h[k]+(y[k]-M[k]/6*pow(h[k],2))*(X[i]-x[k-1])/h[k];
} 3、 利用解三对角线方程组的追赶法解出在结处的二阶导数值,这一过程程序代码如
下 bt[0]=1.0/2; for(i=1;i<=17;i++){ bt[i]=v[i]/(2-u[i]*bt[i-1]); } f[0]=g[0]*1.0/2; for(i=1;i<=18;i++){ f[i]=(g[i]-u[i]*f[i-1])/(2-u[i]*bt[i-1]); } M[18]=f[18]; for(i=17;i>=0;i--){ M[i]=f[i]-bt[i]*M[i+1];
的值。 2、 按照课本第 92 页的公式(4.44)计算确定 M 的线性方程组的系数数组 u、v、g,
并储存在相应的数组中。这一过程程序代码为 for(i=1;i<19;i++){ h[i]=x[i]-x[i-1]; } for(i=1;i<18;i++){ u[i]=h[i]/(h[i]+h[i+1]); v[i]=1-u[i]; } g[0]=6/h[1]*((y[1]-y[0])/h[1]-y0); g[18]=6/h[18]*(y18-(y[18]-y[17])); for(i=1;i<18;i++){ g[i]=6/(h[i]+h[i+1])*((y[i+1]-y[i])/h[i+1]-(y[i]-y[i-1])/h[i]);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1 设)(x f 为定义在[0,3]上的函数,有下列函数值表:且2.0)('0=x f ,1)('3-=x f ,试求区间[0,3]上满足上述条件的三次样条插值函数)(x s本算法求解出的三次样条插值函数将写成三弯矩方程的形式:)()6()()6()(6)(6)(211123131j j jj j j j j j j j jj j jj x x h h M y x x h h M y x x h M x x h M x s --+--+-+-=+++++其中,方程中的系数jj h M 6,jj h M 61+,jj j j h h M y )6(2-,jjj j h h M y )6(211++-将由Matlab代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。
以下为Matlab 代码:%============================= % 本段代码解决作业题的例1%============================= clear all clc% 自变量x 与因变量y ,两个边界条件的取值 IndVar = [0, 1, 2, 3]; DepVar = [0, 0.5, 2, 1.5];LeftBoun = 0.2;RightBoun = -1;% 区间长度向量,其各元素为自变量各段的长度h = zeros(1, length(IndVar) - 1);for i = 1 : length(IndVar) - 1h(i) = IndVar(i + 1) - IndVar(i);end% 为向量μ赋值mu = zeros(1, length(h));for i = 1 : length(mu) - 1mu(i) = h(i) / (h(i) + h(i + 1));endmu(i + 1) = 1;% 为向量λ赋值lambda = zeros(1, length(h));lambda(1) = 1;for i = 2 : length(lambda)lambda(i) = h(i) / (h(i - 1) + h(i));% 为向量d赋值d = zeros(1, length(h) + 1);d(1) = 6 * ( (DepVar(2) - DepVar(1) ) / ( IndVar(2) - IndVar(1) ) - LeftBoun) / h(1); for i = 2 : length(h)a = ( DepVar(i) - DepVar(i - 1) ) / ( IndVar(i) - IndVar(i - 1) );b = ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) );c = (b - a) / ( IndVar(i + 1) - IndVar(i - 1) );d(i) = 6 * c;endd(i + 1) = 6 *( RightBoun - ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) ) ) / h(i);% 为矩阵A赋值% 将主对角线上的元素全部置为2A = zeros( length(d), length(d) );for i = 1 : length(d)A(i, i) = 2;end% 将向量λ的各元素赋给主对角线右侧第一条对角线for i = 1 : length(d) - 1A(i, i + 1) = lambda(i);end% 将向量d的各元素赋给主对角线左侧第一条对角线for i = 1 : length(d) - 1A(i + 1, i) = mu(i);end% 求解向量MM =A \ d';% 求解每一段曲线的函数表达式for i = 1 : length(h)Coefs_1 = M(i) / (6 * h(i));Part_1 = conv( Coefs_1, ...conv( [-1, IndVar(i + 1)], ...conv( [-1, IndVar(i + 1)], [-1, IndVar(i + 1)] ) ) );S_1 = polyval (Part_1, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_2 = M(i + 1)/(6 * h(i));Part_2 = conv( Coefs_2, ...conv( [1, -IndVar(i)], ...conv( [1, -IndVar(i)], [1, -IndVar(i)] ) ) );S_2 = polyval (Part_2, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_3 = (DepVar(i) - M(i) * h(i)^2 / 6) / h(i);Part_3 = conv(Coefs_3, [-1, IndVar(i + 1)]);S_3 = polyval (Part_3, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_4 = (DepVar(i + 1) - M(i + 1) * h(i)^2 / 6) / h(i);Part_4 = conv(Coefs_4, [1, -IndVar(i)]);S_4 = polyval (Part_4, [IndVar(i) : 0.01 : IndVar(i + 1)]);S = S_1 + S_2 + S_3 + S_4;plot ([IndVar(i) : 0.01 : IndVar(i + 1)], S, 'LineWidth', 1.25)% 在样条插值曲线的相应位置标注该段曲线的函数表达式text(i - 1, polyval(Part_1, 3), ...['\itS', num2str(i), '(x)=', num2str(Coefs_1), '(', num2str( IndVar(i + 1) ),'-x)^{3}+', ...num2str(Coefs_2), '(x-', num2str( IndVar(i) ), ')^{3}+', num2str(Coefs_3), ...'(', num2str( IndVar(i + 1) ), '-x)+', num2str(Coefs_4), '(x-', num2str( IndVar(i) ), ')'], ...'FontName', 'Times New Roman', 'FontSize', 14) hold on end% 过x=1和x=2两个横轴点作垂线 % line([1, 1], [2.5, -0.5], 'LineStyle', '--'); line([2, 2], [2.5, -0.5], 'LineStyle', '--');% 为x 轴和y 轴添加标注xlabel( '\itx', 'FontName', 'Times New Roman', ... 'FontSize', 14, 'FontWeight', 'bold');ylabel( '\its(x)', 'FontName', 'Times New Roman', ...'Rotation', 0, 'FontSize', 14, 'FontWeight', 'bold');最终,三次样条插值函数s(x)表达式为:[][][]⎪⎩⎪⎨⎧∈-+-+-+--∈-+-+---∈+-++--=.3,2,)2(44.1)3(62.2)2(06.0)3(62.0,2,1,)1(62.2)2(08.0)1(62.0)2(42.0,1,0,08.0)1(06.042.0)1(06.0)(333333x x x x x x x x x x x x x x x x s曲线的图像如图所示:例2 已知函数值表:试求在区间[1,5]上满足上述函数表所给出的插值条件的三次自然样条插值函数)(x s本算法求解出的三次样条插值函数将写成三弯矩方程的形式:)()6()()6()(6)(6)(211123131j j jj j j j j j j j jj j jj x x h h M y x x h h M y x x h M x x h M x s --+--+-+-=+++++其中,方程中的系数jj h M 6,jj h M 61+,jj j j h h M y )6(2-,jjj j h h M y )6(211++-将由Matlab代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。
以下为Matlab 代码:%============================= % 本段代码解决作业题的例2%============================= clear all clc% 自变量x 与因变量y 的取值 IndVar = [1, 2, 4, 5]; DepVar = [1, 3, 4, 2];% 区间长度向量,其各元素为自变量各段的长度h = zeros(1, length(IndVar) - 1);for i = 1 : length(IndVar) - 1h(i) = IndVar(i + 1) - IndVar(i);end% 为向量μ赋值mu = zeros(1, length(h));for i = 1 : length(mu) - 1mu(i) = h(i) / (h(i) + h(i + 1));endmu(i + 1) = 0;% 为向量λ赋值lambda = zeros(1, length(h));lambda(1) = 0;for i = 2 : length(lambda)lambda(i) = h(i) / (h(i - 1) + h(i));end% 为向量d赋值d = zeros(1, length(h) + 1);d(1) = 0;for i = 2 : length(h)a = ( DepVar(i) - DepVar(i - 1) ) / ( IndVar(i) - IndVar(i - 1) );b = ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) );c = (b - a) / ( IndVar(i + 1) - IndVar(i - 1) );d(i) = 6 * c;endd(i + 1) = 0;% 为矩阵A赋值% 将主对角线上的元素全部置为2A = zeros( length(d), length(d) );for i = 1 : length(d)A(i, i) = 2;end% 将向量λ的各元素赋给主对角线右侧第一条对角线for i = 1 : length(d) - 1A(i, i + 1) = lambda(i);end% 将向量d的各元素赋给主对角线左侧第一条对角线for i = 1 : length(d) - 1A(i + 1, i) = mu(i);end% 求解向量MM =A \ d';% 求解每一段曲线的函数表达式for i = 1 : length(h)Coefs_1 = M(i) / (6 * h(i));Part_1 = conv( Coefs_1, ...conv( [-1, IndVar(i + 1)], ...conv( [-1, IndVar(i + 1)], [-1, IndVar(i + 1)] ) ) );S_1 = polyval (Part_1, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_2 = M(i + 1)/(6 * h(i));Part_2 = conv( Coefs_2, ...conv( [1, -IndVar(i)], ...conv( [1, -IndVar(i)], [1, -IndVar(i)] ) ) );S_2 = polyval (Part_2, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_3 = (DepVar(i) - M(i) * h(i)^2 / 6) / h(i);Part_3 = conv(Coefs_3, [-1, IndVar(i + 1)]);S_3 = polyval (Part_3, [IndVar(i) : 0.01 : IndVar(i + 1)]);Coefs_4 = (DepVar(i + 1) - M(i + 1) * h(i)^2 / 6) / h(i);Part_4 = conv(Coefs_4, [1, -IndVar(i)]);S_4 = polyval (Part_4, [IndVar(i) : 0.01 : IndVar(i + 1)]);S = S_1 + S_2 + S_3 + S_4;plot ([IndVar(i) : 0.01 : IndVar(i + 1)], S, 'LineWidth', 1.25)% 在样条插值曲线的相应位置标注该段曲线的函数表达式text(i, polyval(Part_1, 5), ...['\itS', num2str(i), '(x)=', num2str(Coefs_1), '(', num2str( IndVar(i + 1) ),'-x)^{3}+', ...num2str(Coefs_2), '(x-', num2str( IndVar(i) ), ')^{3}+', num2str(Coefs_3), ...'(', num2str( IndVar(i + 1) ), '-x)+', num2str(Coefs_4), '(x-', num2str( IndVar(i) ), ')'], ...'FontName', 'Times New Roman', 'FontSize', 14)hold onend% 过x=2和x=4两个横轴点作垂线 % line([2, 2], [4.5, 0.5], 'LineStyle', '--'); line([4, 4], [4.5, 0.5], 'LineStyle', '--');% 为x 轴和y 轴添加标注xlabel( '\itx', 'FontName', 'Times New Roman', ... 'FontSize', 14, 'FontWeight', 'bold');ylabel( '\its(x)', 'FontName', 'Times New Roman', ...'Rotation', 0, 'FontSize', 14, 'FontWeight', 'bold');最终,三次自然样条插值函数s(x)表达式为:[][][]⎪⎩⎪⎨⎧∈-+-+--∈-+-+----∈-+-+--=.5,4,)4(2)5(375.4)5(375.0,4,2,)2(75.2)4(75.1)2(1875.0)4(0625.0,2,1,)1(125.3)2()1(125.0)(3333x x x x x x x x x x x x x x s曲线的图像如图所示:[][][][]⎪⎪⎩⎪⎪⎨⎧∈-+-+--∈-+-+----∈-+-+----∈-+-+--=.53.0,45.0,)45.0(1.9)53.0(3987.8)53.0(1442.2,45.0,39.0,)39.0(1903.11)45.0(417.10)39.0(859.2)45.0(399.2,39.0,30.0,)3.0(9518.6)39.0(1137.6)3.0(5993.1)39.0(4806.3,30.0,25.0,)25.0(9697.10)3.0(10)25.0(2652.6)(333333x x x x x x x x x x x x x x x x x x x s试求在区间[0.25,0.53]上满足上述函数表所给出的插值条件的三次自然样条插值函数s(x)求解出的三次样条插值函数将写成三弯矩方程的形式:)()6()()6()(6)(6)(211123131j jjj j j jj j j j jj j jj x x h h M y x x h h M y x x h M x x h M x s --+--+-+-=+++++本题采用和例2基本相同的Matlab 代码,只改变初始条件。