我正在试图找出使重力排水水箱保持在所需液位的入口流量的值.在使用Imode3找到解决方案后,我想使用Imode4在一段时间内模拟处于这种状态的系统.以下是我正在使用的代码:

from gekko import GEKKO
import numpy as np
m = GEKKO(remote = False)

F_in = m.MV(value = 1, name= 'F_in')
level = m.CV(value = 1, name = 'level')
F_out = m.Var(value = 1, name = 'F_out')

level.STATUS = 1
level.SPHI = 6
level.SPLO = 4

m.Equation(level.dt() == (F_in - F_out)/5)
m.Equation(F_out == 2*(level)**0.5)

# Find the steady state.

F_in.STATUS = 1

m.options.IMODE = 3
m.options.SOLVER = 3
m.solve(disp = False)
print(F_in.value)

# Run at steady state for 5 time units.

F_in.STATUS = 0 # Turn STATUS off for 0 DOF.
m.time = np.linspace(0,5,10)
m.options.IMODE = 4
m.solve(disp = False)
print(level.value)

但是,代码会产生错误,指出Imode4需要0个自由度.将F_in状态更改为0是否不会导致0 DOF?以下是完整的错误消息:

---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
Cell In[4], line 27
     25 m.time = np.linspace(0,5,10)
     26 m.options.IMODE = 4
---> 27 m.solve(disp = False)
     28 print(level.value)

File ~\VRMEng\VRMEng\Lib\site-packages\gekko\gekko.py:2140, in GEKKO.solve(self, disp, debug, GUI, **kwargs)
   2138         print("Error:", errs)
   2139     if (debug >= 1) and record_error:
-> 2140         raise Exception(apm_error)
   2142 else: #solve on APM server
   2143     def send_if_exists(extension):

Exception: @error: Degrees of Freedom
 * Error: DOF must be zero for this mode
 STOPPING...

任何帮助我们都将不胜感激!

推荐答案

设置m.options.SPECS = 0可在更改模式时忽略计算/固定规格(参见documentation).以下是一个成功解决问题的完整脚本.

from gekko import GEKKO
import numpy as np
m = GEKKO(remote = False)
F_in = m.MV(value = 1, name= 'F_in')
level = m.CV(value = 1, name = 'level')
F_out = m.Var(value = 1, name = 'F_out')
level.STATUS = 1
level.SPHI = 6
level.SPLO = 4
m.Equation(level.dt() == (F_in - F_out)/5)
m.Equation(F_out == 2*(level)**0.5)
# Find the steady state.
F_in.STATUS = 1
m.options.IMODE = 3
m.options.SOLVER = 3
m.solve(disp = False)
print(level.value)
print(F_in.value)
print(F_out.value)

# Run at steady state for 5 time units.
m.options.SPECS = 0
F_in.value = F_in.value.value
F_in.STATUS = 0 # Turn STATUS off for 0 DOF.
m.time = np.linspace(0,5,10)
m.options.IMODE = 4
m.solve(disp = True)
print(level.value)
print(F_in.value)
print(F_out.value)

更多细节:运行目录m._path中的t0文件存储变量是否应该计算或固定.rto.t0文件由IMODE=3生成,存储稳态值和固定/计算信息.设置SPECS=0忽略t0文件中的规格并使用默认规格.对于IMODE=4,FVsMVs中的每一个的STATUS被重写以关闭.集 F_in.value = F_in.value.value以保留来自稳态模拟的F_in值.

Python相关问答推荐

使用SciPy进行曲线匹配未能给出正确的匹配

从groupby执行计算后创建新的子框架

使用setuptools pyproject.toml和自定义目录树构建PyPi包

try 将一行连接到Tensorflow中的矩阵

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

cv2.matchTemplate函数匹配失败

driver. find_element无法通过class_name找到元素'""

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

如何在达到end_time时自动将状态字段从1更改为0

干燥化与列姆化的比较

pandas fill和bfill基于另一列中的条件

根据Pandas中带条件的两个列的值创建新列

按条件添加小计列

如何在PythonPandas 中对同一个浮动列进行逐行划分?

Python如何导入类的实例

一维不匹配两个数组上的广义ufunc

无法在盐流道中获得柱子

Pandas 删除只有一种类型的值的行,重复或不重复

#将多条一维曲线计算成其二维数组(图像)表示

将标签与山脊线图对齐