LoginSignup
5
0

More than 3 years have passed since last update.

Sakurai-Sugiura法をMATLABで実装してみた

Last updated at Posted at 2019-09-18

Sakurai-Sugiura法

指定した領域内の固有値を求める解法であるSakurai-Sugiura法を実装してみました.
ムダな部分もあるかと思いますが,とりあえず動きます.
固有値の求解まではコーディングしてますが,固有ベクトルは求めていませんので注意してください.

引用文献

詳細なアルゴリズムや,原理は以下の原著論文をご参考ください.
1. Tetsuya Sakurai, Hiroshi Sugiura, A projection method for generalized eigenvalue problems using numerical integration, Journal of Computational and Applied Mathematics, Volume 159, Issue 1, 2003, Pages 119-128,
2. 日本語 -> https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/43096/1/1320_24.pdf

MATLABサンプルコード

ss.m

% テスト行列の準備
A = (diag(99:-1:0) + circshift(eye(100),1,2))./100;
B = [zeros(80,80) zeros(80,20);zeros(20,80) eye(20)];
[mA nA] = size(A);

% 適当な値
N = 64;
j = 0:N-1;

% ジョルダン閉曲線の中心
r = 0.015;
% ジョルダン閉曲線の半径
p  = 0.02;

% 上記の領域内の固有値数
m = 4;

% ランダムベクトル
u = rand(mA,1);
v = rand(mA,1);

% (1) ジョルダン閉曲線(今回は円)
w = r + p .* exp(2 * pi * 1i * j ./ N);
plot(real(w),imag(w));
grid on;

% (2) 
for lp = 1:N
    y(:,lp) = v' / (w(lp) * B - A);
end

% (3)
f = u' * y;

% (4)
for lp2 = 1:2 * m
    mu(lp2) = 0;
    for lp = 1:N
        mu(lp2) = mu(lp2) + ( w(lp)-r ).^lp2 * f(lp);
    end
    mu(lp2) = mu(lp2) / N;
end

% (5) Hankel行列の計算と固有値の求解
H1 = hankel(mu(1:m),mu(m:end-1));
H2 = hankel(mu(2:m+1),mu(m+1:end));

t = eig(H2,H1);
lambda = r + t
figure;
scatter(real(lambda),imag(lambda));
hold on;
scatter(real(w),imag(w));
grid on;
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0