1

modelicaでは、2つのスペースを接続し、ある程度の距離を置いた後、それらの間にオブジェクト、たとえばボールを渡す必要があります。私の例では、2つのスペースがあります。1つはフリースペース(力なし)で、突然、ボールに作用する地球のスペース(重力)の近くに入ります。最初のスペースから2番目のスペースにボールを渡すことができる必要がありますが、それを取得できません。これが最小限の例です。

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

私があなたの目標を理解しているなら、あなたは2つの異なる「環境」を持ち、次にこれら2つの環境の間でオブジェクトを渡したいですか?

これはModelicaでは問題があります。Modelicaは、静的トポロジを持つシステム向けに設計されています。これは、シミュレーションの開始時にすべての接続が存在し、シミュレーション中に接続が追加または削除されないことを意味します。もちろん、より動的な機能があると便利ですが、追加する機能や機能が多すぎると、すぐに圧倒される可能性があります。

あなたの問題に関して、あなたができることの1つは、ボールとFreeSpaceオブジェクトの間の相互作用を記述するFreeSpaceInteractionクラスと、ボールとNearEarthオブジェクトの間の相互作用を記述するNearEarthInteractionクラスを持つことです。次に、(距離に基づいて)任意の時点でどちらがアクティブであるかを示すブール信号を両方に与えることができます。

よろしければ、例を考えてみましょう。非常によく似た例が、惑星と重力の引力を含む「Modelicaを使用した物理モデリングの概要」(コピーがある場合)にあります。そこで発生する問題の1つは、多数のボディがすべて相互に作用している場合に、いくつかの組み合わせの問題が発生することです。

更新:

ジョエル、Googleブックスはここであなたの友達です。「Modelica重力耕うん機」を検索して、このリンクを思いついた。私はそれがあなたのために働くことを願っています。そうでない場合は、お知らせください。モデルのコピーをここに貼り付けることができます。

UIが私の本を持っていたのを聞いてうれしいです...それは私が博士号を取得した場所です。みょうばんだったからだと思いたいのですが、疑わしいです。

これの鍵は、「FixedSpace」に「ボール」があることです。それは私がそれをモデル化した方法ではありません(持っているので-関係は一時的です)。軌道モデルでは、たくさんの「惑星」を持つ「太陽系」を作成し、次に、すべてをすべてに接続する多対多の「重力プル」オブジェクトのネットワーク全体を作成します。あなたの場合、同様の「力」の種類のオブジェクトを作成し、それをボールと各環境に接続してから、その位置に基づいてどのように動作するかを理解させることができます。これは、少なくとも概念的には、それを行う1つの方法です。

于 2010-11-30T13:34:31.957 に答える
1

私はTiller教授ではありませんが、Modelicaを使用したモデリングの経験もあります。

私があなたの言うことを正しく理解していれば、2次元平面でのボールの動きをシミュレートしたいと思います。これは、ゼロg空間と、平面上の惑星を中心とする重力場の2つのドメインで構成されます。

次の変数は、ゼロg空間内と重力場内の両方でのボールの動きを表します。

  • Real[2]速度
  • Real[2]の位置
  • Real[2]アクセラレーション

次に、地球がどこにあるかを説明する定数パラメータがあります。

  • パラメータReal[2]positionEarth

また、重力場がどれだけ遠くまで伸びているか、そしてそれがどれほど強いかを説明するパラメータも必要です。

  • パラメータRealradiusGravField
  • パラメータRealgravConstant

これで、両方のドメインでボールの動きの方程式を書くことができます。ここで、ボールに作用する加速度は、平面内のどこにボールがあるかに応じて、さまざまな式で計算できます。

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 に答える