2017-06-07 7 views
2

Modelicaのジャンプ/不連続を処理する面でヒントやトリックがあったのでしょうか?私はOpenModelicaを使用しています。私の問題のための簡略化されたサンプルコードを以下に示します。斜面の誘導体は有限である場合、私は、連続したトランジションに5〜15秒でジャンプを行うことができますどのようにModelicaでジャンプ/不連続を処理する

model PowerGenerator 
    Modelica.SIunits.Power P(start=0); 
    output Modelica.SIunits.Energy E; 
equation 
if (5 < time) and (time < 15) then P = 3; 
    else P = 0; 
    end if; 
    der(E) = P; 
end PowerGenerator; 

?私はnoEventsmoothの機能を試しましたが、私はそれらを私が必要とするものにすることができませんでした。

編集: 私の主なモデルの問題は、これらのイベントがチャタリングを誘発するため、リアルタイムで動作する必要があることです。私のフルモデルでも、出来事は州の出来事なので、時間は分かっていません。

答えて

2

スコットGによって答えは良いですが、変更はちょうど時間に依存している場合、それが唯一うまく動作します。より一般的な解決策は、低域通過フィルタを使用することです:

model PowerGenerator 
    Modelica.SIunits.Power P(start=0); 
    output Modelica.SIunits.Energy E; 
    Modelica.Blocks.Continuous.LowpassButterworth lowpassButterworth(f=1) 
    annotation (Placement(transformation(extent={{-40,20},{-20,40}}))); 
equation 
    if (5 < time) and (time < 15) then 
    P = 3; 
    else 
    P = 0; 
    end if; 
    lowpassButterworth.u=P; 
    der(E) = lowpassButterworth.y; 
end PowerGenerator; 

(Iは、接続-ステートメントを代わりに使用することをお勧めします - しかし、上記の法的Modelicaでなければなりません。)

+0

私が提出した解決策が時間の問題だけであるという主張は正しいとは思いません。時間を他の変数の関数である任意の変数に置き換えることができます。 「低い」および「高い」値さえも、他の変数の関数となり得る。私はこの方法を成功と一緒に使ってきました(これまでのところ)。 –

+0

それは他の変数でもうまく動作します。ただし、任意の状態イベントだけでなく、明示的に関与する変数が必要です。 –

+0

このメソッドは、私のモデルでいくつかの変更を加えても機能すると思われますが、値の0から0までのステップに相当するときには、ややチャタリングが発生します。そこに提案はありますか? – Bart

2

おそらく、以下のコードのような動作が、あなたが探していたものでしょうか?以下は

model PowerGenerator 
    Modelica.SIunits.Power Plow; 
    Modelica.SIunits.Power Phigh; 
    Modelica.SIunits.Power P(start=0); 
    output Modelica.SIunits.Energy E; 

    Modelica.SIunits.Power Pold(start=0); 
    output Modelica.SIunits.Energy Eold; 

equation 
    if (5 < time) and (time < 15) then 
    Pold = 3; 
    else 
    Pold = 0; 
    end if; 
    der(Eold) = Pold; 

    Plow = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(3,0,time-5,1); 
    Phigh = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(0,3,time-15,1); 
    P = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(Phigh,Plow,time-10,1); 
    der(E) = P; 
end Power Generator; 

出力のプロットである: Spine Output

+0

とても素敵に見えること!概念的には、それは確かに私がしたいことです。最終結果を処理する方法とは対照的に、この方法がシミュレーション中に機能するかどうか知っていますか?私はおそらく私の元のポストでこれを明らかにする必要があります。 – Bart

+0

@Bartおそらく私はあなたのコメントにかなり従っていませんが、これはシミュレーション中に発生しています。この方法はこれまでのもっと複雑な状況のために私のために働いていました。 –

+0

申し訳ありませんが、私は正しい用語に精通していません。私が言いたいことは、ジャンプが起こる前にジャンプを効果的に滑らかにするかどうかということでした。私の主なモデルの問題は、 'flow'変数のステップジャンプで発生するチャタリングです。この解決策はそれに対処するだろうか? – Bart

関連する問題