为了生成拉格朗日插值表达式,我编写了一个函数。你知道吗
所以我得到:
def polinomioLagrange(Xs, Ys, t):
for k in range(len(Xs)):
if k >0:
expresion = expresion + '+' + str(Ys[k]) + '*'
elif k==0:
expresion = expresion + str(Ys[k]) + '*'
expresion = expresion + '('
for i in range(len(Xs)):
if k==i:
continue
expresion = expresion + '(' + '3' + '-' + str(Xs[i]) + ')'
if k != len(Xs)-1 and i!= len(Xs)-1:
expresion=expresion+'*'
expresion = expresion + '/'
for i in range(len(Xs)):
if k==i:
continue
expresion = expresion + '(' + str(Xs[k]) + '-' + str(Xs[i]) + ')'
if i != len(Xs)-1 and k != len(Xs)-1:
expresion=expresion+'*'
print expresion
我调用它,例如:polinomioLagrange([0,1,2,4],[7,0,-1,63],3)
,得到的输出类似于:
7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)(3-1)(3-2)/(4-0)(4-1)(4-2))
可以看出,上学期没有星号:
63*((3-0)(3-1)(3-2)/(4-0)(4-1)(4-2))
那是因为
if k != len(Xs)-1 and i!= len(Xs)-1:
expresion=expresion+'*'
但我真的玩过索引,并没有得到我想要的结果:
7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)*(3-1)*(3-2)/(4-0)*(4-1)*(4-2))
什么样的逻辑条件可以完成这项工作,更重要的是,最简单的方法是什么,使用像join
这样更复杂的python函数来完成这项工作?你知道吗
最近,循环和改变逻辑条件是:
if i != len(Xs)-1:
expresion=expresion+'*'
获取:
7*((3-1)*(3-2)*(3-4)/(0-1)*(0-2)*(0-4))+0*((3-0)*(3-2)*(3-4)/(1-0)*(1-2)*(1-4))+-1*((3-0)*(3-1)*(3-4)/(2-0)*(2-1)*(2-4))+63*((3-0)*(3-1)*(3-2)*/(4-0)*(4-1)*(4-2)*)
几乎正确,除了...)*/(...
和...4-2)*)
为了记录在案,这是我的代码:
我觉得你让这件事变得更难了。与其构建字符串,不如简单地构建符号表达式。我们可以直接实现
l
和L
:然后我们可以得到基函数:
全插值多项式:
我们可以调用函数(这里包装为
lag_fn
):。。当然,插值多项式可以简化很多:
相关问题 更多 >
编程相关推荐