Estoy intentando resolver un conjunto de ecuaciones de la forma Ax = 0. Se conoce una matriz de 6x6 y he escrito el código siguiente usando SVD para obtener el vector x que funciona para un cierto grado La respuesta es aproximadamente correcta, pero no lo suficientemente buena para ser útil para mí, ¿cómo puedo mejorar la precisión del cálculo? Al reducir los valores por debajo de 1.e-4, la función falla.Cálculo del espacio nulo de una matriz
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)
x = 0 es una solución al problema , pero poco interesante. La verdadera solución al problema, llegó por diferentes medios es: [0.880057009282733,0.571293018023548,0.0664250041765576,1,186.758799941964,33.7579819749057] T – Ainsworth
¿Estás seguro? Veo algunos elementos distintos de cero en el resultado de 'A * x' ---' [-0.056356 -0.055643 -7.3896e-013 -0.0043278 0.004483 -2.1316e-014] ' – Jacob
A menos, por supuesto, que no desee el espacio nulo, pero la solución de mínimos cuadrados, es decir 'min || A * x || S t. || x || = 1' – Jacob