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])
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]
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
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]
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
Code: Select all
0.4121
0.4699
0.5538
0.6755
0.9524
1.5569
3.7636
156.6321
NaN
NaN
Mobile version