अजगर सिम्बल प्रतीक

Nov 01 2020

जब मैं प्रतीक के रूप में "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})

जैसा कि आप देख सकते हैं कि मैं "उप" का उपयोग यह जांचने के लिए करता हूं कि उद्देश्य फ़ंक्शन में कोई टाइपो नहीं है।

अद्यतन: मैंने प्रत्येक चर को अलग-अलग सेट करने के लिए "प्रतीक" का उपयोग किया, लेकिन फिर से "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)))

धन्यवाद।

जवाब

5 Marcin Nov 02 2020 at 00:00

समझ गया!

यह सब आपके चरों के वर्णानुक्रम पर निर्भर करता है।

यदि आप अपने पहले उदाहरण के xलिए zऔर इसके zलिए स्थानापन्न करते हैं तो xयह काम करना भी बंद कर देगा।

आंतरिक रूप से हल उस फ़ंक्शन को अभिव्यक्ति भेजता _solveहै sympy.solversजिसमें फिर अपने समीकरण को हल करने की कोशिश करता है और कई बार विफल होता है।

अंत में एक अंतिम प्रयास के रूप में यह क्या करता है यह हल करने की कोशिश करता है -sqrt(a) + qया x - sqrt(z)एक आंतरिक फ़ंक्शन के माध्यम से प्रतीकों को चुनकर _ok_syms, एक तर्क के साथ जो उन वर्णानुक्रम को हल करता है (भले ही इस तर्क के बिना यह अभी भी होगा, लेकिन अगर reversedइसके साथ लिपटे जादुई रूप से आपके उदाहरण काम करते हैं बिल्कुल विपरीत तरीके से)।

और इसलिए इसे हल करता है x - sqrt(z)के रूप में x: sqrt(z)और -sqrt(a) + qके रूप में a: 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