【问题标题】:pyomo dae differential equation is applying ode "retroactively"pyomo dae 微分方程正在“追溯”应用 ode
【发布时间】:2017-02-26 14:55:33
【问题描述】:

抱歉,标题中的词选择不当。

问题是:我有一个具体的模型,它有一个连续的集合变量来表示时间和一个非常简单的 ode,其中一个变量的导数,我们称之为 dadt,等于另外两个变量 b 和 c 之间的差,它们是不依赖于 a(换句话说,a 只是 b 和 c 的差乘以时间)。不幸的是,该程序似乎向后应用了积分,这意味着如果在 time=20s 时 dadt 是 20,那么 a 在 0s 和 20s 之间增加了 20*dadt。这样,微分方程约束并不真正适用于 time=0s,因此使优化变得无用。 是这样打算的还是我在此过程中犯了一个错误?我应该添加 Lagrange-Radau 搭配。是不是这种搭配对融合方向的标准解读,意思是“落后”?

谢谢。

【问题讨论】:

  • 我很难理解你的问题。您能否发布整个模型的代码,包括离散化,并解释您期望的行为?
  • 代码如下: def constraint_26_rule(Model,i): return Model.dAdt[i]==Model.B[i]-Model.C[i] Model.constraint26=Constraint( Model.t, rule=constraint_26_rule) 离散化实现如下: discretizer = TransformationFactory('dae.collocation') discretizer。 apply_to(模型,nfe=parttime,ncp=1,scheme='LAGRANGE-RADAU')
  • 我设法解决了:def constraint_26_rule(Model,i): if i==parttime*3600: return Model.A[i]==Model.A[i] return Model.A[i +3600]==(Model.B[i] - Model.FC[i])*3600 Model.constraint26=Constraint(Model.t, rule=constraint_26_rule) 但是,我觉得这很难看。显然,有限差分有“前向”和“后向”选项,所以我想知道是否可以告诉离散器也应用拉格朗日-拉道搭配“前向”。
  • 拉格朗日-拉道搭配没有“前进”选项。但是,我不认为这是一个问题,因为所有方程都是同时求解的,并且您可以灵活地指定初始或最终边界条件。你设置了什么边界条件,你想优化什么?
  • 问题实际上是 A 的值在时间点 0s 和 3600s 之间增加了 dAdt[3600]。由于不打破 A 的下限对于优化的有效性至关重要,并且由于 dAdt[0] 非常负,因此在此期间它实际上是这样做的,因此这种优化是无用的。

标签: differential-equations pyomo


【解决方案1】:

您可以使用 ContinuousSet 上的 next(i) 和 prev(i) 方法来获取相邻点。例如,

Model.A[model.t.next(i)] == Model.B[i]

警告:只有在应用离散化后声明约束时,这才会始终如一地工作

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    相关资源
    最近更新 更多