在IMSL库中使用nconf函数时如何处理/处理此错误?

时间:2014-03-20 05:17:08

标签: fortran numerical-methods imsl

我在IMSL库中使用函数nconf来解决约束非线性优化问题。我简化了问题来描述发生的错误。

目标函数是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以及约束如何工作。

1 个答案:

答案 0 :(得分:1)

详细说明我的评论,求解器学习约束的唯一方法是通过“超出界限”,所以你应该非常期望超出界限值并优雅地处理它们。

执行此操作的典型方法是:

G(1) = X(1) * x(2) - x(3) ** 2
if(g(1).gt.0)then
    f=log(g(1))
else
    f=-10.e30 
endif

在越界范围内返回的内容可能无关紧要,但请查看imsl例程的文档,看看它是否说明了这一点。

顺便说一句,请注意,因为您对active(1)=.true.进行了硬编码,所以不需要if(active(1))..构造。

相关问题