Warum wird „scipy.sparse.linalg.minres“ vorzeitig beendet und liefert schlechte Ergebnisse?Python

Python-Programme
Anonymous
 Warum wird „scipy.sparse.linalg.minres“ vorzeitig beendet und liefert schlechte Ergebnisse?

Post by Anonymous »

Beim Versuch herauszufinden, warum der MATLAB-Code, den ich nach Python portiert habe, und meine Python-Implementierung nicht funktioniert, bin ich auf ein großes Problem gestoßen: MATLABs lsqminnorm erzeugt im Vergleich zu minres eine deutlich andere Produktion.
Mit der Python-API von MATLAB habe ich meinen Code debuggt und die Ergebnisse verglichen:

Code: Select all

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,M=preconditioner,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"])
Wenn ich mir np.linalg.norm(Reg @ x - y) ansehe, erhalte ich, dass die Norm der Differenz etwa 2.500 beträgt, wenn der MATLAB-Löser verwendet wird, und über 50.000 Mal höher, wenn Minres verwendet wird.

Code: Select all

problemflag
bleibt falsch, was einen Exit-Code von 0 aus Minres bedeutet, was eine erfolgreiche Beendigung bedeutet.
Ich verwende Python 3.12.4, Scipy 1.16.3 und MATLAB Version 25.2.0.3055257 (R2025b) Update 2

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post