Welche Unterschiede zwischen der Eigs-Funktion von SciPy und MATLAB führen dazu, dass sie zu unterschiedlichen EigenwertPython

Python-Programme
Anonymous
 Welche Unterschiede zwischen der Eigs-Funktion von SciPy und MATLAB führen dazu, dass sie zu unterschiedlichen Eigenwert

Post by Anonymous »

Ich versuche, ein verallgemeinertes Eigenwertproblem in Python zu lösen, indem ich ein MATLAB-Skript übersetze. Sowohl A als auch B sind nicht positiv semidefinit. Ich vermute, dass dies in MATLAB dazu führt, dass die ARPACK-Bibliothek auf eine andere Lösungsmethode zurückgreift, aber meiner Erfahrung nach macht dies scipy.sparse.linalg.eigs ziemlich kaputt.
Ich habe versucht, auf Shift-Invertierung zurückzugreifen, aber dadurch werden nur Eigenwerte gefunden, die sehr nah an Sigma liegen, während sowohl das ursprüngliche MATLAB als auch ein Beispiel-Julia-Code (den ich zum Testen geschrieben habe) durchweg dasselbe finden Eigenwerte, die eine tatsächliche physikalische Bedeutung haben.
Ich habe die folgenden Skripte verwendet, um Eigenwerte zu finden. Die Matrizen und Skripte finden Sie hier.
Python

Code: Select all

import scipy
import numpy as np
from pathlib import Path

A = scipy.io.loadmat(Path(r"A.mat"))["M2"]
B = scipy.io.loadmat(Path(r"B.mat"))["K2"]

for i in range(3):
w, x = scipy.sparse.linalg.eigs(A, 10, B, sigma=160)
print(np.sort(w)[::-1])
AUSGABE:

Code: Select all

[161.26979005+4.26415422j 161.26979005-4.26415422j
158.92858951+4.22317058j 158.92858951-4.22317058j
157.64003545+3.74576228j 157.64003545-3.74576228j
156.63206377+0.j         156.62334177+3.04331942j
156.23526634+1.58239628j 156.23526634-1.58239628j]
[161.37373507+2.80500328j 161.37373507-2.80500328j
161.1500351 +3.96154771j 161.1500351 -3.96154771j
160.38498788+3.72012148j 160.38498788-3.72012148j
156.69885362+2.27484038j 156.69885362-2.27484038j
156.63206377+0.j         156.137915  +3.13749122j]
[160.03961408+0.02637497j 160.03961408-0.02637497j
160.03777484+0.01952793j 160.03777484-0.01952793j
160.03374392+0.03162003j 160.03374392-0.03162003j
160.02344395+0.04010082j 160.02344395-0.04010082j
160.00118188+0.04575844j 160.00118188-0.04575844j]
Julia

Code: Select all

using MAT
using LinearAlgebra
using Arpack
using DelimitedFiles

A = matread(joinpath(@__DIR__, "A.mat"))["M2"]
B = matread(joinpath(@__DIR__, "B.mat"))["K2"]

for i in 1:3
λ, V = eigs(-A, B; nev=10, ncv=50, sigma=160, check=1)
println("Eigenvalues: ", round.(real.(-λ), digits=3))
end
AUSGABE

Code: Select all

Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335]
Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335]
Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335]
MATLAB

Code: Select all

A = load("A.mat", "M2").M2;
B = load("B.mat", "K2").K2;

opts.disp = true;

for i = 1:3
[x w] = eigs(A, B, 10, 160, opts);
disp(sort(diag(w)));
end
AUSGABE

Code: Select all

0.4121
0.4699
0.5538
0.6755
0.9524
1.5569
3.7636
156.6321
NaN
NaN
Ich habe in der eigs-Dokumentation der jeweiligen Bibliotheken gelebt und nicht die Feinheit gefunden, die die Methoden auszeichnet. Hat jemand Vorschläge?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post