我试图使用拉格朗日插值几点.因此,我需要一些配方,例如:
Lx=[1,2,3],
Ly=[1,4,9],
result = x^2
而不是这个我得到“-4.0 * X *( – 0.5 * X – 1.0)*( – 0.2 * X 0.2)*( – 0.142857142857143 * X ……”
当我用例如5代替X(第12行)时,我得到“25”,正确答案.
有谁能够帮我?
import sympy
def Lagrange (Lx, Ly):
X=sympy.symbols('X')
if len(Lx)!= len(Ly):
print "ERROR"
return 1
y=float(0.0)
for k in range ( len(Lx) ):
t=float(1.0)
for j in range ( len(Lx) ):
if j != k:
t=t* ( (X-Lx[j]) / float(Lx[k]-Lx[j]) ) # when I put number, OK
y+= t*Ly[k]
return y
Lx=[-4,-2,0,1,3]
Ly=[16,4,0,1,9]
print Lagrange(Lx,Ly)
最佳答案 这可能是由于浮点数的四舍五入.简化给出:
In [10]: sympy.simplify(Lagrange(Lx,Ly))
Out[10]: X*(1.85037170770859e-17*X**2 + 1.0*X - 1.11022302462516e-16)
这基本上是X ** 2.尝试摆脱那些浮动演员:
def Lagrange (Lx, Ly):
X=sympy.symbols('X')
if len(Lx)!= len(Ly):
print "ERROR"
return 1
y=0
for k in range ( len(Lx) ):
t=1
for j in range ( len(Lx) ):
if j != k:
t=t* ( (X-Lx[j]) /(Lx[k]-Lx[j]) )
y+= t*Ly[k]
return y
给我:
In [30]: Lx=[-4,-2,0,1,3]
In [31]: Ly=[16,4,0,1,9.]
In [32]: print Lagrange(Lx,Ly)
Out[32]: 1.0*X**2