2010-06-07 19 views
11

के शून्य स्थान की गणना करना मैं फॉर्म एएक्स = 0. के समीकरणों के एक सेट को हल करने का प्रयास कर रहा हूं। ए 6x6 मैट्रिक्स ज्ञात है और मैंने वेक्टर एक्स प्राप्त करने के लिए एसवीडी का उपयोग करके नीचे दिया गया कोड लिखा है जो काम करता है एक निश्चित हद तक जवाब लगभग सही है लेकिन मेरे लिए उपयोगी होने के लिए पर्याप्त नहीं है, मैं गणना की सटीकता को कैसे सुधार सकता हूं? 1.e-4 से नीचे eps को कम करने से फ़ंक्शन विफल हो जाता है।मैट्रिक्स

from numpy.linalg import * 
from numpy import * 

A = matrix([[0.624010149127497 ,0.020915658603923 ,0.838082638087629 ,62.0778180312547 ,-0.336 ,0], 
[0.669649399820597 ,0.344105317421833 ,0.0543868015800246 ,49.0194290212841 ,-0.267 ,0], 
[0.473153758252885 ,0.366893577716959 ,0.924972565581684 ,186.071352614705 ,-1 ,0], 
[0.0759305208803158 ,0.356365401030535 ,0.126682113674883 ,175.292109352674 ,0 ,-5.201], 
[0.91160934274653 ,0.32447818779582 ,0.741382053883291 ,0.11536775372698 ,0 ,-0.034], 
[0.480860406786873 ,0.903499596111067 ,0.542581424762866 ,32.782593418975 ,0 ,-1]]) 

def null(A, eps=1e-3): 
    u,s,vh = svd(A,full_matrices=1,compute_uv=1) 
    null_space = compress(s <= eps, vh, axis=0) 
    return null_space.T 

NS = null(A) 
print "Null space equals ",NS,"\n" 
print dot(A,NS) 

उत्तर

9

A पूर्ण रैंक है --- तो x

है चूंकि यह है कि आपके पास कम से कम वर्गों समाधान की जरूरत है, यानी min ||A*x|| s.t. ||x|| = 1, SVD कर लग रहा है जैसे कि [U S V] = svd(A) और के अंतिम स्तंभ V (यह मानते हुए कि एकवचन मूल्य घटाने के क्रम में कॉलम क्रमबद्ध हैं) x है।

Ie,

U = 

    -0.23024  -0.23241  0.28225  -0.59968  -0.04403  -0.67213 
     -0.1818  -0.16426  0.18132  0.39639  0.83929  -0.21343 
    -0.69008  -0.59685  -0.18202  0.10908  -0.20664  0.28255 
    -0.65033  0.73984 -0.066702  -0.12447  0.088364  0.0442 
    -0.00045131 -0.043887  0.71552  -0.32745  0.1436  0.59855 
    -0.12164  0.11611  0.5813  0.59046  -0.47173  -0.25029 


S = 

     269.62   0   0   0   0   0 
      0  4.1038   0   0   0   0 
      0   0  1.656   0   0   0 
      0   0   0  0.6416   0   0 
      0   0   0   0  0.49215   0 
      0   0   0   0   0 0.00027528 


V = 

    -0.002597  -0.11341  0.68728  -0.12654  0.70622 0.0050325 
    -0.0024567  0.018021  0.4439  0.85217  -0.27644 0.0028357 
    -0.0036713  -0.1539  0.55281  -0.4961  -0.6516 0.00013067 
     -0.9999 -0.011204 -0.0068651 0.0013713 0.0014128 0.0052698 
    0.0030264  0.17515  0.02341 -0.020917 -0.0054032  0.98402 
    0.012996  -0.96557  -0.15623  0.10603  0.014754  0.17788 

तो,

x = 

    0.0050325 
    0.0028357 
    0.00013067 
    0.0052698 
     0.98402 
     0.17788 

और, ||A*x|| = 0.00027528 रूप x के लिए अपने पिछले समाधान करने का विरोध किया, जहां ||A*x_old|| = 0.079442

+0

x = 0 समस्या का समाधान है , लेकिन एक अनिच्छुक एक। समस्या का सही समाधान, विभिन्न माध्यमों से पहुंचा है: [0.880057009282733,0.571293018023548,0.0664250041765576,1,186.758799941964,33.7579819749057] टी – Ainsworth

+0

क्या आप निश्चित हैं? मैं 'ए * एक्स' ---' -0.056356 -0.055643 -7.3896e-013 -0.0043278 0.004483 -2.1316e-014] – Jacob

+0

के परिणामस्वरूप कुछ गैर-शून्य तत्व देखता हूं, बेशक, आप नहीं चाहते शून्य स्थान, लेकिन कम से कम वर्ग समाधान, यानी 'मिनट || ए * एक्स || s.t. || एक्स || = 1' – Jacob

5

ध्यान दें: वहाँ अजगर में SVD के साथ भ्रम हो सकता है बनाम matlab-syntax (?): पायथन में, numpy.linalg.svd (ए) matrices आप, एस, बनाम देता है इतना है कि आप * वी = ए (कड़ाई से: डॉट (यू, डॉट (डायग (एस), वी) = ए, क्योंकि एस एक वेक्टर है और नुकीले में 2 डी-मैट्रिक्स नहीं है)।

सबसे ऊपर उत्तर उस अर्थ में सही है कि आमतौर पर आप लिखते हैं * * * vh = ए और vh वापस आ गया है, और यह उत्तर v और नहीं vh पर चर्चा करता है।

एक लम्बी कहानी कम करने के लिए: यदि आप मैट्रिक्स है यू, एस, वी ऐसी है कि यू * s * वी = एक, तो पिछले पंक्तियों वी, नहीं वी के अंतिम colums, का वर्णन खाली जगह।

संपादित करें: [मेरे जैसे लोगों के लिए:] पिछले पंक्तियों में से प्रत्येक के एक वेक्टर V0 ऐसी है कि है एक * V0 = 0 (यदि इसी विलक्षण मूल्य है 0)