3

Modelicaを始めたばかりで、その仕組みを理解するのに苦労しています。

以下のモデルの「メソッド」では、2 行目で qInflow と qOutflow を使用して der(h) を評価していますが、まだ値を受け取っていません! (それらはメソッドの「データ」で定義されていませんでした)? コードが実行される順序。

equation
 assert(minV >= 0, "minV must be greater or equal to zero");
 der(h)=(qInflow - qOutflow)/area;
 qInflow=if time > 150 then 3*flowLevel else flowLevel;
 qOutflow=Functions.LimitValue(minV, maxV, -flowGain*outCtr);
 error=ref - h;
 der(x)=error/T;
 outCtr=K*(error + x);
end FlatTank;      

http://www.mathcore.com/resources/documents/ie_tank_system.pdfから

4

2 に答える 2

5

これは、命令型セマンティクスを利用する言語やシステムから来る場合、理解できる混乱のポイントです。しかし、Modelicaはそのようには機能しません。

Modelicaを使用する場合、セクションには割り当てequationではなく方程式が含まれていることを理解することが重要です。私があなたに次の方程式を与えたなら、これを考慮してください:

x + y = 3;
x + 2*y = 5;

これが数学的な文脈であることを理解している場合xは、値が1でy、値が2である必要があると判断できます。つまり、連立方程式を解く必要があります。これらの方程式の左辺は(一般に)変数ではなく、式であることに注意してください。方程式は、左側の1つの式と、右側の別の式を等しくする関係です。さらに、この関係は常に真であるため、順序は関係ありません。

これは、命令型セマンティクスを備えた命令型プログラミング言語とはまったく異なります。しかし、これらの関係(線形連立方程式、非線形連立方程式、陰的方程式など)を記述でき、コンパイラーがそれらを解決するための最も効率的な方法を実行するため、非常に強力です。

例に戻ると、質問のコードを見ると、これらの方程式を代入ステートメントとして解釈しています。この概念は、左側に変数があるため、強化されています。しかし、それらは実際には方程式です。方程式ベースのシステムでは、特定の変数が以前に割り当てられているかどうかについて心配する必要はありません。代わりに、要件は、すべての変数に対して(どこかに)方程式が存在し、余分な方程式がないことです。言い換えれば、未知数と同じ数の変数があり、連立方程式には一意の解があるはずです。Modelicaに必要なのはこれだけです。

現在、Modelicaは、慣れ親しんだ種類の命令型セマンティクスをサポートしています。ただし、これらは、Modelicaコンパイラが非常に高速なコードを生成できるようにする記号操作を妨害するように数学的な動作の解釈を制約するため、特別な場合にのみ使用されます。つまり、それはスタイルの問題以上のものです。可能な限り方程式を使用する必要があり、Modelicaのアルゴリズムは最後の手段としてのみ使用する必要があります。

最後にもう1つ。「これらの方程式は巨大な連立方程式に入れられ、行列反転やニュートンラプソン法などで解かれると言っているのでしょうか。明らかにはるかに簡単な方法で解けるのに、なぜこれほど複雑にするのでしょうか。 !」しかし、それは巨大な連立方程式としては解かれません。単純な割り当てのセットとして解決できる場合は、。これは、(多くの中で)適用されるさまざまな記号操作手法の1つです。実際、これはModelicaの重要なポイントです...ソリューションメソッドの最適化について心配する必要はありません。ツールがそれを処理します。さらに重要なことに、同時システムが発生するような方法でコンポーネントを接続する場合は、それについても心配する必要はありません。Modelicaツールは、このような「代数ループ」を処理できます。ツールは、最も計算効率の高い定式化を見つけるために最適化し、これらの場合にモデルを再定式化することに依存しません。

それは役に立ちますか?

于 2012-06-13T12:50:34.297 に答える
1

Modelica ツールを実行するまで、Modelica モデル内の方程式の実行順序を知ることはできません (ソース モデル内の任意の方程式を並べ替えて、同じ結果を得ることができます)。そして、この順序は、使用した設定を持つこのツールにのみ当てはまります。

これは、OpenModelica コンパイラによって選択された順序です (omc +s +simCodeTarget=Dump model.mo):

error = ref - h;
outCtr = K * (error + x);
der(x) = DIVISION(error, T, #SHARED_LITERAL_2(String#);
qOutflow = LimitValue(minV, maxV, (-flowGain) * outCtr);
qInflow = if time > 150.0 then 3.0 * flowLevel else flowLevel;
der(h) = DIVISION(qInflow - qOutflow, area, #SHARED_LITERAL_3(String#);

この例は、方程式の左辺と右辺が場所を変えていないため、少し退屈でした ( h = error - refh が状態変数として選択されていない場合など)。

于 2012-06-13T12:27:48.643 に答える