Keyword: シンプレックス法, 関数の最小化
概要
本サンプルはシンプレックス法による関数の最小化を行うFortranによるサンプルプログラムです。 本サンプルはNelder-Meadシンプレックス法により以下に示される関数の最小値を求めて出力します。本サンプルではx1とx2の初期値を(−1.0,1.0)として計算しています。
※本サンプルはnAG Fortranライブラリに含まれるルーチン e04cbf() のExampleコードです。本サンプル及びルーチンの詳細情報は e04cbf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
出力結果
(本ルーチンの詳細はe04cbf のマニュアルページを参照)1 2 3 4
この出力例をダウンロード |
E04CBF Example Program Results The final function value is 0.0000 at the point 0.5000 -0.9999
- 3行目に最小の関数値が出力されています。
- 4行目に最小の関数値に対応するxの値が出力されています。
ソースコード
(本ルーチンの詳細はe04cbf のマニュアルページを参照)
※本サンプルソースコードは科学技術・統計計算ライブラリである「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 114 115 116 117
このソースコードをダウンロード |
! E04CBF Example Program Text ! Mark 23 Release. nAG Copyright 2011. MODULE e04cbfe_mod ! E04CBF Example Program Module: ! Parameters and User-defined Routines ! .. Use Statements .. USE nag_library, ONLY : nag_wp ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nout = 6 CONTAINS SUBROUTINE funct(n,xc,fc,iuser,ruser) ! .. Implicit None Statement .. IMPLICIT NONE ! .. Scalar Arguments .. REAL (KIND=nag_wp), INTENT (OUT) :: fc INTEGER, INTENT (IN) :: n ! .. Array Arguments .. REAL (KIND=nag_wp), INTENT (INOUT) :: ruser(*) REAL (KIND=nag_wp), INTENT (IN) :: xc(n) INTEGER, INTENT (INOUT) :: iuser(*) ! .. Intrinsic Functions .. INTRINSIC exp ! .. Executable Statements .. fc = exp(xc(1))*(4.0_nag_wp*xc(1)*(xc(1)+xc(2))+2.0_nag_wp*xc(2)*(xc & (2)+1.0_nag_wp)+1.0_nag_wp) RETURN END SUBROUTINE funct SUBROUTINE monit(fmin,fmax,sim,n,ncall,serror,vratio,iuser,ruser) ! .. Implicit None Statement .. IMPLICIT NONE ! .. Scalar Arguments .. REAL (KIND=nag_wp), INTENT (IN) :: fmax, fmin, serror, vratio INTEGER, INTENT (IN) :: n, ncall ! .. Array Arguments .. REAL (KIND=nag_wp), INTENT (INOUT) :: ruser(*) REAL (KIND=nag_wp), INTENT (IN) :: sim(n+1,n) INTEGER, INTENT (INOUT) :: iuser(*) ! .. Executable Statements .. WRITE (nout,*) WRITE (nout,99999) ncall WRITE (nout,99998) fmin WRITE (nout,99997) WRITE (nout,99996) sim(1:(n+1),1:n) WRITE (nout,99995) serror WRITE (nout,99994) vratio RETURN 99999 FORMAT (1X,'There have been',I5,' function calls') 99998 FORMAT (1X,'The smallest function value is',F10.4) 99997 FORMAT (1X,'The simplex is') 99996 FORMAT (1X,2F10.4) 99995 FORMAT (1X,'The standard deviation in function values at the ', & 'vertices of the simplex is',F10.4) 99994 FORMAT (1X,'The linearized volume ratio of the current simplex', & ' to the starting one is',F10.4) END SUBROUTINE monit END MODULE e04cbfe_mod PROGRAM e04cbfe ! E04CBF Example Main Program ! .. Use Statements .. USE nag_library, ONLY : e04cbf, e04cbk, nag_wp, x02ajf USE e04cbfe_mod, ONLY : funct, monit, nout ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: n = 2 ! .. Local Scalars .. REAL (KIND=nag_wp) :: f, tolf, tolx INTEGER :: ifail, maxcal LOGICAL :: monitoring ! .. Local Arrays .. REAL (KIND=nag_wp) :: ruser(1), x(n) INTEGER :: iuser(1) ! .. Intrinsic Functions .. INTRINSIC sqrt ! .. Executable Statements .. WRITE (nout,*) 'E04CBF Example Program Results' ! Set MONITORING to .TRUE. to obtain monitoring information monitoring = .FALSE. x(1:n) = (/ -1.0_nag_wp, 1.0_nag_wp/) tolf = sqrt(x02ajf()) tolx = sqrt(tolf) maxcal = 100 ifail = 0 IF ( .NOT. monitoring) THEN CALL e04cbf(n,x,f,tolf,tolx,funct,e04cbk,maxcal,iuser,ruser,ifail) ELSE CALL e04cbf(n,x,f,tolf,tolx,funct,monit,maxcal,iuser,ruser,ifail) END IF WRITE (nout,*) WRITE (nout,99999) f WRITE (nout,99998) x(1:n) 99999 FORMAT (1X,'The final function value is',F12.4) 99998 FORMAT (1X,'at the point',2F12.4) END PROGRAM e04cbfe