nconf
IMSL ライブラリの関数を使用して、制約付き非線形最適化問題を解きました。発生したエラーを説明するために問題を単純化しました。
目的関数はlog(x1 * x2 - x3 ^ 2)
です。制約はx1 * x2 - x3 ^ 2 > 0
. Fortran コードは次のとおりです。
program main
use IMSL
integer IBTYPE, IPRINT, M, MAXITN, ME, N
parameter (IBTYPE = 0, IPRINT = 0, M = 1, MAXITN = 100, ME = 0, N = 3)
real FVALUE, X(N), XGUESS(N), XLB(N), XSCALE(N), XUB(N)
external FCN
data XGUESS/10.0E0, 10.0E0, 2.0E0/, XSCALE/3*1.0E0/
data XLB/1.0E-6, 1.0E-6, 1E-6/, XUB/50, 50, 50/
!open(44, file = "test.txt", status = "unknown")
call NCONF(FCN, M, ME, N, XGUESS, IBTYPE, XLB, XUB, XSCALE, IPRINT, MAXITN, X, FVALUE)
!write(*, *) X
end program
subroutine FCN(M, ME, N, X, ACTIVE, F, G)
integer M, ME, N
real X(3), F, G(*)
logical ACTIVE(*)
ACTIVE(1) = .TRUE.
!write(44, *) x
F = log(x(1) * x(2) - x(3) ** 2)
!write(44, *) F
IF(ACTIVE(1)) G(1) = X(1) * x(2) - x(3) ** 2
return
end subroutine
コードを実行すると、制約が機能しません。 nconf
を検索します(x1, x2, x3)
がx1 * x2 - x3 ^ 2 < 0
、プログラムは例外をスローします。x1 * x2 - x3 ^ 2
関数にありlog
ます。マイナスにはなりません。制約が機能する場合、x1 * x2 - x3 ^ 2
負であってはなりません。nconf 関数の検索ポイント x と制約のしくみがわかりません。