2012-09-03 37 views
5

我使用sympy和numpy的解決以下問題遇到無效值:sympy lambdify RuntimeWarning:在double_scalars

給定一個點(X0,Y0)和曲線Y = A * X ** 2 + B * x + c,計算(x0,y0)到(x,y)的最小距離。

from sympy.core.symbol import symbols 
from sympy.solvers.solvers import solve 
from sympy.utilities.lambdify import lambdify 

x, y = symbols('x y')  
a,b,c, x0, y0 = symbols('a b c x0 y0') 
y = a*x**2 + b*x + c 
dist2 = (x-x0)**2 + (y-y0)**2 
sol = solve(dist2.diff(x), x) 
dist2_diff_solve = lambdify((x0,y0,a,b,c), solve(dist2.diff(x),x), modules='numpy') 

到現在爲止,每件事情都很好。我甚至可以得到一些結果:

dist2_diff_solve(1, 1, 1, 1, 1) 

[0.31718264650678707, (-0.9085913232533936-0.8665105933073626j),  
(-0.9085913232533936+0.8665105933073626j)] 

然而,與另一組的參數,我有問題:

dist2_diff_solve(664515.9375, 3998106.0, 0.053674994761459802, -71340.561832823907, 23709057427.266102) 

*** ValueError: negative number cannot be raised to a fractional power 

我覺得這是從lambdify一個bug,我可以做到以下幾點:

sol[0].evalf(subs={x0:664515.9375, y0:3998106.0, a:0.053674994761459802, b:-71340.561832823907, c:23709057427.266102}) 
664515.759983973 + .0e-19*I 

我需要lambdify,因爲我需要在同一時間來計算的計算(矢量化)的大量(〜100K)。任何人都可以證實這是來自lambdify的錯誤?歡迎任何意見/建議。

回答

3

我找到了一個相關的問題:negative pow in python

,並簡單地通過增加+ 0J的解決了這個問題,那就是:

dist2_diff_solve(664515.9375+0j, 3998106.0, 0.053674994761459802, -71340.561832823907, 23709057427.266102) 

[(664515.7418921513+3.552713678800501e-15j), (664600.9266076663+5.329070518200751e-15j), (664564.8069210749-1.4210854715202004e-14j)] 
+0

@asmeurer,我同意你的看法。在我的情況下,我需要計算過程中的複雜部分,即使我期望一個實數解。另外,例如, '(664515.7418921513 + 3.552713678800501e-15j)',實際上應該是一個實數。鑑於img部分非常小,我可以放心地將img部分轉換爲實數。 – stderr