2015-04-15 5 views
5

में काम नहीं करता है, मैं सिम्पी में मैट्रिक्स के ईजिनवेक्टर ढूंढना चाहता हूं और निम्न प्रोग्राम लिखा लेकिन यह काम नहीं करता है। दूसरी तरफ, सिम्पी में एइजेनवेक्ट्स() फ़ंक्शन मैट्रिक्स ए के ईजिनवेल्स और इग्नवेक्ट्स की गणना करता है और मैंने यहां एक समान चीज़ का उपयोग किया लेकिन जब मैं परिणाम प्रिंट करना चाहता हूं, तो एक खाली सूची दिखाई जाती है। क्या आप कृपया मुझे मार्गदर्शन करेंगे?Eigenvector Sympy

from sympy import * 

H=Matrix([ [215.0 ,-104.1 ,5.1 ,-4.3 ,4.7 ,-15.1 ,-7.8], 
     [-104.1 , 220.0 ,32.6 , 7.1 ,5.4 , 8.3 ,0.8], 
     [ 5.1 , 32.6 , 0. , -46.8 , 1.0 , -8.1 , 5.1 ], 
     [ -4.3 , 7.1  ,-46.8 ,125.0 ,-70.7 ,-14.7 ,-61.5], 
     [ 4.7 , 5.4  , 1.0 ,-70.7 ,450.0 ,89.7 ,-2.5], 
     [-15.1 , 8.3  ,-8.1 ,-14.7 ,89.7 ,330.0 ,32.7], 
     [-7.8 ,0.8  ,5.1 ,-61.5 ,-2.5 ,32.7 ,280.0]]) 


zz=H.eigenvects() 
pprint(zz) 
+1

आप यह सुनिश्चित करें कि मैट्रिक्स किसी भी eigenvectors है कर रहे हैं? – KSFT

+0

@KSFT यह वास्तव में करता है। विशेषता बहुपद की गणना करें। – miradulo

+1

@ डोंकीकॉन्ग मुझे याद नहीं है कि यह कैसे करना है, और यह वोल्फ्राम अल्फा के लिए बहुत लंबा है, इसलिए मैं आप पर भरोसा रखूंगा। – KSFT

उत्तर

2
>>> H 
    Matrix([ 
    [ 215.0, -104.1, 5.1, -4.3, 4.7, -15.1, -7.8], 
    [-104.1, 220.0, 32.6, 7.1, 5.4, 8.3, 0.8], 
    [ 5.1, 32.6,  0, -46.8, 1.0, -8.1, 5.1], 
    [ -4.3, 7.1, -46.8, 125.0, -70.7, -14.7, -61.5], 
    [ 4.7, 5.4, 1.0, -70.7, 450.0, 89.7, -2.5], 
    [ -15.1, 8.3, -8.1, -14.7, 89.7, 330.0, 32.7], 
    [ -7.8, 0.8, 5.1, -61.5, -2.5, 32.7, 280.0]]) 
    >>> x = H.charpoly(symbols('lamda')) 
    >>> factor(x) 
    1.0*(1.0*lamda**7 - 1620.0*lamda**6 + 1029369.57*lamda**5 - 
324725076.332*lamda**4 + 52250209639.9248*lamda**3 - 
3762668861934.64*lamda**2 + 49798018861415.7*lamda + 
4.112530087788e+15) 

पिछले समीकरण 7 वास्तविक मूल => (lamda +23.738) *(lamda -101.965) *(lamda -120.956) *(lamda -268.369) *(lamda -307.126) *(lamda -332.005) *(lamda -513.317) = 0

[-23.738, 101.965, 120.956, 268.369, 307.126, 332.005, 513.317]

है और यह वास्तव में अजीब, sympy कह इस मैट्रिक्स कोई आइजन्वेक्टर है रखने के कारण दिया गया है।

+0

@Romano Zumbé लौटाया है कृपया इसे देखें: http://docs.sympy.org /latest/tutorial/matrices.html?highlight=lamda – marmeladze

+0

आह, ठीक है। मैं समझता हूं कि इसका उपयोग इस तरह क्यों किया जाता है। क्षमा करें –

2

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

>>> H.berkowitz_eigenvals() 
{−23.7383543150805:1,101.965215714556:1,120.955771704237:1, 
    268.369453977695:1,307.126362241411:1,332.004505895816:1,513.317044781366:1} 

वैकल्पिक रूप से, चरित्र बहुपद जड़ों देता है खोजने एक ही परिणाम:

