2017-11-04 2 views
2

私は、事前に知られている特定の時刻に行動を変える連続時間システムをモデル化したいと考えています。小さな例は次のとおりです。Modelicaで1回の時間イベントを所定の時間にモデル化するにはどうすればよいですか?

model time_event 
    Real x(start = 0) "state variable for this example"; 
    parameter T_ch = 5 "time at which the system dynamics undergoes a change"; 
equation 
    if time <= T_ch then 
    der(x) = x + 1; 
    end if; 
    if time > T_ch then 
    der(x) = -x; 
    end if; 

end time_event; 

答えて

4

あなたのソリューションはほぼ良好です。以下は、あなたのコードを変更したものです。 if then elseを使用し

  • も共通派生式(必要なだけでなく、コーディングスタイルを)持っているバランス変数xbを追加しましたif then elseif then elseif then ... else
  • を行うことができます。

コード:

model time_event  
    Real x(start = 0) "state variable for this example"; 
    parameter Real T_ch = 5 "time at which the system dynamics undergoes a change"; 
    Real xb "Balance variable for derivative"; 
equation 
    der(x) = xb; 
    if time <= T_ch then 
     xb = x + 1; 
    else 
     xb = -x; 
    end if; 
end time_event; 

結果のプロット:

赤= X

ブルー= DER(x)の

Plot of x and der(x)

+1

どうもありがとうございました。コンパイラが私のコードでエラーを出す理由は何ですか?私が見る限り、2つのコードはプログラム的に同じです。 – user13052

+3

if式は各分岐に同じ数の方程式を持つ必要があります。ここでは、どの方程式der(x)が解かれるかを知る必要があるからです。 der(x)には2つの異なる方程式があり、エラーが出るはずです。この答えは、中間変数xbを方程式から外しました。この変数は、その変数をプロットしない限り、必要ではありません。条件がパラメータ(時間ではない)のみを含む場合、コンパイラは分岐を評価できる可能性があります。これらのケースでは、if式の一部が削除されるため、if式のバランスをとる必要はありません。 –

関連する問題