关于Gekko的代数/隐式循环处理,我有一个特定的问题。
我将在化学工程领域提供示例,因为这是我找到该项目及其其他库的方式。
例如,在进行多组分化学平衡计算时,不可能明确地计算出方程式,因为一种物质的浓度可能存在于许多不同的方程式中。
我过去一直在使用其他付费软件,它会根据系统的可解决性自动提出解决程序(通过分析依赖关系并创建自动代数循环)。
我的问题是:
Gekko是否会自动执行此操作?
这有点棘手,因为有时需要添加撕裂变量并从一个好的起始值开始进行迭代。
我知道此消息可能有点抽象,但是我正在尝试确定要用于工作的软件,这是我碰巧发现的务实瓶颈。
在此先感谢您的宝贵见解。
最佳答案
Python Gekko使用同步解决方案策略,以便将所有单元一起解决而不是顺序解决。因此,不需要撕裂变量,但是循环过程中的大流程问题可能很难收敛到可行的解决方案。以下是Python Gekko中用于协助有效解决方案和初始化的三种方法。
方法1:中间变量
中间变量可用于降低模型的复杂性。在许多模型中,临时变量超过常规变量。这种模型简化通常通过减小问题的大小来辅助求解器找到解决方案。中间变量在Python Gekko中使用m.Intermediates()
声明。中间变量可以在整个模型的一个部分中定义,也可以在多个声明中定义。中间变量从上到下依次解析。为避免意外覆盖,可以一次定义中间变量。对于中间变量,声明的顺序至关重要。如果在定义之前使用了中间体,则错误报告存在未初始化的值。这是带有示例问题的additional information on Intermediates。
方法2:下块三角分解
对于初始化有麻烦的大问题,可以使用m.options.COLDSTART=2
选项激活一个模式。该模式执行下块三角分解,以自动识别独立的块,然后独立且顺序地对其进行求解。
在PhD dissertation (chapter 2)的Mostafa Safdarnejad中或在Safdarnejad,S.M.,Hedengren,J.D.,Lewis,N.R.,Haseltine,E.,《动态系统优化的初始化策略》(计算机和化学工程,2015年,第1卷)中讨论了这种初始化方法。 78,第39-50页,DOI:10.1016/j.compchemeng.2015.04.016。
方法3:自动模型缩减
模型简化需要更多的预处理时间,但可以帮助大大减少求解器时间。 m.options.REDUCE
上有additional documentation。
总体初始化策略
此流程图显示了我们用于初始化棘手问题的总体策略,例如带回收的流程图。
有时它确实意味着中断回收以获得初始化的解决方案。其他时候,上面详细介绍的初始化策略也可以很好地工作,并且不需要模型重新安排。使用同步解决方案策略的优点是自由度交换,例如下游变量可以固定,并且上游变量可以满足该值。
关于iteration - Gekko的代数/隐式循环处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58603826/