三次样条插值作业题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)(211123

13

1j j j

j j j j

j j j j j

j j j

j x x h h M y x x h h M y x x h M x x h M x s --

+

--

+

-+

-=

+++++其中,方程中的系数

j

j h M 6,

j

j h M 61+,j

j j j h h M y )6(2-

j

j

j 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) - 1

h(i) = IndVar(i + 1) - IndVar(i); end

% 为向量μ赋值

mu = zeros(1, length(h));

for i = 1 : length(mu) - 1

mu(i) = h(i) / (h(i) + h(i + 1));

end

mu(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 * ( (DepV ar(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;

end

d(i + 1) = 6 *( RightBoun - ( DepVar(i + 1) - DepVar(i) ) / ( IndVar(i + 1) - IndVar(i) ) ) / h(i);

% 为矩阵A赋值

% 将主对角线上的元素全部置为2

A = zeros( length(d), length(d) );

for i = 1 : length(d)

A(i, i) = 2;

end

% 将向量λ的各元素赋给主对角线右侧第一条对角线

for i = 1 : length(d) - 1

A(i, i + 1) = lambda(i);

end

% 将向量d的各元素赋给主对角线左侧第一条对角线

for i = 1 : length(d) - 1

A(i + 1, i) = mu(i);

end

% 求解向量M

M =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');

相关文档
最新文档