给定一组点(可以是离散点也可以是从某个连续函数上取出的几个点),编写拉格朗日插值或牛顿插值程序,比较插值函数与原函数的图像和误差;
时间: 2024-01-22 09:21:06 浏览: 22
以下是使用拉格朗日插值法的Python代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义拉格朗日插值函数
def lagrange(x, y, t):
n = len(x)
s = 0
for i in range(n):
p = 1
for j in range(n):
if i != j:
p *= (t - x[j]) / (x[i] - x[j])
s += y[i] * p
return s
# 定义原函数
def f(x):
return np.sin(x)
# 定义插值点
x = np.linspace(0, 2*np.pi, 10)
y = f(x)
# 定义插值范围
t = np.linspace(0, 2*np.pi, 100)
# 计算插值函数
s = lagrange(x, y, t)
# 计算误差
err = np.abs(s - f(t))
# 绘制图像
plt.plot(t, f(t), label='Original function')
plt.plot(t, s, label='Interpolation function')
plt.plot(t, err, label='Error')
plt.legend()
plt.show()
```
解释一下代码:
首先定义了一个 `lagrange` 函数,它接受三个参数:插值点的 x 坐标数组、插值点的 y 坐标数组,以及插值范围的 x 坐标数组。这个函数就是拉格朗日插值公式的具体实现。
然后定义了一个原函数 `f`,这里使用了 `numpy` 库的 `sin` 函数。
接着定义了插值点的 x 坐标数组 `x`,这里使用了 `numpy` 库的 `linspace` 函数生成一个等间隔的数组。
然后根据插值点的 x 坐标数组 `x` 和原函数 `f` 计算出插值点的 y 坐标数组 `y`。
再定义了插值范围的 x 坐标数组 `t`,也是使用了 `numpy` 库的 `linspace` 函数生成一个等间隔的数组。
调用 `lagrange` 函数计算出插值函数的 y 坐标数组 `s`。
最后计算误差数组 `err`,用插值函数减去原函数的绝对值得到。
绘制图像时,使用 `matplotlib` 库的 `plot` 函数分别绘制原函数、插值函数和误差,并使用 `legend` 函数添加图例。最后调用 `show` 函数显示图像。
如果想使用牛顿插值法,只需要将 `lagrange` 函数改为牛顿插值公式即可。