我正在尝试解决涉及指数和等于的问题。
这就是我硬编码的方式:
@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的幂,然后我陷入了相同的矢量化问题。 / p>
所以我感到困惑,我觉得如果JuMP允许@NLconstraint
的矢量化评估,就像它对@constraint
一样,这甚至都不是问题。另一个解决方法是,如果JuMP实现了它自己的exp函数,以允许JuMP.Variable
类型的取幂。但是,因为我没有看到使用JuMP框架解决这个问题的方法。你们有没有解决这个问题的方法?我缺少任何聪明的解决方法吗?
答案 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])))