昨日ゼミ卒研があって、久しぶりに菊地&山本の本を読んでいて、 常微分方程式の固有値問題の章があるのを思い出した。そうだ、 これをやってみようということで、実行。
まずちょっと走らせてみて、 あまり精度が低いのでコーディング・ミスを疑ったが、普通のルーチンと、 帯行列用のルーチンで同じ答が出る。単純なコーディング・ミスではなさそう。 それではアルゴリズムのミスか?。ところが、 次数を上げていくと段々精度が上がって来てそれらしい結果を出すようになる。 正しいのかな?この時点で、 次数を大きくするためにも帯行列用のルーチンでないと駄目だと分かった。 さらに固有値を全部計算するのはしんどいので、 小さい方から数個求めるようにしないと話にならないことも分かった。 というわけで、次のようなプログラムを走らせることになった。
program fdm
integer i,n,m,maxn,N1,N2,NSTEP,MAXW
parameter (maxn = 10000, ncoda=2, lda=ncoda+1)
parameter (MAXW = 2*maxn*(ncoda+4)+maxn)
logical small
parameter (small = .true.)
real*8 a(lda,maxn), eval(maxn), c, h, h4inv
external devasb
COMMON /WORKSP/ RWKSP
REAL RWKSP(MAXW)
*
CALL IWKIN(MAXW)
c
write(*,*) ' NSTART,NEND,NSTEP='
read(*,*) N1,N2,NSTEP
if (N1 .lt. 6) then
N1 = 6
endif
c
do n = N1,N2,NSTEP
m = n - 3
h = 1.0d0 / n
h4inv = 1.0d0 / h**4
c
a(1,1)=0.0d0
a(1,2)=0.0d0
c = 1.0d0 * h4inv
do i=3,m
a(1,i) = c
end do
c
a(2,1) = 0.0d0
c = -4.0d0 * h4inv
do i=2,m-1
a(2,i)= c
end do
a(2,m)=-2.0 * h4inv
c
c = 6.0d0 * h4inv
do i=1,m-2
a(3,i)= c
end do
a(3,m-1)=5.0d0 * h4inv
a(3,m)=1.0d0 * h4inv
c
call devasb(m, 5, a, lda, ncoda, small, eval)
c
write(*,*) ' N=', N
write(*,*) (eval(i),i=1,5)
end do
end
さて、結果はどうなるかというと、、、
oyabun% test-FDM2
NSTART,NEND,NSTEP=
1000 10000 1000
N= 1000
12.462191808892 489.42847340945 3837.1448241929 14734.664365594
40264.212562460
N= 2000
12.395044092660 487.34666340961 3821.7483886199 14675.816251591
40103.824563559
N= 3000
13.134802409501 486.94196351073 3816.7670363691 14656.253512514
40050.098696306
N= 4000
11.946737822504 486.33007299197 3813.4893156216 14645.588853085
40023.221212918
N= 5000
19.102980867991 494.31233271986 3818.8659709859 14646.849156585
40013.678099232
N= 6000
28.244970754340 503.45967693861 3832.3625652045 14659.027784007
40018.703056702
N= 7000
-3.6834530007044 492.44054690281 3820.1818452542 14648.801176336
39988.834453875
N= 8000
-63.982736504047 408.39409769491 3740.3961247383 14541.477295313
39945.408837434
N= 9000
84.591125935711 508.35975169377 3837.5120895015 14655.358069608
39998.978912310
N= 10000
-52.363946332173 418.17647792973 3803.9786566901 14652.305272351
40010.437030957
oyabun%
うーん。Galerkin 法に惨敗している。