首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求解静态方程(或其系统)

求解静态方程(或其系统)
EN

Stack Overflow用户
提问于 2019-02-08 01:21:25
回答 2查看 107关注 0票数 5

我想在Modelica中做以下事情:在一个特定的模型中,我有几个参数h,我想通过求解参数和其他值之间的一组隐式方程,从它们中推导出一些与时间无关的值k。由于方程本质上是隐式的,我不能简单地赋值表达式,而是必须让求解器找到解决方案。

由于参数是恒定的,我希望在系统其余部分的实际时间积分(例如,包含k作为系数的微分方程)发生之前,能够在一开始只解一次方程。

请参阅下面的示例,了解我希望能够编写的内容:

代码语言:javascript
复制
model ConstantTest
  parameter Real h = 2;
  const Real k;
initial equation
  k*k=h; // just an example of an implicit equation, which in this simple case could also be written explicitly
end ConstantTest;

但这是失败的,因为Modelica中的“常数”不仅在具有消失时间导数的意义上是常数,而且在求解初始方程时它也是不可变的。所以求解器抱怨它不能求解初始方程0 = 2,这是因为它假设k总是等于0。

当然,我可以只将k设为变量,但我必须明确地告诉求解器,k具有消失的时间导数(等于它在朴素的物理意义上实际上是“常数”):

代码语言:javascript
复制
model ConstantTest
  parameter Real h = 2;
  Real k;
initial equation
  k*k=h;
equation
  der(k) = 0;
end ConstantTest;

这是可行的,但这有点奇怪,因为求解器必须在每个时间步求解一个微分方程式,以便对k几乎什么都不做,这将是对计算资源的浪费。

有没有办法在不引入“时间演化开销”的情况下用Modelica求解静态隐式方程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-08 02:07:10

我想你可以这样做:

代码语言:javascript
复制
model ConstantTest
  parameter Real h = 2;
  parameter Real k(fixed=false);
initial equation
  k*k=h;
end ConstantTest;

K将在初始化时计算。

票数 7
EN

Stack Overflow用户

发布于 2019-02-08 02:45:03

我认为定义这类系统的最好方法是:

代码语言:javascript
复制
model ConstantTest
  parameter Real h = 2;
  Real k;
equation
  2*k=h;
end ConstantTest;

OpenModelica会将其放入初始部分,并且只会求解一次。我会认为OpenModelica在你的系统中的行为是一个错误,因为它会多次求解一个与时间无关的方程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54578892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档