请帮我写一段 拉格朗日线性插值多项式的python代码
时间: 2023-06-10 08:02:29 浏览: 103
好的,以下是拉格朗日线性插值多项式的Python代码:
```
def lagrange_interpolation(x, y, val):
n = len(x)
result = 0
for i in range(n):
term = y[i]
for j in range(n):
if i != j:
term *= (val - x[j]) / (x[i] - x[j])
result += term
return result
```
其中 x 是已知点的 x 坐标列表,y 是已知点的函数值列表,val 是需要插值的值。该函数返回插值得到的结果。
希望这能帮到您!
相关问题
拉格朗日多项式插值法python
拉格朗日多项式插值法是一种数值分析技术,用于通过给定数据点估算未知函数的值。在Python中,可以利用numpy库中的函数来实现这个算法。以下是基本步骤:
1. 定义数据点:一组已知的x坐标和对应的y坐标,比如(x0, y0), (x1, y1), ..., (xn, yn)。
2. 使用拉格朗日基础多项式公式构建插值多项式。每个基础多项式L_i(x)由第i个数据点的x值和其他所有点的x值之差确定,并乘以其对应的y值作为系数。
3. 插值多项式就是这些基础多项式的线性组合:P(x) = Σ(yi * L_i(x)),其中Σ表示对所有i求和。
4. 使用numpy的linalg.solve()函数,提供一个线性方程组,该方程组基于拉格朗日基底表达式来找到插值多项式的系数。
下面是一个简单的示例代码:
```python
import numpy as np
def lagrange_interpolate(points, x):
# points格式为[(x0, y0), (x1, y1), ...]
lags = [np.prod([(x - xi) / (pj - xi) for xi, pj in zip(points[:i], points[i+1:])]) for i in range(len(points))]
return np.sum([y * l for x, y, l in zip(points, points[:, 1], lags)])
# 示例使用
points = [(0, 0), (1, 1), (2, 4)]
x_to_interpolate = 1.5
interpolated_value = lagrange_interpolate(points, x_to_interpolate)
print(f"插值后的值 at {x_to_interpolate} 是: {interpolated_value}")
2、针对函数,在区间上,取个等距节点,构造拉格朗日插值多项式,并通过作图方式给出及一系列拉格朗日插值多项式,观察Runge现象。 3、在第二题基础上,尝试用分段线性插值来进行逼近,并作图观察逼近效果。
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现象。但是,如果取的节点数过少,仍然会出现较大的误差。
阅读全文