Modelica - 在一段距离后连接连接器

时间:2010-11-29 20:27:46

标签: modeling oop modelica

在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继承的空间传播,但每个空间都有不同的力。)任何建议都会很棒!

2 个答案:

答案 0 :(得分:1)

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

这在Modelica中存在问题。 Modelica专为具有静态拓扑的系统而设计。我的意思是所有连接都出现在模拟开始时,并且在模拟过程中没有添加或删除任何连接。当然,拥有更多动态功能会很不错,但是如果添加太多功能/功能,事情会很快变得势不可挡。

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

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

更新

Joel,Google Books是你的朋友。我搜索了“Modelica gravity Tiller”并提出了this link。我希望这个对你有用。如果没有,请告诉我,我可以尝试在此处粘贴模型的副本。

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

关键是你有“FixedSpace”有一个“球”。这不是我建模的方式(因为has-a关系是暂时的)。在轨道模型中,我创建了一个“太阳系”,它有一堆“行星”,然后我创建了一个由多对多“引力”对象组成的整个网络,将所有东西连接到一切。对于你的情况,你可能想要创建一个类似的“力量”类型的对象并将它连接到球和每个环境,然后让它根据它的位置弄清楚它的行为方式。从概念上讲,这至少是一种方法。

答案 1 :(得分:1)

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

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

以下变量描述了球在零克空间内以及引力场内的运动:

  • Real [2] velocity
  • 真实[2]位置
  • Real [2]加速

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

  • 参数Real [2] positionEarth

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

  • 参数Real radiusGravField
  • 参数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;