我在Python中定义了一个插值函数:
rbfX = sp.interpolate.Rbf(X2, Y2, Wx2, function='multiquadric')
我想在Pyomo代码中使用它,其中m.lammda[i,1]
和m.phi[i,1]
是在前面插值表示的风场中移动的飞机的位置。注意m
是一个具体模型,
type(m.lammda)
Out[7]: pyomo.core.base.var.IndexedVar
我当前尝试的解决方案是
def Wind_lammda_definition1(model, i):
abcdX=float(m.lammda[i,1])
abcdY=float(m.phi[i,1])
return m.Wind_lammda[i,1] ==rbfX(abcdX, abcdY)
m.Wind_lammda_const1 = Constraint(m.N, rule = Wind_lammda_definition1)
因为我想知道轨迹上任意一点的风速
当我运行程序时,我得到这个错误:
ERROR: Rule failed when generating expression for Constraint
Wind_lammda_const1 with index 0: TypeError: Implicit conversion of Pyomo
NumericValue type `lammda[0,1]' to a float is disabled. This error is
often the result of using Pyomo components as arguments to one of the
Python built-in math module functions when defining expressions. Avoid
this error by using Pyomo-provided math functions.
ERROR: Constructing component 'Wind_lammda_const1' from data=None failed:
TypeError: Implicit conversion of Pyomo NumericValue type `lammda[0,1]' to
a float is disabled. This error is often the result of using Pyomo
components as arguments to one of the Python built-in math module
functions when defining expressions. Avoid this error by using Pyomo-
provided math functions.
Traceback (most recent call last):
File "D:whatevernode1_test.py", line 530, in <module>
m.Wind_lammda_const1 = Constraint(m.N, rule = Wind_lammda_definition1)
TypeError: Implicit conversion of Pyomo NumericValue type `lammda[0,1]' to a float is
disabled. This error is often the result of using Pyomo components as
arguments to one of the Python built-in math module functions when
defining expressions. Avoid this error by using Pyomo-provided math
functions.
如果我调用m.lammda[i,1]
和m.phi[i,1]
作为参数而不是abcdX
和abcY
,错误仍然出现。
我需要知道我是否能以某种方式使这段代码工作。我已经阅读了文档。在第339到340页,它讨论了插值,但我对Pyomo和Python不够熟悉,无法理解它,所以请,如果有人帮助我,我将非常感激。
很多信息从这和你的另一个线程。我将尽我所能处理一切。
问题不是将pyomo.IndexedVar
转换为float
,因为当您在pyomo
模型中创建变量时,您可以将其作为NonNegativeReal
。这个问题不是一个数字的隐式转换(在您的代码中,m.lammda[i,1]
是一个类,而不是一个数字)。即使它有一个浮点值)与float
语句。
当你在你的评论在另一个线程,当你试图使用pyomo.environ.IndexedVar
到配件(插值)Rbf函数,你提高错误TypeError
试图把一个IndexedVar
float
Rbf函数(内部)。要计算该值,您可以使用model.m.lammda[i,1]()
,因为调用该类将返回该值,但这仍然没有帮助,因为另一个错误肯定会引发
我建议你访问这篇文章,以获得更多关于使用外部函数作为pyomo
约束或目标函数的潜在困难的信息
Pyomo
有一个分段函数库,您可以在其中建模线性(pyo.environ
层也在pyo.environ.Piecewise
中得到它)或多线性插值,但您需要使用内核层,它使用scipy生成插值的Dlunay,您可以使用help(pyomo.kernel.piecewise_nd)
进行检查。这当然对你有用,但它需要一点努力。