【发布时间】: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