pyomo / Ipopt : Error evaluating constraint 1: can‘t evaluate pow‘(0,0.5).

问题描述

当利用pyomo与ipopt求解的非线性凸优化问题形式类似以下形式时:
min ⁡ ∑ i = 0 N − 1 x i s . t .   x ≥ 1.0 \min \sum_{i=0}^{N-1} x_i \\ s.t. \text{ } \sqrt{x}\geq 1.0 mini=0N1xis.t. x 1.0

from pyomo.environ import *
from pyomo.dae import *
N = 5
m = ConcreteModel()
m.s = Var(RangeSet(0, N-1))
m.s_cons = Constraint(RangeSet(0, N-1), rule=lambda m, i: m.s[i]**(0.5) >= 1.0)
m.obj = Objective(expr=sum(m.s[i] for i in RangeSet(0, N-1)), sense=minimize)
%time SolverFactory('ipopt').solve(m)

会报错Error evaluating constraint 1: can't evaluate pow'(0,0.5).
在这里插入图片描述

问题分析

错误提示信息为Error evaluating constraint 1: can't evaluate pow'(0,0.5).,也即无法评估pow'(0, 0.5)。此函数中的'字符表示一阶导数。我们对 x \sqrt{x} x 求导得 1 2 x \frac{1}{2\sqrt{x}} 2x 1。此时如果 x = 0 x=0 x=0时,计算机求得 x \sqrt{x} x 导数的值。所以才会报错。我们发现 x n x^{n} xn中的 n < 1 n<1 n<1时,都会出现以上错误。

解决方法

x n x^{n} xn中的 n < 1 n<1 n<1时,将变量绑定到非零值:m.s = Var(RangeSet(0, N-1), bounds=(1e-20,None))

from pyomo.environ import *
from pyomo.dae import *
N = 5
m = ConcreteModel()
m.s = Var(RangeSet(0, N-1), bounds=(1e-20,None))
m.s_cons = Constraint(RangeSet(0, N-1), rule=lambda m, i: m.s[i]**(0.5) >= 1.0)
m.obj = Objective(expr=sum(m.s[i] for i in RangeSet(0, N-1)), sense=minimize)
%time SolverFactory('ipopt').solve(m)
m.display()
print("the opt x is:", [m.s[i]() for i in range(N)])

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

windSeS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值