拉格朗日插值
案例
设原函数𝑓(𝑥) = √𝑥。
二次拉格朗日插值
三次拉格朗日插值
四次拉格朗日插值
源代码
import numpy as np
import matplotlib.pyplot as plt
import math
def Lagrange(arr_x, arr_y, _x):
l = [0 for j in range(len(arr_x))]
result = 0
for i in range(0, len(arr_x)):
denominator = 1
molecular = 1
for j in range(0, len(arr_x)):
if i != j:
denominator = denominator * (arr_x[i] - arr_x[j])
molecular = molecular * (_x - arr_x[j])
l[i] = molecular / denominator
result = result + l[i] * arr_y[i]
return result
# sqrt(x)
original_x = np.arange(0, 100)
original_y = [0.0 for j in range(len(original_x))]
for i in range(len(original_x)):
original_y[i] = math.sqrt(original_x[i])
# 插值点(1, 1) (9, 3) (81, 9)
x_arr = [1, 9, 36, 64, 81]
y_arr = [1, 3, 6, 8, 9]
# 估算f(x)的近似值
x = np.arange(0, 100)
y = [0 for j in range(len(x))]
for i in range(len(x)):
y[i] = Lagrange(x_arr, y_arr, x[i])
plt.plot(original_x, original_y, label='f(x) = sqrt(x)', color="black")
plt.plot(x, y, label='p(x)', color="blue")
plt.scatter(x_arr, y_arr, label="The interpolation points", color="red")
plt.title("Lagrange interpolation")
plt.legend(loc="upper left")
plt.xlabel("x")
plt.ylabel("y")
plt.show()