前提
fortranで次の非線形方程式 f(x)=tanh(x)+0.2x+0.3= 0 の数値解をNewton-Raphson 法を用いて計算しました。この時、初期値をx=1.3に設定すると解が収束しないので、減速法を用いて解を求めようとしましたが、計算がループしてしまい上手くいきません。
実現したいこと
非線形方程式 f(x)=tanh(x)+0.2x+0.3= 0 の数値解を、初期値をx=1.3に設定し、減速法を用いて求める。
発生している問題・エラーメッセージ
計算が終わらない(ループしている)。
該当のソースコード
FORTRAN
1PROGRAM suutikeisann 2IMPLICIT REAL(A-H,O-Z) 3EXTERNAL FUN1,DIVFUN1 4DIMENSION X_D(50,3) 5 6DATA EPS/1.E-7/ 7 8AA=0.2 9BB=0.3 10CC=1.0 11 12WRITE(*,*) ' ' 13WRITE(*,*) ' N X2 F(X2) REL_ERROR ' 14 15AA=0.2 16BB=0.3 17CC=1.0 18XX=1.3 19X1=XX 20DO N=1,100 21 CC=1.0 22 X2=X1-CC*FUN1(X1,AA,BB)/DIVFUN1(X1,AA) 23 24 DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB))) 25 CC=CC*0.5 26 ENDDO 27 28 EPSD=ABS(X2-X1) 29 EPSX=ABS(EPSD/X1) 30 31 WRITE(*,120) N,X2,FUN1(X2,AA,BB),EPSX 32120 FORMAT(' ',I3,5E17.7) 33 34 IF(EPSX.LT.EPS) EXIT 35 X1=X2 36 37ENDDO 38 39WRITE(*,*) ' ' 40 41END 42 43REAL FUNCTION FUN1(X,AA,BB) 44 45IMPLICIT REAL(A-H,O-Z) 46 47FUN1=tanh(X)+AA*X+BB 48 49RETURN 50END 51 52REAL FUNCTION DIVFUN1(X,AA) 53 54IMPLICIT REAL(A-H,O-Z) 55 56DIVFUN1=(1/cosh(X))**2+AA 57 58RETURN 59END 60 61 62 63
試したこと
周りの人にアドバイスを求めたところ、DO WHILEの部分が終わらないので永遠に計算が続くとのことですが、どのようにコードを直せばいいのかわかりません。
やろうとしている減速法とやらの内容を説明してください。
たぶんだけど X2 は do while ループの中で再計算しないといけないとかじゃないですか?
do while ループの中で、X1, X2, CC などを表示させて数値の動きを確認するとよいです。
コメントありがとうございます。減速法というのは解近傍の初期値x0から出発して、減速パラメータCC
(CCはABS(FUN())<(1-CC/4)*ABS(FUN())の条件を満たす)
のついた反復計算X2=X1-CC*FUN()/DIVFUN()を繰り返すことで近似解へ収束させるという計算方法です。
DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB)))の部分を
>= → > へと変えたところ解決しました。ありがとうございました。
DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB)))
のところで、FUN1() の値がループで変化していません。
これだと CC が単純な1次不等式を解くことで求めることができて、
0<CC/4<1 を満たす CC がない場合がでてきます。
ありがとうございます。修正してみます。
回答1件
あなたの回答
tips
プレビュー