У меня есть сингулярная матрица A (10 * 10) с недостаточным рангом (ранг = 9), и у меня есть вектор b, который находится в пространстве диапазонов A. Теперь меня интересует какое-то решение для 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 равно нулю. Сингулярная матрица"). Для полноты вот код для проверки того, что PLU из lu_factor такой же, как 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 не работает для сингулярных матриц. Любые предложения приветствуются. Спасибо.