我可以将 pyomo 内部变量转换为 float

Can I convert pyomo internal variable to float

我在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:\whatever\node1_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] 作为参数而不是 abcdXabcY.

,错误仍然出现

我需要知道我是否可以以某种方式调整此代码以使其正常工作。我已经阅读了documentation。在第339到340页中谈到了插值,但我对Pyomo不够熟悉,也Python无法理解它,所以请,如果有人帮助我,我将非常感激。

很多信息来自这个和你的另一个线程。我会尽量处理好。

问题不在于将 pyomo.IndexedVar 转换为 float,因为当您在 pyomo 模型中创建变量时,您可以将其作为 NonNegativeReal 进行。这个问题是用 float 语句隐式转换不是数字(在你的代码中,m.lammda[i,1] 是一个 class,不完全是一个数字。即使它有一个浮点值) .

正如您在另一个线程中所述 ,当您尝试将 pyomo.environ.IndexedVar 用于拟合(插值)函数 Rbf 时,您会引发 TypeError 尝试转换的错误IndexedVarfloat(在 Rbf 函数内部)。要评估您可以使用 model.m.lammda[i,1]() 的值,因为调用 class returns 您的值,但这仍然无济于事,因为另一个错误肯定会引发

我建议您访问 this post 以获取有关使用外部函数作为 pyomo 约束或 Objective 函数

的潜在困难的更多信息

Pyomo得到一个Piecewise Function Library where you can model a linear (pyo.environ layer also got it in the pyo.environ.Piecewise) or multilinear interpolation, but you will need to work with the kernel layer,它使用scipy生成一个Dlunay用于插值,你可以使用help(pyomo.kernel.piecewise_nd)检查。这肯定对你有用,但它需要一些工作。