题目
代码
# 拉格朗日差值公式
# 5.1
# x, y 按顺序一比一输入
xs1 = [1.45, 1.36, 1.14]
ys1 = [3.14, 4.15, 5.65]
# 原函数不一定升序
# xs.sort()
# ys.sort()
def cal3():
x=1.4
Lsum=0
len_xy=len(xs)
for i in range(len_xy):
Lsum += (x-xs[(i-1)%3]) * (x-xs[(i-2)%3]) / ( (xs[i%3]-xs[(i-1)%3]) * (xs[i%3]-xs[(i-2)%3]) ) * ys[i%3]
print(Lsum)
# cal3() # ans = 3.7295242750081474
# 改进思路:如果 4甚至更多项,那么怎么实现每一项?多循环?
# 5.8 反插值的拉格朗日
xs8= [0.45, 0.46, 0.47, 0.48, 0.49, 0.50]
ys8 = [0.4754818, 0.4846555, 0.4937452, 0.5027498, 0.5116683, 0.5204999]
def Lagrange(x, y, g):
print(f" 拉格朗日(x = {xs}, y = {ys}, 参数 = {g}):")
Lsum = 0
lenx = len(x) # n = lenx-1
for i in range(0, lenx):
temp = 1
for j in range(0, lenx):
if( j != i):
temp *= ( g - x[j] ) / ( x[i] - x[j] )
Lsum += temp * y[i]
# 判断计算的是x还是y,反插还是正插
target = ''
if( id(y) == id(ys) ):
target = 'y'
elif( id(y) == id(xs) ):
target = 'x'
print(f" {target}=>{Lsum}")
return Lsum
# 前两个列表参数,x在前求y,y在前求x,也就是第一个求第二个
param = 1.4
xs = xs1
ys = ys1
Lagrange(xs, ys, param)
# 验证5.1结果为3.7295242750081474,正确
param = 0.5
xs = xs8
ys = ys8
Lagrange(ys, xs, param)
# 改进思路:如果 4甚至更多项,那么怎么实现差商?多循环?