我正在尝试解决一个涉及指数总和相等的问题。
这就是我将如何进行硬编码:
@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])))
其中LHSSum
和RHSSum
是包含需要求幂然后求和的元素数组的数组。那就是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 的幂,然后我遇到了同样的向量化问题。
所以我觉得卡住了,我觉得如果 JuMP 允许@NLconstraint
像它一样进行矢量化评估@constraint
,这甚至都不是问题。另一个解决方法是,如果 JuMP 实现它自己的 exp 函数以允许JuMP.Variable
类型的幂运算。但是,实际上我看不到使用 JuMP 框架解决这个问题的方法。你们有没有解决这个问题的方法?我缺少任何聪明的解决方法?