MATLAB や Octave には qr() という QR 分解をする関数があって、 QR 法の実験が簡単にできる。
以下、実験をする際の参考に、小プログラム集を。
# qr_t.m --- QR 変換 function QR = qr_t(a) [q r]=qr(a); QR=r*q; endfunction # qr_iteration.m --- QR 変換の反復 function QR = qr_iteration(a,n) QR = a; for i=1:n [q r]=qr(QR); QR=r*q; end endfunction # norm_l.m --- 下三角部分 (対角線含まず) のノルム function n = norm_l(a) n = norm(a-triu(a)); endfunction # rand_h.m --- テスト用 Hessenberg 行列 function ret = rand_h(n) ret = triu(rand(n,n)) + diag(rand(n-1,1),-1); endfunction # rand_t.m --- テスト用三重対角行列 function ret = rand_t(n) ret=diag(rand(n,1),0)+diag(rand(n-1,1),1)+diag(rand(n-1,1),-1); endfunction # rand_s.m --- テスト用対称行列 function ret = rand_s(n) a=rand(n,n); ret = (a+a')/2; endfunction # rand_st.m --- テスト用対称三重対角行列 function ret = rand_st(n) u=rand(n-1,1); ret=diag(rand(n,1),0)+diag(u,1)+diag(u,-1); endfunction # rand_hermite.m --- テスト用 Hermite 行列 function ret = rand_hermite(n) a=rand(n,n)+i*rand(n,n); ret = (a+a')/2; endfunction