Tôi đang cố giải quyết một tập hợp các phương trình của dạng Ax = 0. A là ma trận 6x6 và tôi đã viết mã dưới đây bằng SVD để lấy vector x hoạt động Một mức độ nhất định. Câu trả lời là gần đúng nhưng không đủ tốt để có ích cho tôi, làm thế nào tôi có thể cải thiện độ chính xác của phép tính? Giảm eps dưới 1.e-4 khiến chức năng thất bại.Tính toán không gian trống của ma trận
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 là một giải pháp cho vấn đề , nhưng một điều không thú vị. Giải pháp thực sự cho vấn đề, đến bằng các cách khác nhau là: [0.880057009282733,0.571293018023548,0.0664250041765576,1,186.758799941964,33.7579819749057] T – Ainsworth
Bạn có chắc chắn không? Tôi thấy một số phần tử khác không trong kết quả của 'A * x' ---' [-0.056356 -0.055643 -7.3896e-013 -0.0043278 0,00483 -2.1316e-014] ' – Jacob
Trừ khi tất nhiên, bạn không muốn không gian trống, nhưng giải pháp bình phương nhỏ nhất, nghĩa là 'min || A * x || s.t. || x || = 1' – Jacob