0

我正在尝试解决一个涉及指数总和相等的问题。

这就是我将如何进行硬编码:

@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 的幂,然后我遇到了同样的向量化问题。

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

4

1 回答 1

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])))
于 2018-06-16T13:02:59.013 回答