在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继承的空间传播,但每个空间都有不同的力。)任何建议都会很棒!
答案 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空间和以平面上行星为中心的引力场。
以下变量描述了球在零克空间内以及引力场内的运动:
然后你有一个恒定的参数来描述地球的位置:
您还需要一个参数来描述引力场的延伸范围,以及它的强度:
现在你可以在两个区域中编写球运动的方程式,其中作用于球的加速度可以通过不同的表达式计算,具体取决于球在平面中的位置:
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;