数値計算法 第6回 反復解法 2006年度 九州工業大学工学部電気電子工学コース用講義資料 講師:趙孟佑 [email protected] 1 ガウスの消去法の問題点 • ガウスの消去法 – 特異行列で無い限り必ず解ける – 方程式の数が大きくなると計算回数が増加する。 3 n に比例 nは未知数の数(元数) 3 • 反復解法 – ある程度の戦略をもてば、あてずっぽうにやっ ていった方が早く計算を終える時もある。 2 ヤコビの反復法 a11x1 a12x2 a13x3 a14x4 b1 a21x1 a22x2 a23x3 a24x4 b2 a31x1 a32x2 a33x3 a34x4 b3 a41x1 a42x2 a43x3 a44x4 b4 行列の対角項aii≠0の時、解を以下の繰り返しで求める。 (k ) (k ) (k ) b a x a x a x 13 3 14 4 x1(k1) 1 12 2 a11 (k ) (k ) (k ) b a x a x a x 23 3 24 4 x2(k1) 2 21 1 a22 (k1) b3 a31x1(k ) a32x2(k ) a34x4(k ) x3 a33 (k ) (k ) (k ) (k1) b4 a41x1 a42x2 a43x3 x4 a44 3 ヤコビの反復法 (k ) (k ) (k ) b a x a x a x 13 3 14 4 x1(k1) 1 12 2 a11 (k ) (k ) (k ) b a x a x a x 23 3 24 4 x2(k1) 2 21 1 a22 (k1) b3 a31x1(k ) a32x2(k ) a34x4(k ) x3 a33 (k ) (k ) (k ) (k1) b4 a41x1 a42x2 a43x3 x4 a44 収束判定は (1) n x(k1) x(k ) i i i1 は十分に小さな数(自分で決める) 4 ヤコビの反復法の収束条件 Ax b (2) 係数行列Aを下三角行列、上三角行列、対角行列の和で表す A L DU (3) a11 a12 a21 a22 A an1 an2 a11 0 0 a22 D 0 0 a1n a2n ann 0 0 a21 0 L an1 an2 0 a12 0 0 U 0 0 0 0 ann 0 0 0 a1n a2n 0 5 ヤコビの反復法の収束条件 (1)式の繰り返しは、以下の式で表せる。 (k1) (k) x Hx z (4) ここで、 (5) H D1(LU) 1 zD b (6) 反復回数Kで真値に達したとすると、 (7) x(K) Hx(K) z (4)-(7)より、 (k1) (K) (k ) (K) x x H(x x ) k回目の誤差 k+1回目の誤差 6 ヤコビの反復法の収束条件 x (k1) x (K) H(x k+1回目の誤差 (k ) x (K) ) k回目の誤差 よって、誤差は反復回数が一回増える毎に H倍になる。Hが全体的に1より小さければよい。 そのためには、 aij 1 ji aii (i 1,2, ,n) 行列の対角要素aiiが他の要素より遥かに 大きければよい。対角優位 7 ヤコビの反復法の収束条件 より正確には、ヤコビの反復法で収束するためには、 行列Hの全ての固有値の絶対値が1より小さくないと いけない。 収束の早さは、絶対値が最大の固有値λmaxの値で決ま る。最大の固有値が小さい程、収束が早い。 max 1 8 ヤコビの反復法の例 4x1 x2 x3 4 2x1 6x2 x3 8 x 2x 5x 7 2 3 1 4 A 2 1 1 6 2 1 1 5 0 1 1 4 0 0 D 0 6 0 LU 2 0 1 1 2 0 0 0 5 9 ヤコビの反復法の例 0 1 4 0 0 0 1 1 1 1 H J D (LU) 0 6 0 2 0 1 3 0 0 5 1 2 0 1 5 1 1 4 4 1 0 6 2 0 5 HJの固有値は、0.5281079,-0.26405±0.19156i なので収束する。 10 ヤコビの反復法の例 回数 誤差 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2.51667 0.80000 0.26167 0.12264 0.06761 0.03543 0.01863 0.00990 0.00520 0.00276 0.00145 0.00077 0.00041 0.00021 0.00011 0.00006 x1 x2 x3 1.00000 1.25000 1.01667 1.05000 0.99292 1.00931 0.99650 1.00216 0.99891 1.00058 0.99969 1.00016 0.99991 1.00004 0.99998 1.00001 -1.00000 -1.66667 -2.01667 -1.97500 -2.01722 -1.99431 -2.00449 -1.99814 -2.00113 -1.99944 -2.00030 -1.99984 -2.00008 -1.99996 -2.00002 -1.99999 0.00000 1.60000 1.81667 2.00333 1.98000 2.00831 1.99586 2.00249 1.99883 2.00067 1.99966 2.00018 1.99990 2.00005 1.99997 2.00001 11 Jacobiの反復法の例 implicit real*8 (a-h,o-z) parameter(nmax=3) dimension a(nmax,nmax) real*8 lu dimension lu(nmax,nmax),dinv(nmax,nmax) dimension h(nmax,nmax) dimension x(nmax),b(nmax),z(nmax),xnew(nmax) do i=1,n do j=1,n if(i.ne.j)then lu(i,j)=a(i,j) dinv(i,j)=0 else lu(i,j)=0 dinv(i,j)=1/a(i,j) end if end do end do do i=1,n z(i)=b(i)*dinv(i,i) end do c a(1,1)=4 a(1,2)=1 a(1,3)=1 a(2,1)=2 a(2,2)=6 a(2,3)=1 a(3,1)=1 a(3,2)=2 a(3,3)=5 b(1)=4 b(2)=-8 b(3)=7 x(1)=1 x(2)=-1 x(3)=0 c n=3 itermax=100 errlim=1.d-4 c do i=1,n do j=1,n sum=0 do ii=1,n sum=sum+dinv(i,ii)*lu(ii,j) end do h(i,j)=-sum end do end do c c iter=0 10 continue iter=iter+1 do i=1,n xnew(i)=z(i) do j=1,n xnew(i)=xnew(i)+h(i,j)*x(j) end do end do c error=0 do i=1,n error=error+abs(xnew(i)-x(i)) end do c write(6,200)iter,error,(x(i),i=1,n) 200 format(i4,4f12.5) if(error.lt.errlim)goto 100 if(iter.lt.itermax)then do i=1,n x(i)=xnew(i) end do goto 10 end if 100 continue stop end 12 Gauss Seidel法 a11x1 a12x2 a13x3 a14x4 b1 a21x1 a22x2 a23x3 a24x4 b2 a31x1 a32x2 a33x3 a34x4 b3 a41x1 a42x2 a43x3 a44x4 b4 行列の対角項aii≠0の時、解を以下の繰り返しで求める。 (k ) (k ) (k ) b a x a x a x 13 3 14 4 x1(k1) 1 12 2 a11 (k1) (k ) (k ) b a x a x a x 23 3 24 4 x2(k1) 2 21 1 a22 (k1) b3 a31x1(k1) a32x2(k1) a34x4(k ) x3 a33 (k1) a42x2(k1) a43x3(k1) (k1) b4 a41x1 x4 a44 13 Gauss-Seidel法 • Jacobiの方法では、k+1番目の解(x1,x2,x3,--xn)を全 て、k番目の解に基づいて決める。 • Gauss-Seidel法では、k+1番目の解(x1,x2,x3,--xn)を 求める際、k+1番目が既に求まっているものは、 それを使う。 – より最新の解を使って計算する – 収束が速い • Jacobiの反復法で収束するなら、Gauss-Seidel法 でも収束する • 通常は、Jacobi法を使うくらいなら、GaussSeidel法を使う。 14 Gauss-Seidel法の例 4x1 x2 x3 4 2x1 6x2 x3 8 x 2x 5x 7 2 3 1 回数 誤差 1 2 3 4 5 6 7 2.85000 0.63333 0.05681 0.00877 0.00106 0.00011 0.00001 x1 x2 1.00000 -1.00000 1.25000 -1.75000 0.97500 -1.96667 0.99375 -1.99653 0.99917 -1.99970 0.99991 -1.99998 0.99999 -2.00000 x3 0.00000 1.85000 1.99167 1.99986 2.00005 2.00001 2.00000 15 Gauss-Seidel法の例 implicit real*8 (a-h,o-z) parameter(nmax=3) dimension a(nmax,nmax) dimension x(nmax),b(nmax),xold(nmax) c a(1,1)=4 a(1,2)=1 a(1,3)=1 a(2,1)=2 a(2,2)=6 a(2,3)=1 a(3,1)=1 a(3,2)=2 a(3,3)=5 b(1)=4 b(2)=-8 b(3)=7 x(1)=1 x(2)=-1 x(3)=0 c n=3 itermax=100 errlim=1.d-4 c do i=1,n xold(i)=x(i) end do iter=0 c 10 continue iter=iter+1 c do i=1,n rhs=b(i) do j=1,n if(i.ne.j)then rhs=rhs-a(i,j)*x(j) end if end do x(i)=rhs/a(i,i) end do c error=0 do i=1,n error=error+abs(x(i)-xold(i)) end do c write(6,200)iter,error,(xold(i),i=1,n) 200 format(i4,4f12.5) if(error.lt.errlim)goto 100 if(iter.lt.itermax)then do i=1,n xold(i)=x(i) end do goto 10 end if 100 continue stop end 16 Jacobi法とGauss-Seidel法の収束の比較 101 Gauss-Seidel Jacobi 100 10-1 -2 10 誤差 10-3 10-4 10-5 10-6 0 5 10 反復回数 15 20 17 加速緩和法 • Gauss-Seidel法よりも収束を更に早める方法 • Gauss-Seidel法でxik+1を求める。 • xikとxik+1の差を使って、次式で補正したyiを使っ て、次のステップに進む。 x x x x y1 x1(k) y2 x2(k) (k) y x 3 3 (k) y x 4 4 (k 1) 1 x1(k) (k 1) 2 x2(k) (k 1) 3 x3(k) (k1) 4 x4(k) αは加速係数 α=1でGauss-Seidel法と一致する。 0<α<2の範囲で最適な加速係数を決める 18 加速緩和法の例 4x1 x2 x3 4 2x1 6x2 x3 8 x 2x 5x 7 2 3 1 α=0.9の時、 回数 誤差 1 2.56500 2 3 4 5 6 7 0.78150 0.09553 0.01632 0.00252 0.00033 0.00004 x1 1.00000 1.22500 1.00000 0.99438 0.99869 0.99979 0.99997 x2 -1.00000 -1.67500 -1.93750 -1.99062 -1.99879 -1.99986 -1.99999 x3 0.00000 1.66500 1.95900 1.99577 1.99962 1.99997 2.00000 19 加速緩和法の例 α=1.5の時、 回数 誤差 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 4.27500 2.01250 1.09146 0.53257 0.26777 0.13375 0.06688 0.03344 0.01672 0.00836 0.00418 0.00209 0.00105 0.00052 0.00026 0.00013 0.00007 x1 x2 x3 1.00000 -1.00000 0.00000 1.37500 -2.12500 2.77500 0.77500 -1.88750 1.60000 1.10313 -2.05104 2.19979 0.94719 -1.97403 1.90017 1.02628 -2.01295 2.04993 0.98685 -1.99352 1.97504 1.00657 -2.00324 2.01248 0.99671 -1.99838 1.99376 1.00164 -2.00081 2.00312 0.99918 -1.99960 1.99844 1.00041 -2.00020 2.00078 0.99979 -1.99990 1.99961 1.00010 -2.00005 2.00020 0.99995 -1.99997 1.99990 1.00003 -2.00001 2.00005 0.99999 -1.99999 1.99998 20 加速係数 4x1 x2 x3 4 2x1 6x2 x3 8 x 2x 5x 7 2 3 1 誤差が10-4より小さくなるのに要する反復回数 20 Gauss-Seidel 15 反復回数 10 5 0 0.4 0.6 0.8 1 1.2 加速係数、α 1.4 1.6 最適なαの値は、解くべき式によって異なる。 21 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) • 今までに習ったニュートン法と行列計算で、実際の研究 上の問題の多くに対応できる。 • 例:反応計算 • 以下の反応があったとする – 2H2+O2<->2H2O – この反応は反応係数が温度に依存する。ある温度での H2,O2,H2Oの割合は以下の3個の連立式で成り立つ ax12 x2 bx32 0 2x2 x3 c 2x 2x d 3 1 22 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) ax12 x2 bx32 0 2x2 x3 c 2x 2x d 3 1 x1:H2分子の数 x2:O2分子の数 x3:H2O分子の数 a:2H2+O2->2H2Oの反応係数 b:2H2O->2H2+O2の反応係数 c:O2原子の数 d:H2原子の数 23 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) ax12 x2 bx32 0 2x2 x3 c 2x 2x d 3 1 • 上の連立方程式は、そのままでは行列の形に表せない。 • Newton法を用いるために、 f (x1, x2 , x3 ) ax12 x2 bx32 g(x1, x2 , x3 ) 2x2 x3 c h(x , x , x ) 2x 2x d 1 3 1 2 3 とおいて、3個の関数、f,g,hが全て0になる x1,x2,x3の組み合わせを探す。 24 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) • 各関数をx1,x2,x3の周りにTaylor展開して、 f f f f (x1 x1, x2 x2 , x3 x3 ) f (x1, x2 , x3 ) x x1 x x2 x x3 1 2 3 g g g x1 x2 x3 g(x1 x1, x2 x2 , x3 x3 ) g(x1, x2 , x3 ) x1 x2 x3 h h h x1 x2 x3 h(x1 x1, x2 x2 , x3 x3 ) h(x1, x2 , x3 ) x1 x2 x3 2次以上の項を無視し、左辺を0とすると、 25 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) f f f x x1 x x2 x x3 f (x1, x2 , x3 ) 2 3 1 g g g x2 x3 g(x1, x2 , x3 ) x1 x2 x3 x1 h h h x2 x3 h(x1, x2 , x3 ) x1 x2 x3 x1 • kステップ目からk+1ステップ目に動かす解の移動 量δx1,δx2,δx3を求める連立一次方程式になる。 • 但し、係数はその都度変化する。 26 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) f (x1, x2 , x3 ) ax12 x2 bx32 g(x1, x2 , x3 ) 2x2 x3 c h(x , x , x ) 2x 2x d 1 3 1 2 3 において、 f f 2 f x 2ax1x2 , x ax1 , x 2bx3 2 3 1 g g g 0, 2, 1 x2 x3 x1 h h h 2, 0, 2 x2 x3 x1 27 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) δx1,δx2,δx3は以下の式により求まる。 2ax1x2 x1 ax12 x2 2bx3 x3 ax12 x2 bx32 2 x2 x3 2x2 x3 c 2 x1 2 x3 2x1 2x3 d 行列形式に直すと、 2ax1k x2k ax1k2 2bx3k x1 ax1k2 x2k bx3k2 k k 2 1 x2 2x2 x3 c 0 k k 2 0 2 x3 2x1 2x3 d 28 高次連立方程式の解法 (ニュートン法と行列計算の組み合わせ例) 2ax1k x2k ax1k2 2bx3k x1 ax1k2 x2k bx3k2 k k 2 1 x2 2x2 x3 c 0 2 2x1k 2x3k d 0 2 x3 • 行列の係数や、右辺はk番目のx1,x2,x3とその他の定数 a,b,c,dで決まる。上の行列から、 δx1,δx2,δx3を求め て、k+1番目の値を以下のように決める。 x1k1 x1k x1 k1 k x2 x2 x2 k xk1 x 3 x 3 3 k+1番目の値とk番目の値が変わらなくなるまで計算を行う。 29
© Copyright 2024 ExpyDoc