Почему `scipy.sparse.linalg.minres` завершает работу раньше времени и дает плохие результаты?Python

Программы на Python
Ответить
Anonymous
 Почему `scipy.sparse.linalg.minres` завершает работу раньше времени и дает плохие результаты?

Сообщение Anonymous »

Пытаясь выяснить, почему код MATLAB, который я перенес на Python, работает, а моя реализация Python — нет, я столкнулся с серьезной проблемой: lsqminnorm MATLAB выдает совершенно разные результаты по сравнению с minres.
Используя API Python MATLAB, я отладил свой код и сравнил результаты:

Код: Выделить всё

import matlab
eng = matlab.engine.start_matlab()
from scipy import sparse
import numpy as np

if (eng is None):
problemflag = False
tmp = sparse.linalg.minres(Reg,y,rtol=1e-18,maxiter = 1e4)
problemflag = problemflag or (tmp[1]!=0)
x = tmp[0][:,np.newaxis]
else:
Reg_mat = matlab.double(Reg.toarray().tolist())
y_mat = matlab.double(y.tolist())
eng.workspace["Reg_mat"] = Reg_mat
eng.workspace["y_mat"] = y_mat
eng.eval("x = lsqminnorm(sparse(Reg_mat),y_mat);",nargout=0)
x = np.array(eng.workspace["x"])
Глядя на np.linalg.norm(Reg @ x - y), я понимаю, что норма разницы составляет около 2500, когда используется решатель MATLAB, и более чем в 50 000 раз выше, когда используется minres.

Код: Выделить всё

problemflag
остается ложным, что означает код выхода 0 из минут, что означает успешное завершение.
Я также запускал код с check=True в минутах, без ошибок, что означает (как я уже подтвердил, посмотрев на A-A.T), что матрица симметрична. Таким образом, проблема не в асимметрии.
Я использую Python 3.12.4, scipy 1.16.3 и MATLAB версии 25.2.0.3055257 (R2025b), обновление 2

Подробнее здесь: https://stackoverflow.com/questions/798 ... ad-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»