如何在pyomo-ipopt优化中实现Math.pow()?

问题描述 投票:0回答:2

我正在尝试针对给定任务优化电机选择,即双摆的摆动,似乎 ipopt 无法解决问题,因为它无法识别

我尝试实现 math.pow() 但这样做了

代码:

from math import pow

def _epsilon_max(M,n):
    return M.epsilon_max[n]* pow(M.ratio_motor[n],0.8) -1== 0   
m.epsilon_max_cons = Constraint(m.dofs,rule=_epsilon_max) 

输出:

TypeError:Pyomo NumericValue 类型的隐式转换 浮点数的“ratio_motor[1]”被禁用。此错误通常是由于在定义表达式时使用 Pyomo 组件作为 Python 内置数学模块函数之一的参数造成的。通过使用 Pyomo 提供的数学函数来避免此错误。

它不使用已实现的

pow
函数,它仅适用于整数

代码:

def _epsilon_max(M,n):
    return M.epsilon_max[n]*(M.ratio_motor[n])**0.8 -1== 0   
m.epsilon_max_cons = Constraint(m.dofs,rule=_epsilon_max)

输出:

Ipopt 3.12.11:评估约束1011时出错:无法评估 战俘'(0,0.8).

python-3.x pyomo ipopt
2个回答
0
投票

问题是模型评估错误,而不是不能有小数指数。您需要将

M.ratio_motor[n]
初始化为 0 以外的值。使用 Pyomo 实现的 pow 函数的第二个实现在其他方面是正确的。


0
投票

在输出中

can't evaluate pow'(0,0.8)
表示IPOPT无法在求解过程中计算一阶导数。定义边界并在定义中初始化该变量将解决该问题:

M.ratio_motor=Var(N,bounds=(1e-20,None),initialize=1e-20)
© www.soinside.com 2019 - 2024. All rights reserved.