2009-12-02 709 views
3

如果我有這樣的如何用NumPy求解齊次線性方程組?

array([[-0.75, 0.25, 0.25, 0.25], 
     [ 1. , -1. , 0. , 0. ], 
     [ 1. , 0. , -1. , 0. ], 
     [ 1. , 0. , 0. , -1. ]]) 

齊次線性方程和我想要得到它一個非零解。用NumPy怎麼辦?

編輯

linalg.solve只在一個工作* X = B,其中B不僅包含0。

+0

[1,1,1,1]是一個非平凡的解決方案。無論如何,我不想爲我給出的例子提供特定的解決方案,我想要一些通用的方法來解決問題。 – ablmf 2009-12-02 20:21:13

回答

4

您可以使用SVD或QR分解來計算的零空間線性系統,例如,像:

import numpy 

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

這產生了你的例子:

>>> A 
matrix([[-0.75, 0.25, 0.25, 0.25], 
     [ 1. , -1. , 0. , 0. ], 
     [ 1. , 0. , -1. , 0. ], 
     [ 1. , 0. , 0. , -1. ]]) 

>>> null(A).T 
array([[-0.5, -0.5, -0.5, -0.5]]) 

>>> (A*null(A)).T 
matrix([[ 1.66533454e-16, -1.66533454e-16, -2.22044605e-16, -2.22044605e-16]]) 

另見維基百科上的Numerical computation of null space部分。

1

對於這個問題,過度約束的齊次線性系統的最佳解決方案是與最小特徵值相關的特徵向量。所以給定U作爲系統的係數矩陣,解決方案是:

import numpy as np 

def solution(U): 
    # find the eigenvalues and eigenvector of U(transpose).U 
    e_vals, e_vecs = np.linalg.eig(np.dot(U.T, U)) 
    # extract the eigenvector (column) associated with the minimum eigenvalue 
    return e_vecs[:, np.argmin(e_vals)]