Die Berechnung der null-Raum der matrix
Ich versuche, zu lösen ist ein Gleichungssystem der form Ax = 0. Eine ist bekannt 6x6-matrix, und ich habe geschrieben, die folgenden code mithilfe der SVD um den Vektor x, die funktioniert zu einem gewissen Grad. Die Antwort ist in etwa korrekt, aber nicht gut genug, um nützlich für mich, wie kann ich das verbessern der Genauigkeit der Berechnung? Senkung der eps unter 1.e-4 bewirkt, dass die Funktion fehlschlägt.
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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
A
ist voller Rang --- sox
ist 0Da sieht es aus wie Sie einen least-squares Lösung, d.h.
min ||A*x|| s.t. ||x|| = 1
, tun die SVD so dass[U S V] = svd(A)
und in der letzten Spalte derV
(vorausgesetzt, dass die Spalten sortiert werden in der Reihenfolge der abnehmenden singular values) istx
.I. e.,
So,
Und
||A*x|| = 0.00027528
im Gegensatz zu deiner bisherigen Lösung fürx
wo||A*x_old|| = 0.079442
A*x
---[-0.056356 -0.055643 -7.3896e-013 -0.0043278 0.004483 -2.1316e-014]
min ||A*x|| s.t. ||x|| = 1
x
als 0 als gut.Achtung: Es könnte Verwechslungen mit der SVD in python vs. matlab-syntax(?):
in python, numpy.linalg.svd(A) gibt die Matrizen u,s,v so, dass u*s*v = A
(streng: dot(u, dot(diag(s), v) = A, da s ist ein Vektor und nicht einer 2D-matrix in numpy).
Die oberste Antwort ist richtig in dem Sinne, dass die in der Regel Sie schreiben u*s*vh = A und vh zurückgegeben wird, und diese Antwort beschreibt v UND NICHT vh.
Um eine lange Geschichte kurz zu machen: wenn Sie Matrizen u,s,v so, dass u*s*v = A, dann ist die Letzte Zeilen von v, nicht den letzten Spalten von v, beschreiben die nullspace.
Edit: [für Leute wie mich:] jeweils den letzten Zeilen ist ein Vektor v0, so dass A*v0 = 0 ist (wenn die entsprechenden singular-Wert ist 0)