在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,但在每个空间中具有不同的作用力。)任何建议都是很棒的!
发布于 2010-11-30 21:34:32
如果我理解您的目标,您希望有两个不同的“环境”,然后在这两个环境之间传递对象?
这在Modelica中是有问题的。Modelica是为具有静态拓扑的系统设计的。我的意思是,所有连接在模拟开始时都存在,并且在模拟期间不会添加或删除任何连接。当然,有更多的动态特性是很好的,但是如果你添加了太多的特性/功能,事情很快就会变得不堪重负。
对于您的问题,您可以做的一件事是创建一个FreeSpaceInteraction类来描述球和FreeSpace对象之间的交互,以及一个NearEarthInteraction类来描述球和NearEarth对象之间的交互。然后,您可以有一个布尔信号来指示在任何给定时间哪个应该是活动的(基于距离)。
如果你愿意,我可以做一个例子。在“使用Modelica进行物理建模的简介”(如果你有副本的话)中有一个非常相似的例子,涉及行星和引力。这里发生的一个问题是,当你有许多相互作用的物体时,你会遇到一些组合问题。
更新:
乔尔,谷歌图书是你的朋友。我搜索了一下"Modelica gravity“,找到了this link。我希望它能为你工作。如果没有,请让我知道,我可以尝试在这里粘贴模型的副本。
很高兴听到我的书……我就是在那里拿到博士学位的。我想是因为我是校友,但我对此表示怀疑。
关键是你有一个"FixedSpace“--一个”球“。这不是我建模的方式(因为has-a关系是暂时的)。在轨道模型中,我创建了一个“太阳系”,其中有一堆“行星”,然后我创建了一个由多对多“引力”物体组成的完整网络,将万物与万物相连。对于您的情况,您可能想要创建一个类似的“力”类型的对象,并将其连接到球和每个环境,然后让它根据其位置计算出它的行为方式。从概念上讲,这至少是一种方法。
发布于 2011-07-21 00:43:19
我不是Tiller教授,但我在Modelica建模方面也有一些经验。
如果我理解正确的话,您希望模拟球在二维平面中的运动,二维平面由两个域组成:零重力空间和以平面上的行星为中心的引力场。
以下变量描述了球在零g空间和引力场内的运动:
然后你有一个常量参数,它描述了地球的位置:
positionEarth的
您还需要一个参数来描述引力场延伸的距离,以及引力场的强度:
实数radiusGravField
现在,您可以为球在两个域中的运动编写方程,其中作用在球上的加速度可以通过不同的表达式计算,具体取决于球在平面中的位置:
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;https://stackoverflow.com/questions/4307788
复制相似问题