ランク不足(ランク= 9)の特異行列A(10 * 10)があり、Aの範囲空間にあるベクトルbがあります。今、Ax = bの解に興味があります。具体的には、ここに私のAがあります
array([[ 0. , 0. , 0. , 0.86826141, 0. ,
0. , 0.88788426, 0. , 0.4089203 , 0.88134901],
[ 0. , 0. , 0.46416372, 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0.31303966,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0.3155742 , 0. , 0.64059294, 0. ],
[ 0. , 0. , 0. , 0. , 0.51349938,
0. , 0. , 0. , 0.53593509, 0. ],
[ 0. , 0.01252787, 0. , 0.6870415 , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.16643105, 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0.08626592, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0.66939531],
[ 0.43694586, 0. , 0. , 0. , 0. ,
0.95941661, 0. , 0.52936733, 0.79687149, 0.81463887]])
b を使用して生成されA.dot(np.ones(10))ます。今、私はlu因数分解を使用してこれを解決したかったので、次のようにしました
lu_fac=scipy.linalg.lu_factor(X)
scipy.linalg.lu_solve(lu_fac,b)
どちらが与える
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
また、この場合、lu_factor は正常に機能しているようです (実行時に「対角数 %d は正確にゼロです。特異行列です」という警告が表示される場合があります)。完全を期すために、 lu_factor からの PLU が A と同じであることを確認するためのコードを次に示します。
L=np.tril(lu_fac[0])
np.fill_diagonal(L,1)
U=np.triu(lu_fac[0])
perm=np.arange(10)
ipiv=lu_factor[1]
for i in range(10):
temp=perm[i]
perm[i]=perm[ipiv[i]]
perm[ipiv[i]]=temp
np.allclose(X[perm,:],L.dot(U))
これで、行列が特異であり、問題に対する解が無限にあることがわかりました。しかし、私は任意の解決策に興味があり、なぜlu因数分解が失敗するのか混乱しています。自由変数を0に設定して、教えられているように解決策を見つけることはできませんか? また、実行時の警告 「対角数 %d は正確にゼロです。特異行列」との取引は何ですか。これを解決するためのsvd/qrアプローチには興味がないことに注意してください.luが特異行列で失敗する理由を知りたいだけです. どんな提案でも大歓迎です。ありがとう。