想实现:y=cosx(0--8)取均匀的1000份,用三点拉格朗日插值法进行拟合。

import numpy as np
from sympy.abc import x,y
import sympy as sy

y=np.sin(np.linspace(0,8,1000))
x=np.linspace(0,8,1000)
n=3
for a in [y[i:i+n]for i in range (0,len(y),n)]:
input_x=a

for b in [x[i:i+n]for i in range (0,len(x),n)]:
input_y=b

#用于控制输出的有效数字长度
def printM(expr, num_digits):
return expr.xreplace({n.evalf() : round(n, num_digits) for n in expr.atoms(sy.Number)})

#定义拟合的系数 L0, L1, L2
def L0(input_x,x):
l0=(x-input_x[1])/(input_x[0]-input_x[1])*(x-input_x[2])/(input_x[0]-input_x[2])
return l0

def L1(input_x,x):
l1=(x-input_x[0])/(input_x[1]-input_x[0])*(x-input_x[2])/(input_x[1]-input_x[2])
return l1

def L2(input_x,x):
l1=(x-input_x[0])/(input_x[2]-input_x[0])*(x-input_x[1])/(input_x[2]-input_x[1])
return l1
#组合最终的拟合函数
def Lfunc(input_y,input_x,x):
answer=input_y[0]*L0(input_x,x)+input_y[1]*L1(input_x,x)+input_y[2]*L2(input_x,x)
return answer
#输出拟合函数表达式, 调用前面定义的控制有效数字函数
print("最终拟合 表达式为:", printM(sy.simplify(Lfunc(input_x, input_y, x)), 2))

x的范围是0到8