2、针对函数,在区间上,取个等距节点,构造拉格朗日插值多项式,并通过作图方式给出及一系列拉格朗日插值多项式,观察Runge现象。 3、在第二题基础上,尝试用分段线性插值来进行逼近,并作图观察逼近效果。
时间: 2024-05-19 11:11:19 浏览: 84
拉格朗日函数(lagrange.m)用于观察高次插值的龙格现象
5星 · 资源好评率100%
2、假设函数为$f(x)=\frac{1}{1+x^2}$,在区间$[-5,5]$上取$n$个等距节点,构造拉格朗日插值多项式。
代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义函数
def f(x):
return 1 / (1 + x ** 2)
# 定义拉格朗日插值多项式
def Lagrange(x, y, u):
n = len(x)
result = 0
for i in range(n):
temp = y[i]
for j in range(n):
if j != i:
temp *= (u - x[j]) / (x[i] - x[j])
result += temp
return result
# 取等距节点
n = 10
x = np.linspace(-5, 5, n)
y = f(x)
# 构造插值多项式
u = np.linspace(-5, 5, 1000)
L = Lagrange(x, y, u)
# 绘制函数图像和插值多项式图像
plt.plot(u, f(u), label="f(x)")
plt.plot(u, L, label="Lagrange")
plt.scatter(x, y, color="red")
plt.legend()
plt.show()
```
结果:
![image-20211102163301821](https://i.loli.net/2021/11/02/8L7WU6b9oNcq3J1.png)
从图中可以看出,当节点数增多时,插值多项式在两侧的误差越来越大,这就是Runge现象。
3、在第二题基础上,尝试用分段线性插值来进行逼近,并作图观察逼近效果。
代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义函数
def f(x):
return 1 / (1 + x ** 2)
# 定义分段线性插值函数
def Linear(x, y, u):
n = len(x)
if u < x[0]:
return y[0]
elif u > x[n-1]:
return y[n-1]
else:
for i in range(n-1):
if u >= x[i] and u <= x[i+1]:
return y[i] + (y[i+1] - y[i]) * (u - x[i]) / (x[i+1] - x[i])
# 取等距节点
n = 10
x = np.linspace(-5, 5, n)
y = f(x)
# 构造插值函数
u = np.linspace(-5, 5, 1000)
L = [Linear(x, y, i) for i in u]
# 绘制函数图像和插值多项式图像
plt.plot(u, f(u), label="f(x)")
plt.plot(u, L, label="Linear")
plt.scatter(x, y, color="red")
plt.legend()
plt.show()
```
结果:
![image-20211102163355682](https://i.loli.net/2021/11/02/wnxK6ZfRzahvJpU.png)
从图中可以看出,分段线性插值对于这个函数的逼近效果相对较好,没有出现Runge现象。但是,如果取的节点数过少,仍然会出现较大的误差。
阅读全文