2. 在区间[-1,1]上,对被插函数 构造 (a) 插值多项式, 采用空间上均匀分布的节点,构造不同阶的插值多项式来近似被插函数,画出精确曲线、近似曲线及误差线。 (b) 三次样条函数(用matlab编程的同学可直接调用) 用和(a)同样的插值节点,构造三次样条插值多项式,画出精确曲线、近似曲线及误差线。
时间: 2024-02-09 12:12:05 浏览: 81
(a) 等距节点插值多项式
首先,我们需要定义被插函数 f(x)。在本题中,被插函数为 f(x) = 1/(1+25x^2)。
```matlab
% 定义被插函数
f = @(x) 1./(1+25*x.^2);
```
接下来,我们采用空间上均匀分布的节点进行插值计算。假设节点个数为 n+1,则节点位置为:
```matlab
% 节点个数
n = 10;
% 等距节点位置
x = linspace(-1, 1, n+1);
```
下面编写一个函数,用于计算 n 阶插值多项式。这里采用 Lagrange 插值多项式的形式来计算:
```matlab
function y = lagrange_interp(x, y, xi, n)
% x: 节点位置
% y: 节点处的函数值
% xi: 插值节点位置
% n: 插值多项式阶数
% 计算插值多项式
L = ones(length(xi), n+1);
for j = 1:n+1
for k = 1:n+1
if j ~= k
L(:,j) = L(:,j) .* (xi-x(k)) / (x(j)-x(k));
end
end
end
y = L * y(:);
end
```
使用上述函数计算不同阶数的插值多项式,并画出精确曲线、近似曲线及误差线:
```matlab
% 计算精确曲线
xx = linspace(-1, 1, 1000);
yy = f(xx);
% 计算插值多项式
yy_interp_1 = lagrange_interp(x, f(x), xx, 1);
yy_interp_2 = lagrange_interp(x, f(x), xx, 2);
yy_interp_3 = lagrange_interp(x, f(x), xx, 3);
yy_interp_4 = lagrange_interp(x, f(x), xx, 4);
% 绘制图像
figure;
plot(xx, yy, '-', xx, yy_interp_1, '--', xx, yy_interp_2, '--', xx, yy_interp_3, '--', xx, yy_interp_4, '--');
legend('精确曲线', '一次插值', '二次插值', '三次插值', '四次插值');
title('等距节点插值多项式');
xlabel('x'); ylabel('y');
% 计算误差
err_1 = f(xx) - yy_interp_1;
err_2 = f(xx) - yy_interp_2;
err_3 = f(xx) - yy_interp_3;
err_4 = f(xx) - yy_interp_4;
% 绘制误差图像
figure;
plot(xx, err_1, '--', xx, err_2, '--', xx, err_3, '--', xx, err_4, '--');
legend('一次插值误差', '二次插值误差', '三次插值误差', '四次插值误差');
title('等距节点插值多项式误差');
xlabel('x'); ylabel('误差');
```
(b) 三次样条函数
使用 Matlab 自带的 spline 函数进行计算。同样采用空间上均匀分布的节点,节点个数为 n+1。
```matlab
% 计算插值多项式
yy_spline = spline(x, f(x), xx);
% 绘制图像
figure;
plot(xx, yy, '-', xx, yy_spline, '--');
legend('精确曲线', '三次样条插值');
title('三次样条插值');
xlabel('x'); ylabel('y');
% 计算误差
err_spline = f(xx) - yy_spline;
% 绘制误差图像
figure;
plot(xx, err_spline, '--');
legend('误差');
title('三次样条插值误差');
xlabel('x'); ylabel('误差');
```
阅读全文