連立方程式をSOR法を用いてコンピュータで解く
{ 2 1 1 }{ X1 } { 2 }
{ 2 3 1 }{ X2 }={ 4 }
{ 1 1 3 }{ X3 } {-1 }
という問題をSOR法を用いてコンピュータ(fortran)で解け。ただし初期値は0とし許容誤差eps=10^-5とする。そこで私は次のようなプログラムで解きました。
____dimension a(20,20),b(20),x(20),x0(20)
____open(5,file='senkei.d')
____open(6,file='senkei.r')
____open(7,file='senkei.k')
____read(5,*)n,max,eps,u
____read(5,*)((a(i,j),i=1,n),j=1,n)
____read(5,*)(b(i),i=1,n)
____read(5,*)(x0(i),i=1,n)
____do i=1,n
____ad=a(i,i)
____a(i,i)=0.0
____b(i)=b(i)/ad
____do j=1,n
____a(i,j)=a(i,j)/ad
____end do
____end do
____do k=1,max
____do i=1,n
____w=0.0
____do j=1,n
____if(j.lt.i)x0(j)=x(j)
____w=w+a(i,j)*x0(j)
____end do
____x(i)=u*(b(i)-w)+(1-u)*x(i)
____write(7,10)x(i)
_10_format(3f10.5)
____end do
____w=0.0
____do i=1,n
____w=w+(x(i)-x0(i))**2
____end do
____w=sqrt(w/n)
____if(w.lt.eps)go to 20
____do i=1,n
____x0(i)=x(i)
____end do
____end do
____write(6,*)'error'
____go to 30
_20_write(6,*)'sulution'
____write(6,40)(x(i),i=1,n)
_40_format(3f15.5)
_30_stop
____end
max:最大繰り返し回数,u:緩和係数,a(i,j):係数行列,
b(i):既知項,x(i):未知項としました。データではeps=0.00001,max=50,緩和係数uは0.8から0.1ずつ増やして1.5までそれぞれ答えを求めました。私のプログラムではu=1.1の時7回で収束しました。しかしu=1.5の時3回で収束したのですが答えはかなりの誤差ありました。許容誤差eps=10^-5としたのになぜ誤差が大きいまま、しかも三回で収束してしまったのかわかりません。誰かわかる方いらっしゃったら教えていただけませんか?長々と申し訳ありません。お願いします。
お礼
friends=frdsはたまぁーに使っている人いますね、そういえば。 わたしは使わないんですけど^^; bkですかぁ…。bakって使っている人っていますか?