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.
@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