拉格朗日插值公式 插值法 简单例子 BIT数值分析5.1+8

题目

代码

# 拉格朗日差值公式

# 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甚至更多项,那么怎么实现差商?多循环?

运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值