程序代码:
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()