>>> roots(H.charpoly(x),x) 
{−23.7383543150805:1,101.965215714556:1,120.955771704237:1, 
    268.369453977695:1,307.126362241411:1,332.004505895816:1,513.317044781366:1} 

एक कामकाज के लिए, मेरे पास इस समय कोई अन्य लाइब्रेरी का उपयोग करने के अलावा कोई विचार नहीं है, शायद न्यूम/साइपी:

>>> from numpy import linalg as LA 
>>> w,v = LA.eig(np.array([ [215.0 ,-104.1 ,5.1 ,-4.3 ,4.7 ,-15.1 ,-7.8], 
     [-104.1 , 220.0 ,32.6 , 7.1 ,5.4 , 8.3 ,0.8], 
     [ 5.1 , 32.6 , 0. , -46.8 , 1.0 , -8.1 , 5.1 ], 
     [ -4.3 , 7.1  ,-46.8 ,125.0 ,-70.7 ,-14.7 ,-61.5], 
     [ 4.7 , 5.4  , 1.0 ,-70.7 ,450.0 ,89.7 ,-2.5], 
     [-15.1 , 8.3  ,-8.1 ,-14.7 ,89.7 ,330.0 ,32.7], 
     [-7.8 ,0.8  ,5.1 ,-61.5 ,-2.5 ,32.7 ,280.0]]) 
>>> w;v 
array([[ 0.0211232 , -0.0863685 , 0.31060486, 0.64800412, 0.58825511, 
     0.34578278, -0.1004976 ], 
     [-0.03360278, -0.17141713, 0.28577077, 0.60531169, -0.57444552, 
     -0.41080118, 0.15058085], 
     [-0.01492258, 0.91780802, -0.23783515, 0.29790711, -0.04561479, 
     -0.00789624, 0.09974215], 
     [ 0.19183148, 0.33999268, 0.79845203, -0.30609739, 0.01552874, 
     -0.18077 , -0.2889039 ], 
     [-0.86037599, 0.04835763, 0.171535 , -0.10783263, 0.27161704, 
     -0.27390267, 0.25993089], 
     [-0.45801107, 0.01859027, -0.05846719, 0.07732967, -0.35064091, 
     0.32022588, -0.74497537], 
     [-0.1066849 , 0.05006013, 0.30810033, -0.11677503, -0.35344244, 
     0.70807431, 0.50125772]]) 
7

समस्या फ्लोट्स और राशनल्स के उपयोग से उत्पन्न होती है। eigenvects राशन में फ़्लोट्स को याद करता है। eigenvals नियमित रूप से विफल रहता है जब जड़ बहुपद कारक करने में विफल रहता है। जब आप सीधे eigenvals पर कॉल करते हैं, तो फ़्लोट भी रिकॉस्ट होते हैं लेकिन आप उन्हें पढ़ने के लिए चुन सकते हैं; जब आप करते हैं, roots मान वापस करने में सक्षम है और ईजिन मान लौटाए जाते हैं।

>>> H.eigenvals() 
{} 
>>> H.eigenvals(rational=False) 
{513.317044781366: 1, 101.965215714556: 1, 332.004505895816: 1, 268.369453977695: 1, 120.955771704237: 1, -23.7383543150805: 1, 307.126362241411: 1} 

ऐसा लगता है roots इस 7 वें क्रम बहुपद के लिए RootOf उदाहरणों लौट जाना चाहिए की तरह के बजाय कोई जड़ों लौटने। यह SymPy के लिए एक मुद्दा के रूप में रिपोर्ट करने के लिए अच्छा होगा:

जड़ों (पी) -> {} RootOf उदाहरणों के बजाय जब p = 5000000*x**7 - 8100000000*x**6 + 5146847850000*x**5 - 1623625381660000*x**4 + 261251048199624000*x**3 - 18813344309673222800*x**2 + 248990094307079384205*x + 20562650438939697400552

+0

उस विशेष बहुपद के पास आपके मैट्रिक्स के लिए 7 असली जड़ें हैं; एक असफल बहुपद का एक सरल उदाहरण जिसमें केवल 1 असली रूट है 'x ** 7-x + 1' – smichr

+0

बहुत रोचक, यह मुझे थोड़ी देर के लिए परेशान कर रहा था, +1 – miradulo

+0

संबंधित मुद्दों से पहले ही रिपोर्ट की गई है, उदा। https://github.com/sympy/sympy/issues/6331 – smichr

संबंधित मुद्दे