| 実験用行列生成のヒント |
% ランダム Hessenberg 行列
function ret = rand_h(n)
ret = triu(rand(n,n)) + diag(rand(n-1,1),-1);
% ランダム三重対角行列
function ret = rand_t(n)
ret=diag(rand(n,1),0)+diag(rand(n-1,1),1)+diag(rand(n-1,1),-1);
% ランダム実対称三重対角行列
function ret = rand_st(n)
u=rand(n-1,1);
ret=diag(rand(n,1),0)+diag(u,1)+diag(u,-1);
% ランダム実対称行列
function ret = rand_s(n)
a=rand(n,n);
ret = (a+a')/2;
% QR 変換 (回数指定)
function QR = qr_iteration(a,n)
QR = a;
for i=1:n
[q r]=qr(QR);
QR=r*q;
end
% 下三角部分のノルム
function n = norm_l(a)
n = norm(a-triu(a));
|
| beki.m |
1 %
2 % beki.m --- 冪乗法の系統の算法の実験
3 %
4
5 format long
6
7 a=[1,1,1;1,2,2;1,2,3]
8 eigen=eig(a)
9
10 maxiter=20; r=zeros(maxiter,1);
11
12 disp("冪乗法")
13 x=ones(3,1);
14 for k=1:maxiter
15 y=a*x; x=y/norm(y); r(k)=x'*(a*x);
16 end
17 subplot(1,4,1)
18 semilogy(1:maxiter,abs(r-eigen(3)))
19 % 絶対値最大の固有値に属する固有ベクトルを保存しておく
20 u=x;
21
22 disp("逆反復法")
23 x=ones(3,1);
24 for k=1:maxiter
25 y=a\x; x=y/norm(y); r(k)=x'*(a*x);
26 end
27 subplot(1,4,2)
28 semilogy(1:maxiter,abs(r-eigen(1)))
29
30 disp("シフト法")
31 kinji=0.6;
32 ap=a-kinji*eye(3,3);
33 x=ones(3,1);
34 for k=1:maxiter
35 y=ap\x; x=y/norm(y); r(k)=x'*(ap*x)+kinji;
36 end
37 subplot(1,4,3)
38 semilogy(1:maxiter,abs(r-eigen(2)))
39
40 x=ones(3,1);
41 x=x-(u'*x)*u;
42 for k=1:maxiter
43 y=a*x; x=y/norm(y); x=x-(u'*x)*u; r(k)=x'*(a*x);
44 end
45 subplot(1,4,4)
46 semilogy(1:maxiter,abs(r-eigen(2)))
|
| householder.m |
1 % Householder 2 function a=householder(A) 3 [n,n] = size(A); 4 a = A; 5 for k=1:n-1 6 b = a(k+1:n,k); 7 B = a(k+1:n,k+1:n); 8 s = - sign(b(1)) * norm(b); 9 w = b; 10 w(1) = w(1) - s; 11 normw2 = 2 * s * (s - b(1)); 12 p = (B * w) / (normw2/2); 13 alpha = (w'*p) / normw2; 14 q = p - alpha * w; 15 a(k+1:n,k+1:n) = B - w * q' - q * w'; 16 a(k+2:n,k) = zeros(n-k-1,1); 17 a(k,k+2:n) = zeros(n-k-1,1)'; 18 a(k+1,k) = s; 19 a(k,k+1) = s; 20 end |
なお、授業のレポートである福澤 [7] も参考になるかも。