2012-09-03 19 views
5

estoy usando sympy y numpy para resolver el siguiente problema:sympy RuntimeWarning lambdify: valor no válido encontrado en double_scalars

Dado un punto (x0, y0) y una curva y = a * x ** 2 + b * x + c, calcule las distancias mínimas de (x0, y0) a (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') 

Hasta ahora, todo está bien. Incluso puedo obtener algunos resultados:

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

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

Sin embargo, con otro grupo de parámetros, no tengo problemas:

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

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

Creo que esto es un error de lambdify, como puedo hacer lo siguiente:

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

Necesito lambdificar porque necesito calcular un gran número (~ 100K) de computación (vectorizar) a la vez. ¿Alguien puede confirmar que esto es un error de lambdify? Cualquier comentario/sugerencia es bienvenido.

Respuesta

3

me encontré con una pregunta relacionada: negative pow in python

y resolvieron este problema simplemente añadiendo + 0j a una, es decir:

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, estoy de acuerdo con usted. En mi caso, necesito la parte compleja durante el cálculo, incluso espero una solución de números reales. Además, los resutls, p. '(664515.7418921513 + 3.552713678800501e-15j)', debería ser un número real en realidad. Dado que la parte img es muy pequeña, puedo convertirla de manera segura en números reales al descartar la parte img. – stderr

Cuestiones relacionadas