बहुपद में मैट्रिक्स को प्रतिस्थापित करते समय समस्याएं
उदाहरण: चलो
M = Matrix([[1,2],[3,4]]) # and
p = Poly(x**3 + x + 1) # then
p.subs(x,M).expand()
त्रुटि देता है:
TypeError: <class'sympy.matrices.immutable.ImmutableDenseMatrix '> और <class' sympy.core.numbers.One '> नहीं जोड़ सकता
जो कि पहले दो शब्दों के परिपक्व होने के बाद से बहुत प्रशंसनीय है, लेकिन अंतिम शब्द (स्थिर शब्द) एक मैट्रिक्स नहीं है, बल्कि एक स्केलर है। इस स्थिति को दूर करने के लिए मैंने बहुपद को बदल दिया
p = Poly(x**3 + x + x**0) # then
वही त्रुटि बनी रहती है। क्या मैं एम द्वारा एक्स की जगह, हाथ से अभिव्यक्ति टाइप करने के लिए बाध्य हूं? इस उदाहरण में बहुपद में केवल तीन पद हैं, लेकिन वास्तव में मैं (बहुव्रीहि बहुपद) के साथ दर्जनों शब्दों का सामना करता हूं।
जवाब
इसलिए मुझे लगता है कि प्रश्न मुख्य रूप से मैट्रिक्स बहुपद की अवधारणा के आसपास घूम रहा है :
(जहां P एक बहुपद है, और A एक मैट्रिक्स है)
मुझे लगता है कि यह कह रहा है कि मुक्त शब्द एक संख्या है, और इसे बाकी के साथ नहीं जोड़ा जा सकता है जो कि एक मैट्रिक्स है, प्रभावी रूप से अतिरिक्त संचालन उन दो प्रकारों के बीच अपरिभाषित है।
TypeError: <class'sympy.matrices.immutable.ImmutableDenseMatrix '> और <class' sympy.core.numbers.One '> नहीं जोड़ सकता
हालांकि, यह एक फ़ंक्शन को परिभाषित करके दरकिनार किया जा सकता है जो एक विशिष्ट मैट्रिक्स के लिए मैट्रिक्स बहुपद का मूल्यांकन करता है। यहाँ अंतर यह है कि हम मैट्रिक्स एक्सपोनेंचर का उपयोग कर रहे हैं , इसलिए हम मैट्रिक्स बहुपद के मुक्त शब्द की सही गणना करते हैं a_0 * I
जहाँ आवश्यक आकृति I=A^0
की पहचान मैट्रिक्स है:
from sympy import *
x = symbols('x')
M = Matrix([[1,2],[3,4]])
p = Poly(x**3 + x + 1)
def eval_poly_matrix(P,A):
res = zeros(*A.shape)
for t in enumerate(P.all_coeffs()[::-1]):
i, a_i = t
res += a_i * (A**i)
return res
eval_poly_matrix(p,M)
आउटपुट:
इस उदाहरण में बहुपद में केवल तीन पद हैं, लेकिन वास्तव में मैं (बहुव्रीहि बहुपद) के साथ दर्जनों शब्दों का सामना करता हूं।
eval_poly_matrix
उपरोक्त फ़ंक्शन को मल्टीजरिएट पॉलीओनियम्स के लिए काम करने के लिए बढ़ाया जा सकता है , नॉनजेरो गुणांक वाले मोनोमियल निकालने के लिए .monoms()विधि का उपयोग करके , जैसे:
from sympy import *
x,y = symbols('x y')
M = Matrix([[1,2],[3,4]])
p = poly( x**3 * y + x * y**2 + y )
def eval_poly_matrix(P,*M):
res = zeros(*M[0].shape)
for m in P.monoms():
term = eye(*M[0].shape)
for j in enumerate(m):
i,e = j
term *= M[i]**e
res += term
return res
eval_poly_matrix(p,M,eye(M.rows))
नोट: कुछ पवित्रता की जाँच, बढ़त के मामलों को संभालने और अनुकूलन संभव हैं:
- बहुपद में मौजूद चरों की संख्या पैरामीटर्स की संख्या से संबंधित होती है जो पैरामीटर के रूप में पारित होती हैं (पूर्व को कभी भी उत्तरार्द्ध से अधिक नहीं होना चाहिए, और अगर यह संभालने के लिए मौजूद होने के लिए कुछ तर्क की तुलना में कम है, तो मैंने केवल मामले को संभाला है। जब दोनों बराबर हों)
- मैट्रिक्स बहुपद की परिभाषा के अनुसार सभी मैट्रिक्स को चौकोर होना चाहिए
- इस प्रश्न की टिप्पणियों में हॉर्नर के नियम के एक बहुभिन्नरूपी संस्करण के बारे में चर्चा की गई है । मैट्रिक्स गुणन की संख्या को कम करने के लिए यह उपयोगी हो सकता है।
- इस तथ्य को संभालें कि एक मैट्रिक्स बहुपद
x*y
से अलग हैy*x
क्योंकि मैट्रिक्स गुणन गैर-कम्यूटेटिव है । सिंपली पॉली फंक्शन सिम्पी में नॉन-कम्यूटेटिव वैरिएबल को सपोर्ट नहीं करते हैं , लेकिन आप सिंबल को डिफाइन कर सकते हैं और लगता है कि आगे कोई रास्ता हैcommutative=False
उपरोक्त 4 वें बिंदु के बारे में, सिम्पी में मैट्रिक्स के भावों का समर्थन है , और यह यहाँ मदद कर सकता है:
from sympy import *
from sympy.matrices import MatrixSymbol
A = Matrix([[1,2],[3,4]])
B = Matrix([[2,3],[3,4]])
X = MatrixSymbol('X',2,2)
Y = MatrixSymbol('Y',2,2)
I = eye(X.rows)
p = X**2 * Y + Y * X ** 2 + X ** 3 - I
display(p)
p = p.subs({X: A, Y: B}).doit()
display(p)
आउटपुट:
इस सुविधा के अधिक विकास के लिए # 18555 का अनुसरण करें