Biểu tượng giao hưởng Python
Khi tôi sử dụng "x" và "z" làm ký hiệu, tôi không gặp vấn đề gì với mã này:
from sympy import *
x, z = symbols('x z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
y.subs({x: 5, z: 25})
Nhưng khi tôi sử dụng "q" và "a", giải quyết không cho tôi bất kỳ giải pháp nào.
q, a = symbols('q a')
y = -6*q**2 + 2*q*a**0.5 + 50*q - a
solve((diff(y, q), diff(y, a)))
y.subs({q: 5, a: 25})
Như bạn thấy, tôi sử dụng "subs" để kiểm tra xem không có lỗi đánh máy nào trong hàm mục tiêu.
CẬP NHẬT: Tôi đã sử dụng "Biểu tượng" để đặt từng biến riêng lẻ, nhưng việc sử dụng lại "q" và "a" không hoạt động.
# This works
x = Symbol('x')
z = Symbol('z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
# This does not work
q = Symbol('q')
a = Symbol('a')
y = -6*q**2 + 2*q*a**0.5 + 50*q-a
solve((diff(y, q), diff(y, a)))
Cảm ơn bạn.
Trả lời
Hiểu rồi!
Tất cả phụ thuộc vào thứ tự bảng chữ cái của các biến của bạn.
Nếu bạn thay thế xcho zvà zcho xtrong ví dụ đầu tiên của bạn, nó cũng sẽ ngừng làm việc.
Giải nội bộ gửi biểu thức đến hàm _solvetrong sympy.solversđó sau đó cố gắng giải phương trình của bạn và không thành công nhiều lần.
Cuối cùng như một nỗ lực cuối cùng, những gì nó làm là nó cố gắng giải quyết -sqrt(a) + qhoặc x - sqrt(z)bằng cách chọn các ký hiệu từ nó thông qua một hàm bên trong _ok_syms, với một đối số sắp xếp chúng theo thứ tự bảng chữ cái (ngay cả khi không có đối số này, nó vẫn sẽ làm được, nhưng nếu được bao bọc bằng reversednó một cách kỳ diệu sẽ làm cho các ví dụ của bạn hoạt động theo cách hoàn toàn ngược lại).
Và vì vậy nó giải quyết x - sqrt(z)như x: sqrt(z)và -sqrt(a) + qnhư vậy a: q**2.
Trong khi trong trường hợp đầu tiên, nó kết thúc với một giải pháp dễ dàng 50 - 10*sqrt(z), trong trường hợp thứ hai, nó bị mất -12*q + 2*sqrt(q**2) + 50vì nó không thể đơn giản hóa sqrt(q**2).
nguồn: rất nhiều thử nghiệm trên: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py