2012-09-03 13 views
5

double_scalarsに遭遇した無効な値:sympy lambdifyのRuntimeWarning:私は次のような問題解決するためにsympyとnumpyのを使用しています

与えられた点(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(664515.9375, 3998106.0, 0.053674994761459802, -71340.561832823907, 23709057427.266102) 

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

私は次の操作を行うことができますように、これはlambdifyからバグだと思う:

パラメータの別のグループ、私は問題を抱えていると、しかし

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

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

:私もいくつかの結果を得ることができます

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

私は1つの関連する質問が見つかりました: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、私はあなたと同意します。私の場合は、計算中に複雑な部分が必要です。実数型の解も期待しています。さらに、resutls、例えば。 '(664515.7418921513 + 3.552713678800501e-15j)'は実際には実数でなければなりません。 imgの部分が非常に小さいと仮定すると、imgの部分を削除することで、その部分を安全に実数に変換できます。 – stderr

関連する問題