python - Pyomo.dae - 使用 Casadi 求解器求解 DAE 系统
问题描述
我正在尝试使用 pyomo 解决 DAE 系统。这是一个玩具示例
from pyomo.environ import *
from pyomo.dae import *
m = ConcreteModel()
m.r = ContinuousSet(bounds = (0., 1.))
m.t = ContinuousSet(bounds = (0., 5.))
m.c = Var(m.r, m.t)
m.dcdt = DerivativeVar(m.c, wrt = m.t)
discretizer = TransformationFactory('dae.finite_difference')
discretizer.apply_to(m, nfe=20, wrt = m.r, scheme = 'BACKWARD')
# setting initial conditions
m.c[:, 0].fix(5)
def _dae_rule(m, r, t):
return 0 == - m.c[r, t] - m.dcdt[r, t] # note that rewriting to ODE is not desired
m.ode = Constraint(m.r, m.t, rule = _dae_rule)
sim = Simulator(m, package = "casadi")
tsim, profiles = sim.simulate(numpoints=100, integrator="idas")
不幸的是,执行导致错误消息
DAE_Error: Currently the simulator may only be applied to Pyomo models with a single ContinuousSet
怎么会这样?只有m.t
一个ContinuousSet?
手动删除 ContinuousSet,而不是首先使用 DiscreteSet 会产生错误消息
DAE_Error: Cannot simulate a differential equation with multiple DerivativeVars
我不明白。每个方程只依赖于它自己的导数?
另外,如果我也要离散化m.t
,我可以使用任何可能有效的替代求解器吗?
非常感谢 :)
解决方案
根据 Simulator 上的文档,它仅支持具有 1 个 ContinuousSet 的模型,并且您有 mr 和 mt 也许您可以将 DAE 系统定义为 t 的函数,在 r 的离散值处,反之亦然。
推荐阅读
- mysql - 在 MySQL 5.6 中使用 GROUP BY 模拟 LAG
- java - 以编程方式将鼠标单击注入鼠标 I/O 流
- browser - 无法发布 Edge 浏览器扩展:包接受验证错误
- javascript - 无法循环从 api 返回的数据
- c# - Web API (.NET Framework) Azure AD 身份验证始终返回 401 Unauthorized
- javascript - 如何使用 Angular 自动格式化电话号码
- javascript - Jasmine 从脚本文件中获取未定义的数组
- ruby-on-rails - 测试命名空间控制器
- html - 如何在 Bootstrap 表中垂直居中元素
- http - HTTPS 代理网站创建虚假网站