不怎么懂拉格朗日多项式插值,你看看对不对

程序代码:
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[-5,5],ylim=[0,2])
def lagrange(x, y, num_points, x_test):
'''
不太懂拉格朗日多项式插值,网上找到一个函数,不知道对不对
函数网址:https://zhuanlan. :param x:
:param y:
:param num_points:
:param x_test:
:return:
'''
# 所有的基函数值,每个元素代表一个基函数的值
l = np.zeros(shape=(num_points, ))
# 计算第k个基函数的值
for k in range(num_points):
# 乘法时必须先有一个值
# 由于l[k]肯定会被至少乘n次,所以可以取1
l[k] = 1
# 计算第k个基函数中第k_个项(每一项:分子除以分母)
for k_ in range(num_points):
# 这里没搞清楚,书中公式上没有对k=k_时,即分母为0进行说明
# 有些资料上显示k是不等于k_的
if k != k_:
# 基函数需要通过连乘得到
l[k] = l[k]*(x_test-x[k_])/(x[k]-x[k_])
else:
pass
# 计算当前需要预测的x_test对应的y_test值
L = 0
for i in range(num_points):
# 求所有基函数值的和
L += y[i]*l[i]
return L
# 绘制函数图形
fun_x = np.linspace(-5,5,1000)
fun_y = [1/(1+i**2) for i in fun_x]
plt.plot(fun_x,fun_y)
# 当n取不同值的时候,使用不同颜色
color = {2:'red',4:'black',6:'green',8:'yellow',10:'purple'}
for n in [2,4,6,8,10]:
x = []
y = []
# 计算Xk
for k in range(n+1):
xk = -5 + (10 / n) * k
x.append(xk)
# 计算y
for i in x:
y.append(1 / (1+i**2))
# -5到5等距分n+1节点
x_test = list(np.linspace(-5,5,n+1))
y_predict = [lagrange(x,y,len(x),x_i) for x_i in x_test]
plt.scatter(x_test,y_predict,color=color.get(n),marker='+')
plt.show()