質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

1回答

791閲覧

Newton-Raphson 法の減速法のコードの書き方(FORTRAN)

Yoshi1416

総合スコア2

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2022/10/31 05:31

前提

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の部分が終わらないので永遠に計算が続くとのことですが、どのようにコードを直せばいいのかわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chirimen

2022/11/01 04:53 編集

やろうとしている減速法とやらの内容を説明してください。 たぶんだけど X2 は do while ループの中で再計算しないといけないとかじゃないですか? do while ループの中で、X1, X2, CC などを表示させて数値の動きを確認するとよいです。
Yoshi1416

2022/11/01 06:05

コメントありがとうございます。減速法というのは解近傍の初期値x0から出発して、減速パラメータCC (CCはABS(FUN())<(1-CC/4)*ABS(FUN())の条件を満たす) のついた反復計算X2=X1-CC*FUN()/DIVFUN()を繰り返すことで近似解へ収束させるという計算方法です。
Yoshi1416

2022/11/01 06:37

DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB)))の部分を >= → > へと変えたところ解決しました。ありがとうございました。
chirimen

2022/11/01 06:44

DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB))) のところで、FUN1() の値がループで変化していません。 これだと CC が単純な1次不等式を解くことで求めることができて、 0<CC/4<1 を満たす CC がない場合がでてきます。
Yoshi1416

2022/11/02 01:53

ありがとうございます。修正してみます。
guest

回答1

0

自己解決

DO WHILE(ABS(FUN1(X2,AA,BB))>=(1-CC/4)*ABS(FUN1(X1,AA,BB)))の部分を>= → > へと変えたところ解決しました。

投稿2022/11/01 06:38

Yoshi1416

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問