带有矢量化约束的@NLConstraint JuMP / Julia

时间:2018-06-15 21:14:31

标签: optimization julia-jump

我正在尝试解决涉及指数和等于的问题。

这就是我硬编码的方式:

@NLconstraint(m, exp(x[25])==exp(x[14])+exp(x[18]))

这适用于其余代码。但是,当我尝试为上面的任意一组方程式执行此操作时,我得到一个错误。这是我的代码:

@NLconstraint(m,[k=1:length(LHSSum)],sum(exp.(LHSSum[k][i]) for i=1:length(LHSSum[k]))==sum(exp.(RHSSum[k][i]) for i=1:length(RHSSum[k])))

其中LHSSumRHSSum是包含需要取幂的元素数组的数组,然后求和。那是LHSSum[1]=[x[1],x[2],x[3],...,x[n]]。其中x[i]JuMP.Variable类型的变量。请注意length(LHSSum)=length(RHSSum)

返回的错误是:

LoadError: exp is not defined for type Variable. Are you trying to build a nonlinear problem? Make sure you use @NLconstraint/@NLobjective.

所以一个简单的解决方案是简单地在@NLconstraint函数之外进行所有取幂和求和,因此输入将是一个标量。但是,这也会出现问题,因为exp(x)未定义,因为x的类型为JuMP.variable,而exp则需要类型为real的类型。这很奇怪,因为当在@NLconstraint()内调用函数时,我能够很好地计算指数。即当我对此行@NLconstraint(m,exp(x)==exp(z)+exp(y))而不是前一行进行编码时,不会抛出任何错误。

我认为要做的另一件事是泰勒系列扩展,但这也是一个问题,因为它进入@NLconstraint大于2的幂,然后我陷入了相同的矢量化问题。 / p>

所以我感到困惑,我觉得如果JuMP允许@NLconstraint的矢量化评估,就像它对@constraint一样,这甚至都不是问题。另一个解决方法是,如果JuMP实现了它自己的exp函数,以允许JuMP.Variable类型的取幂。但是,因为我没有看到使用JuMP框架解决这个问题的方法。你们有没有解决这个问题的方法?我缺少任何聪明的解决方法吗?

1 个答案:

答案 0 :(得分:0)

我很困惑为什么i在您编写的表达式中没有使用。你的意思是:

@NLconstraint(m, [k = 1:length(LHSSum)],
              sum(exp(LHSSum[k][i]) for i in 1:length(LHSSum[k]))
              ==
              sum(exp(RHSSum[k][i]) for i in 1:length(RHSSum[k])))