1

在modelica中,我需要连接两个空间并在它们之间经过一段距离后传递一个物体,比如说一个球。在我的例子中,我有两个空间,一个是自由空间(没有力),突然我们进入作用在球上的近地空间(重力)。我需要能够将球从第一个空间传到第二个空间,但我无法得到它。这是一个最小的例子。

model Ball
  Real[2] position;
  Real[2] velocity;
  parameter Real mass=1;
equation
  der(position) = velocity;
end Ball;

connector Flange
  Real p;
  flow Ball b;
end Flange;

model FreeSpace
  Ball ball;
  parameter Real length;
  Flange f;
equation
  // need to do something, probably here, to end the first space when ball is at length
end FreeSpace;

model NearEarth
  extends FreeSpace;
  parameter Real[2] g={0,-9.8};
equation
  der(ball.velocity) = g;
end NearEarth;

model PassBall
  FreeSpace free(ball.velocity={5,0},ball.position={0,10});
  NearEarth near;
equation
  connect(free.f,near.f);
end Equation;

也许我做错了什么,但这就是我所在的地方。(在真正的问题中,我有一个电子脉冲在从 FreeSpace 继承的空间中传播,但在每个空间中都有不同的作用力。)任何建议都会很棒!

4

2 回答 2

1

我不是 Tiller 教授,但我也有一些使用 Modelica 建模的经验。

如果我理解正确,您希望模拟球在二维平面中的运动,该平面由两个域组成:零重力空间和以平面上行星为中心的引力场。

以下变量描述了球在零重力空间和重力场内的运动:

  • 真实[2]速度
  • 真实[2]位置
  • 实[2]加速度

然后你有一个常数参数来描述地球的位置:

  • 参数 Real[2] positionEarth

您还需要一个参数来描述引力场的延伸范围以及强度:

  • 参数 实半径GravField
  • 参数 Real gravConstant

现在,您可以编写球在两个域中的运动方程,其中作用在球上的加速度可以通过不同的表达式来计算,具体取决于球在平面中的位置:

model grav
  import Modelica.Math.Vectors.*;
  Real[2] velocity(start={-1,-0.9});
  Real[2] position(start={5,5});
  Real[2] acceleration;
  parameter Real[2] positionEarth={0,0};
  parameter Real radiusGravField=2;
  parameter Real gravConstant=10;
equation 
  der(position) = velocity;
  der(velocity) = acceleration;
  if norm(positionEarth - position, 2) > radiusGravField then
    acceleration = {0,0};
  else
    acceleration = gravConstant/norm(positionEarth - position, 2)^2 
                    * normalize(positionEarth - position);
  end if;
end grav;

自动检测从一个域到另一个域的切换,并应用正确的方程式,无需您指定任何转移。

您可以添加在离散事件中发生的操作,如下所示:

  when norm(positionEarth - position, 2) < radiusGravField/1000 then
    terminate("Simulation over, crashed on planet");
  end when;
于 2011-07-20T16:43:18.700 回答
1

如果我理解你的目标,你想拥有两个不同的“环境”,然后在这两个环境之间传递对象?

这在 Modelica 中是有问题的。Modelica 专为具有静态拓扑的系统而设计。我的意思是在模拟开始时所有连接都存在,并且在模拟期间没有添加或删除任何连接。当然,拥有更多动态特性会很好,但如果添加太多特性/功能,事情很快就会变得不堪重负。

至于您的问题,您可以做的一件事是使用 FreeSpaceInteraction 类来描述球与 FreeSpace 对象之间的交互,并使用 NearEarthInteraction 类来描述球与 NearEarth 对象之间的交互。然后你可以有一个布尔信号来指示在任何给定时间哪个应该是活动的(基于距离)。

如果你愿意,我可以举一个例子。一个非常相似的例子出现在“Modelica 物理建模简介”(如果你有副本)中,它涉及行星和引力。那里发生的一个问题是,当您有许多相互作用的物体时,您会遇到一些组合问题。

更新:

Joel,Google 图书是您的朋友。我搜索了“Modelica Gravity Tiller”并找到了这个链接。我希望这个对你有用。如果没有,请告诉我,我可以尝试在此处粘贴模型的副本。

很高兴听到 UI 有我的书……那是我获得博士学位的地方。我想这是因为我是校友,但我对此表示怀疑。

关键是你有“FixedSpace”有一个“球”。这不是我建模它的方式(因为 has-a 关系是暂时的)。在轨道模型中,我创建了一个包含一堆“行星”的“太阳系”,然后我创建了一个由多对多“引力”物体组成的整个网络,将万物连接起来。对于您的情况,您可能希望创建一个类似的“力”类型的对象并将其连接到球和每个环境,然后让它根据其位置确定它的行为方式。至少,从概念上讲,这是一种方法。

于 2010-11-30T13:34:31.957 回答