Optimization @NLConstraint与矢量化约束跳转/Julia

Optimization @NLConstraint与矢量化约束跳转/Julia,optimization,julia-jump,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[

我试图解决一个涉及指数和相等的问题

以下是我将如何进行硬编码:

@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))
不会抛出错误

我想做的另一件事是泰勒级数展开,但这也带来了一个问题,因为当幂大于2时,它会进入
@NLconstraint
land,然后我会遇到同样的矢量化问题


所以我觉得被卡住了,我觉得如果跳转允许对
@NLconstraint
进行向量化评估,就像对
@constraint
一样,这甚至不是问题。另一个修复方法是,如果JuMP实现了自己的exp函数,允许对
JuMP.Variable
类型进行幂运算。然而,就目前情况而言,我看不到使用跳转框架解决这个问题的方法。你们中有谁有办法解决这个问题吗?我缺少任何聪明的解决方法吗?

我不明白为什么在您编写的表达式中没有使用
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])))

是的,没错。我修复了这个问题,但是,我仍然得到一个错误:error:LoadError:exp没有为类型变量定义。你是在试图建立一个非线性问题吗?请确保使用@NLconstraint/@NLobjective…以下是更新的代码:
@NLconstraint(m[k=1:length(lhsum)],sum(exp.(lhsum[k][i])表示i=1:length(LHSSum[k])==sum(exp.(RHSSum[k][i])表示i=1:length(RHSSum[k])
如果我理解正确,
lhsum[k][i]是一个标量跳转变量。您应该能够编写
exp(lhsum[k][i])
而不是
exp.(lhsum[k][i])