2012-09-03 31 views
5

Tôi đang sử dụng sympy và NumPy để giải quyết sau khi vấn đề:sympy lambdify RuntimeWarning: giá trị không hợp lệ gặp phải trong double_scalars

Cho một điểm (x0, y0) và một đường cong y = a * x ** 2 + b * x + c, tính khoảng cách tối thiểu (x0, y0) đến (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') 

Cho đến bây giờ, mọi thứ đều ổn. Tôi thậm chí có thể nhận được một số kết quả:

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

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

Tuy nhiên, với một nhóm các thông số, tôi có vấn đề:

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

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

Tôi nghĩ rằng đây là một lỗi từ lambdify, như tôi có thể làm như sau:

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

Tôi cần lambdify vì tôi cần tính toán số lượng lớn (~ 100K) tính toán (vectorize) cùng một lúc. Bất cứ ai có thể xác nhận đây là một lỗi từ lambdify? Bất kỳ ý kiến ​​/ đề nghị được chào đón.

Trả lời

3

tôi tìm thấy một câu hỏi liên quan: negative pow in python

và giải quyết vấn đề này chỉ đơn giản bằng cách thêm + 0j đến một, đó là:

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, tôi đồng ý với bạn. Trong trường hợp của tôi, tôi cần một phần phức tạp trong quá trình tính toán, thậm chí tôi mong đợi một giải pháp số thực. Ngoài ra, các lần truy cập lại, ví dụ: '(664515.7418921513 + 3.552713678800501e-15j)', phải là một số thực thực sự. Cho rằng phần img là rất nhỏ, tôi có thể chuyển đổi nó một cách an toàn thành số thực bằng cách thả phần img. – stderr

Các vấn đề liên quan