0

ランク不足(ランク= 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が特異行列で失敗する理由を知りたいだけです. どんな提案でも大歓迎です。ありがとう。

4

2 に答える 2