用matlab 在区间[-1,1]上,对被插函数 f (x)= 1/(1 + 16*x*2x)采用空间上均匀分布的节点,构造不同阶的插值多项式来近似被插函数,画出精确曲线、 (a) 插值多项式, 近似曲线及误差线。 (b) 三次样条函数,用和(a)同样的插值节点,构造三次样条插值多项式,画出精确曲线、近似曲线及误差线。
时间: 2024-01-24 21:18:53 浏览: 68
MinF_函数最小值_matlab_mudi1k_数学优化_
首先定义被插函数 $f(x)$:
```matlab
f = @(x) 1 ./ (1 + 16 .* x .^ 2);
```
接下来定义插值节点的个数,以及在区间 [-1,1] 上均匀分布的插值节点:
```matlab
n = 20; % 插值节点个数
xi = linspace(-1, 1, n); % 在区间 [-1,1] 上均匀分布的插值节点
```
然后计算被插函数在插值节点处的函数值:
```matlab
fi = f(xi); % 被插函数在插值节点处的函数值
```
接下来分别构造一次、三次、五次插值多项式,并计算在区间 [-1,1] 上的近似函数值:
```matlab
% 一次插值多项式
p1 = polyfit(xi, fi, 1);
y1 = polyval(p1, x);
% 三次插值多项式
p3 = polyfit(xi, fi, 3);
y3 = polyval(p3, x);
% 五次插值多项式
p5 = polyfit(xi, fi, 5);
y5 = polyval(p5, x);
```
然后计算三次样条插值多项式,并计算在区间 [-1,1] 上的近似函数值:
```matlab
% 三次样条插值多项式
s = spline(xi, [0, fi, 0]); % 在两端点处增加一个零值,以满足边界条件
ys = ppval(s, x); % 在区间 [-1,1] 上的近似函数值
```
最后,计算精确曲线、插值多项式、三次样条插值多项式以及误差线,并进行可视化:
```matlab
% 精确曲线
y_exact = f(x);
% 误差线
e1 = abs(y_exact - y1);
e3 = abs(y_exact - y3);
e5 = abs(y_exact - y5);
es = abs(y_exact - ys);
% 可视化
figure;
plot(x, y_exact, 'k-', 'LineWidth', 2);
hold on;
plot(x, y1, 'r--', 'LineWidth', 1.5);
plot(x, y3, 'g--', 'LineWidth', 1.5);
plot(x, y5, 'b--', 'LineWidth', 1.5);
plot(x, ys, 'm--', 'LineWidth', 1.5);
plot(x, e1, 'r-.', 'LineWidth', 1);
plot(x, e3, 'g-.', 'LineWidth', 1);
plot(x, e5, 'b-.', 'LineWidth', 1);
plot(x, es, 'm-.', 'LineWidth', 1);
legend('精确曲线', '一次插值多项式', '三次插值多项式', '五次插值多项式', '三次样条插值多项式', '一次插值误差', '三次插值误差', '五次插值误差', '三次样条插值误差', 'Location', 'Best');
title('插值近似及误差曲线');
xlabel('x'); ylabel('y');
grid on;
```
运行上述代码,可以得到如下图所示的插值近似及误差曲线:
![插值近似及误差曲线](https://img-blog.csdn.net/20180523171806909?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NvY2lhbF9oZWxwZXJz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
阅读全文