สัญลักษณ์ python sympy
เมื่อฉันใช้ "x" และ "z" เป็นสัญลักษณ์ฉันไม่มีปัญหากับรหัสนี้:
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})
แต่เมื่อฉันใช้ "q" และ "a" การแก้ปัญหาไม่ได้ให้คำตอบใด ๆ
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})
อย่างที่คุณเห็นฉันใช้ "subs" เพื่อตรวจสอบว่าไม่มีการพิมพ์ผิดในฟังก์ชันวัตถุประสงค์
อัปเดต: ฉันใช้ "Symbol" เพื่อตั้งค่าตัวแปรแต่ละตัว แต่อีกครั้งโดยใช้ "q" และ "a" ไม่ทำงาน
# 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)))
ขอขอบคุณ.
คำตอบ
รับทราบ!
ทุกอย่างขึ้นอยู่กับลำดับตัวอักษรของตัวแปรของคุณ
หากคุณใช้แทนxสำหรับzและzสำหรับxในตัวอย่างแรกของคุณก็จะหยุดทำงาน
ภายในแก้ปัญหาส่งสำนวนไปยังฟังก์ชัน_solveในsympy.solversซึ่งจากนั้นก็พยายามที่จะแก้สมการของคุณและล้มเหลวหลายครั้ง
ในที่สุดก็เป็นความพยายามครั้งสุดท้ายที่จะพยายามแก้ไข-sqrt(a) + qหรือx - sqrt(z)เลือกสัญลักษณ์จากมันผ่านฟังก์ชันภายใน_ok_symsโดยมีอาร์กิวเมนต์ที่เรียงลำดับตามตัวอักษร (แม้ว่าจะไม่มีอาร์กิวเมนต์นี้ก็ยังคงเป็นเช่นนั้น แต่หากรวมเข้าด้วยreversedกันอย่างน่าอัศจรรย์ทำให้ตัวอย่างของคุณใช้งานได้ ในทางตรงกันข้าม)
และดังนั้นจึงไม่แก้ปัญหาx - sqrt(z)เป็นx: sqrt(z)และเป็น-sqrt(a) + qa: q**2
แม้ว่าในกรณีแรกจะจบลงด้วยการแก้ปัญหาได้อย่างง่ายดาย50 - 10*sqrt(z)แต่ในกรณีที่สองจะหายไป-12*q + 2*sqrt(q**2) + 50เนื่องจากไม่สามารถทำให้ง่ายขึ้นsqrt(q**2)ได้
ที่มา: การทดสอบจำนวนมากเกี่ยวกับ: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py