首页 > 解决方案 > 在 Pyomo 目标中使用 numpy 通用函数

问题描述

我在 Pyomo 中使用 numpy 函数(例如 numpy sqrtufunc )时遇到问题Objective

采用以下虚拟模型:

simple_model_1 = ConcreteModel()
simple_model_1.x = Var(domain=PositiveReals)
def simple_rule_1(m):
    return np.sqrt(m.x)
simple_model_1.obj = Objective(rule=simple_rule_1)

这失败并出现以下错误:

TypeError:ufunc 的循环不支持 NoneType 类型的参数 0,它没有可调用的 sqrt 方法

当然,在这个例子中,我可以通过不使用 Numpy 来避免这个问题。例如:

simple_model_2 = ConcreteModel()
simple_model_2.x = Var(domain=PositiveReals)
def simple_rule_2(m):
    return m.x**0.5
simple_model_2.obj = Objective(rule=simple_rule_2)

工作得很好。

但是,在某些情况下,我想使用 numpy。在 pyomo 目标函数中使用 numpy 函数是否有限制?我究竟做错了什么?

标签: numpypyomo

解决方案


np.sqrt使用数字 numpy 数组使用快速编译计算。但如果给定别的东西,它会先做np.array(m.x)

如果这产生了一个对象dtype数组,它将迭代并尝试使用该sqrt对象的方法。

该错误告诉我们它m.xNone或包含None值。显然None.sqrt()行不通。


推荐阅读