बहुपद में मैट्रिक्स को प्रतिस्थापित करते समय समस्याएं

Jan 12 2021

उदाहरण: चलो

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

वही त्रुटि बनी रहती है। क्या मैं एम द्वारा एक्स की जगह, हाथ से अभिव्यक्ति टाइप करने के लिए बाध्य हूं? इस उदाहरण में बहुपद में केवल तीन पद हैं, लेकिन वास्तव में मैं (बहुव्रीहि बहुपद) के साथ दर्जनों शब्दों का सामना करता हूं।

जवाब

1 wsdookadr Jan 12 2021 at 12:40

इसलिए मुझे लगता है कि प्रश्न मुख्य रूप से मैट्रिक्स बहुपद की अवधारणा के आसपास घूम रहा है :

(जहां 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))

नोट: कुछ पवित्रता की जाँच, बढ़त के मामलों को संभालने और अनुकूलन संभव हैं:

  1. बहुपद में मौजूद चरों की संख्या पैरामीटर्स की संख्या से संबंधित होती है जो पैरामीटर के रूप में पारित होती हैं (पूर्व को कभी भी उत्तरार्द्ध से अधिक नहीं होना चाहिए, और अगर यह संभालने के लिए मौजूद होने के लिए कुछ तर्क की तुलना में कम है, तो मैंने केवल मामले को संभाला है। जब दोनों बराबर हों)
  2. मैट्रिक्स बहुपद की परिभाषा के अनुसार सभी मैट्रिक्स को चौकोर होना चाहिए
  3. इस प्रश्न की टिप्पणियों में हॉर्नर के नियम के एक बहुभिन्नरूपी संस्करण के बारे में चर्चा की गई है । मैट्रिक्स गुणन की संख्या को कम करने के लिए यह उपयोगी हो सकता है।
  4. इस तथ्य को संभालें कि एक मैट्रिक्स बहुपद 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 का अनुसरण करें