首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Modelica -在一段距离后加入连接器

Modelica -在一段距离后加入连接器
EN

Stack Overflow用户
提问于 2010-11-30 04:27:46
回答 2查看 264关注 0票数 1

在modelica中,我需要连接两个空间,并在一段距离后在它们之间传递一个对象,比如说一个球。在我的例子中,我有两个空间,一个是自由空间(没有力),突然我们进入了地球附近的空间(重力),它作用于球。我需要能够把球从第一个空间传到第二个空间,但我拿不到。下面是一个最小的例子。

代码语言:javascript
运行
复制
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,但在每个空间中具有不同的作用力。)任何建议都是很棒的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-30 21:34:32

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

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

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

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

更新:

乔尔,谷歌图书是你的朋友。我搜索了一下"Modelica gravity“,找到了this link。我希望它能为你工作。如果没有,请让我知道,我可以尝试在这里粘贴模型的副本。

很高兴听到我的书……我就是在那里拿到博士学位的。我想是因为我是校友,但我对此表示怀疑。

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

票数 1
EN

Stack Overflow用户

发布于 2011-07-21 00:43:19

我不是Tiller教授,但我在Modelica建模方面也有一些经验。

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

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

  • Real2 velocity
  • Real2 position
  • Real2 acceleration

然后你有一个常量参数,它描述了地球的位置:

positionEarth的

  • 参数

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

实数radiusGravField

  • parameter实数gravConstant

  • 参数

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

代码语言:javascript
运行
复制
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;

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

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

代码语言:javascript
运行
复制
  when norm(positionEarth - position, 2) < radiusGravField/1000 then
    terminate("Simulation over, crashed on planet");
  end when;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4307788

复制
相关文章

相似问题

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