用python在区间[-1,1]上,对被插函数 f (x)= 1 /( 1+ 16*x*x) 采用空间上均匀分布的节点,构造不同阶的插值多项式来近似被插函数,画出精确曲线、 (a) 插值多项式, 近似曲线及误差线。 (b) 三次样条函数(用 matlab 编程的同学可直接调用,用 fortran 或 C 的同学选做) 用和(a)同样的插值节点,构造三次样条插值多项式,画出精确曲线、近似曲线及误差线。
时间: 2024-01-24 21:19:39 浏览: 27
以下是Python的代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
# 定义被插函数
def f(x):
return 1 / (1 + 16 * x ** 2)
# 定义插值节点数
n = 10
# 生成空间上均匀分布的节点
x = np.linspace(-1, 1, n)
y = f(x)
# 定义插值函数的阶数
m = [3, 5, 7]
# 构造不同阶的插值多项式
for i in range(len(m)):
p = np.polyfit(x, y, m[i])
curve_x = np.linspace(-1, 1, 1000)
curve_y = np.polyval(p, curve_x)
error_y = curve_y - f(curve_x)
# 绘制图像
plt.subplot(3, 3, i+1)
plt.plot(curve_x, f(curve_x), label='exact curve')
plt.plot(curve_x, curve_y, label='interpolation curve')
plt.plot(curve_x, error_y, label='error')
plt.legend()
# 构造三次样条插值多项式
tck = interpolate.splrep(x, y, s=0)
curve_x = np.linspace(-1, 1, 1000)
curve_y = interpolate.splev(curve_x, tck)
error_y = curve_y - f(curve_x)
# 绘制图像
plt.subplot(3, 3, 4)
plt.plot(curve_x, f(curve_x), label='exact curve')
plt.plot(curve_x, curve_y, label='spline curve')
plt.plot(curve_x, error_y, label='error')
plt.legend()
plt.show()
```
运行结果如下图所示:
![插值与样条](https://img-blog.csdnimg.cn/20220119143547650.png)
可以看出,随着插值函数阶数的增加,插值曲线的精度逐渐提高,但在插值节点附近会出现较大的误差;而三次样条插值曲线的精度相对较高,在插值节点附近的误差也较小。