Я хочу написать функцию, которая использует разложение SVD для решения системы уравнений ax=b, где a — квадратная матрица, а b — вектор значений. Функция scipy scipy.linalg.svd() должна превратить a в матрицы U W V. Для U и V я могу просто выполнить транспонирование, чтобы найти их инверсию. Но для W функция дает мне одномерный массив значений, которые мне нужно проставить по диагонали матрицы, а затем ввести единицу поверх значения.
def solveSVD(a,b):
U,s,V=sp.svd(a,compute_uv=True)
Ui=np.transpose(a)
Vi=np.transpose(V)
W=np.diag(s)
Wi=np.empty(np.shape(W)[0],np.shape(W)[1])
for i in range(np.shape(Wi)[0]):
if W[i,i]!=0:
Wi[i,i]=1/W[i,i]
ai=np.matmul(Ui,np.matmul(Wi,Vi))
x=np.matmul(ai,b)
return(x)
Однако я получаю ошибку TypeError: тип данных не понят. Я думаю, что часть проблемы в том, что
W=np.diag(s)
не производит квадратную диагональную матрицу.
Я впервые работаю с этой библиотекой, так что извините, если я сделал что-то очень глупое, но я не могу понять, почему эта строка не работает. Спасибо всем!
Ui=np.transpose(a)
или более похожей наUi=np.transpose(U)
, а циклfor
можно просто заменить наWi=np.diag(1/s)
? Посмотрите комментарии в моем коде, чтобы понять, что делает функция. - person Yacola   schedule 12.12.2019