ルンゲ・クッタ法を用いた常微分方程式

Fortranによるサンプルソースコード : 使用ルーチン名:d02pcf

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > ルンゲ・クッタ法を用いた常微分方程式

Keyword: 常微分方程式, ルンゲ・クッタ法

概要

本サンプルはルンゲ・クッタ法を用いて常微分方程式を解くFortranによるサンプルプログラムです。 本サンプルは以下に示される方程式を解いて結果を出力します。

ルンゲ・クッタ法のデータ 

※本サンプルはnAG Fortranライブラリに含まれるルーチン d02pcf() のExampleコードです。本サンプル及びルーチンの詳細情報は d02pcf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本ルーチンの詳細はd02pcf のマニュアルページを参照)
1
2
3
4
5
6
7

このデータをダウンロード
D02PCF Example Program Data
   1                              : method
   0.0  6.28318530717958647692    : tstart, tend
   0.0  1.0                       : ystart(1:neq)
   0.0                            : hstart
   1.0E-8  1.0E-8                 : thres(1:neq)
   .FALSE.                        : errass

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目は使用されるルンゲ・クッタ法(method=1:2(3)ペアを使用)を指定しています。 
  • 3行目は独立変数xの初期値(tstart)と最終値(tend)を指定しています。
  • 4行目は解の初期値(ystart)を指定しています。
  • 5行目は積分の最初のステップのサイズ(hstart)を指定しています。
  • 6行目は閾値のベクトル(thres)を指定しています。
  • 7行目は大域的誤差評価が計算されるかどうか(errass=.FALSE.:計算されない)を指定しています。

出力結果

(本ルーチンの詳細はd02pcf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

この出力例をダウンロード
 D02PCF Example Program Results

 Calculation with TOL =  0.1E-02

    t         y1        y2

  0.000     0.000     1.000
  0.785     0.707     0.707
  1.571     0.999     0.000
  2.356     0.706    -0.706
  3.142     0.000    -0.999
  3.927    -0.706    -0.706
  4.712    -0.998     0.000
  5.498    -0.705     0.706
  6.283     0.001     0.997

 Cost of the integration in evaluations of F is   124

 Calculation with TOL =  0.1E-03

    t         y1        y2

  0.000     0.000     1.000
  0.785     0.707     0.707
  1.571     1.000     0.000
  2.356     0.707    -0.707
  3.142     0.000    -1.000
  3.927    -0.707    -0.707
  4.712    -1.000     0.000
  5.498    -0.707     0.707
  6.283     0.000     1.000

 Cost of the integration in evaluations of F is   235

  • 3行目には誤差許容値が出力されています。
  • 7~15行目に独立変数と誤差許容値 0.1e-002 の場合の解が出力されています。
  • 17行目には最初の積分で使用されたユーザ提供関数 f の評価の数が出力されています。
  • 19行目には誤差許容値が出力されています。
  • 23~31行目に独立変数と誤差許容値 0.1e-003 の場合の解が出力されています。
  • 33行目には最初の積分で使用されたユーザ提供関数 f の評価の数が出力されています。

ソースコード

(本ルーチンの詳細はd02pcf のマニュアルページを参照)

※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

このソースコードをダウンロード
!   D02PCF Example Program Text
!   Mark 23 Release. nAG Copyright 2011.

    MODULE d02pcfe_mod

!      D02PCF Example Program Module:
!             Parameters and User-defined Routines

!      .. Use Statements ..
       USE nag_library, ONLY : nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       REAL (KIND=nag_wp), PARAMETER       :: tol1 = 1.0E-3_nag_wp
       REAL (KIND=nag_wp), PARAMETER       :: tol2 = 1.0E-4_nag_wp
       INTEGER, PARAMETER                  :: neq = 2, nin = 5, nout = 6,      &
                                              npts = 8
       INTEGER, PARAMETER                  :: lenwrk = 32*neq
    CONTAINS

       SUBROUTINE f(t,y,yp)

!         .. Implicit None Statement ..
          IMPLICIT NONE
!         .. Scalar Arguments ..
          REAL (KIND=nag_wp), INTENT (IN)     :: t
!         .. Array Arguments ..
          REAL (KIND=nag_wp), INTENT (IN)     :: y(*)
          REAL (KIND=nag_wp), INTENT (OUT)    :: yp(*)
!         .. Executable Statements ..
          yp(1) = y(2)
          yp(2) = -y(1)
          RETURN
       END SUBROUTINE f
    END MODULE d02pcfe_mod

    PROGRAM d02pcfe

!      D02PCF Example Main Program

!      .. Use Statements ..
       USE nag_library, ONLY : d02pcf, d02pvf, d02pyf, nag_wp
       USE d02pcfe_mod, ONLY : f, lenwrk, neq, nin, nout, npts, tol1, tol2
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Local Scalars ..
       REAL (KIND=nag_wp)                  :: hnext, hstart, tend, tgot, tinc, &
                                              tol, tstart, twant, waste
       INTEGER                             :: i, ifail, j, method, stpcst,     &
                                              stpsok, totf
       LOGICAL                             :: errass
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE     :: thres(:), work(:), ygot(:),      &
                                              ymax(:), ypgot(:), ystart(:)
!      .. Intrinsic Functions ..
       INTRINSIC                              real
!      .. Executable Statements ..
       WRITE (nout,*) 'D02PCF Example Program Results'
!      Skip heading in data file
       READ (nin,*)
       READ (nin,*) method
       ALLOCATE (thres(neq),work(lenwrk),ygot(neq),ymax(neq),ypgot(neq), &
          ystart(neq))

!      Set initial conditions and input for D02PVF

       READ (nin,*) tstart, tend
       READ (nin,*) ystart(1:neq)
       READ (nin,*) hstart
       READ (nin,*) thres(1:neq)
       READ (nin,*) errass

!      Set control for output

       tinc = (tend-tstart)/real(npts,kind=nag_wp)

LOOP:  DO i = 1, 2
          IF (i==1) THEN
             tol = tol1
          ELSE
             tol = tol2
          END IF

!         ifail: behaviour on error exit   
!                =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
          ifail = 0
          CALL d02pvf(neq,tstart,ystart,tend,tol,thres,method,'Usual Task', &
             errass,hstart,work,lenwrk,ifail)

          WRITE (nout,99999) tol
          WRITE (nout,99998)
          WRITE (nout,99997) tstart, ystart(1:neq)
          twant = tstart
          DO j = 1, npts
             twant = twant + tinc

             ifail = -1
             CALL d02pcf(f,twant,tgot,ygot,ypgot,ymax,work,ifail)

             WRITE (nout,99997) tgot, ygot(1:neq)
          END DO

          ifail = 0
          CALL d02pyf(totf,stpcst,waste,stpsok,hnext,ifail)
          WRITE (nout,99996) totf

       END DO LOOP

99999  FORMAT (/' Calculation with TOL = ',E8.1)
99998  FORMAT (/'    t         y1        y2'/)
99997  FORMAT (1X,F6.3,2(3X,F7.3))
99996  FORMAT (/' Cost of the integration in evaluations of F is',I6)
    END PROGRAM d02pcfe


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks