python-3.x - 一组微分方程中的条件分段函数

标签 python-3.x ode piecewise gekko

我正在尝试实现一个模型,并且我有这个条件分段函数作为模型的一部分。

This the equation,I'm trying to implement


其中 T_zone(=293) 和 T_in(=348) 是先前定义的常数,x2 和 x5 是取决于其他方程的变量,而其他方程又依赖于 T_in 和 T_out。

它们都已定义初始值。


temperature_zone=293.0
T_in = m.Var(value=temperature_zone) 
T_zone = m.Var(value=temperature_zone) 
x2 = m.Var(value=temperature_zone)
x5 = m.Var(value=temperature_zone)
Tout = m.Var(value=temperature_zone)
Tp1out=m.Var(value=temperature_zone)

m1out=m.if3(((2.0*(x2))-T_in-T_zone), 0, ((2.0*(x2))-T_in-T_zone))
m.Equation(T_p1out== T_zone+m1out)
m2out=m.if3(((2.0*(x5))-T_p1out-T_zone), 0, ((2.0*(x5))-T_p1out-T_zone))
m.Equation(T_out == T_zone+m2out)

在上面的代码中,我尝试将方程分成两部分,并将 if 条件的结果作为附加变量添加到基值/最小值中,但没有得到解决方案。

最佳答案

以下是一些需要考虑的事项:

  • 如果T_inT_zone是常量,然后使用 m.Constm.Param而不是m.Var 。否则,它们可以由求解器调整。
  • 单个m.if3函数足以解决这个问题。您可以定义两个 m.if3语句,然后添加输出,但随后您将创建额外的二进制变量,这将使您的问题更难以解决。
  • condition确定是否 T_out=T_zone (condition<0)或者是否T_out=2*x5-2*x2+T_in (condition>=0) .
  • T_in 的值是 348.0,而不是 temperature_zone (293.0) .

这是您提出的问题的完整脚本。

from gekko import GEKKO
m = GEKKO()
temperature_zone=293.0
T_in = m.Const(value=348.0) 
T_zone = m.Const(value=temperature_zone) 
x2 = m.Var(value=temperature_zone)
x5 = m.Var(value=temperature_zone)
condition = 2*x5-2*x2+T_in-T_zone
Tout=m.if3(condition, T_zone, 2*x5-2*x2+T_in)
m.solve()

APOPT solver通过两次迭代找到解决方案。请注意x2x5是本例中的附加自由度,仍然需要方程来指定它们的值。

 Number of state variables:              6
 Number of total equations: -            3
 Number of slack variables: -            2
 ---------------------------------------
 Degrees of freedom       :              1

 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:      0.00 NLPi:    2 Dpth:    0 Lvs:    2 Obj:  0.00E+00 Gap:       NaN
--Integer Solution:   0.00E+00 Lowest Leaf:   0.00E+00 Gap:   0.00E+00
Iter:     2 I:  0 Tm:      0.00 NLPi:    1 Dpth:    1 Lvs:    2 Obj:  0.00E+00 Gap:  0.00E+00
 Successful solution

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   1.390000000537839E-002 sec
 Objective      :   0.000000000000000E+000
 Successful solution
 ---------------------------------------------------

关于python-3.x - 一组微分方程中的条件分段函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57813583/

相关文章:

python - 为什么 Python 不从 Latin Extended-A 写入字符(写入文件时出现 UnicodeEncodeError)?

c++ - 使用推力的 ODE 求解器的 CUDA 编程

matlab - 求解和绘制分段 ODE

python - 在 python 中执行交互式 shell 脚本

c# - 如何使用 IronPython 中的包调用 Python 脚本?

wolfram-mathematica - 在 Mathematica 中求解微分方程

python - 求解 ODE 系统时使用 scipy.integrate.ode 的自适应时间步长

python - 如何在 Python 中应用分段线性拟合?

julia - 在 Julia 中定义分段函数

python - 输入两个单独的列表并输出单个字典列表