6

次の問題を解決するために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(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のバグだと思います:

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

一度に大量 (~100K) の計算 (ベクトル化) を計算する必要があるため、lambdify が必要です。これがlambdifyのバグであることを確認できる人はいますか? コメント/提案は大歓迎です。

4

1 に答える 1

3

私は1つの関連する質問を見つけました:Pythonの負の捕虜

+ 0jをaに追加するだけで、この問題を解決しました。つまり、次のようになります。

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)]
于 2012-09-03T22:11:32.300 に答える