我正在尝试解决一组形式为Ax = 0的方程式.A是已知的6x6矩阵,我使用SVD编写下面的代码来获得在某种程度上起作用的向量x。答案大致正确,但不足以对我有用,我怎样才能提高计算的精确度?降低低于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)
答案 0 :(得分:10)
A
是满级 - 所以x
0
由于看起来你需要一个最小二乘解,即min ||A*x|| s.t. ||x|| = 1
,所以做SVD使得[U S V] = svd(A)
和V
的最后一列(假设列已经排序)递减奇异值的顺序是x
。
即,
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
的{{1}}
答案 1 :(得分:5)
注意:python与matlab语法(?)中的SVD可能存在混淆: 在python中,numpy.linalg.svd(A)返回矩阵u,s,v,使得u * s * v = A (严格地说:dot(u,dot(diag(s),v)= A,因为s是一个向量而不是numpy中的二维矩阵。)
最重要的答案是正确的,因为通常你写的是* * * vh = A和vh被返回,这个答案讨论了v AND NOT vh。
总而言之:如果你有矩阵u,s,v使得u * s * v = A,那么v的最后行,不是 v的最后一个列,描述了nullspace。
编辑:[对于像我这样的人:]每个最后一行是向量v0,使得A * v0 = 0(如果相应的奇异值为0)