2

この質問は、正しい解決策が得られなかった私の以前の質問に多少関連しています。リンク:以前の SO スレッド

私は、1 つの空間次元 (たとえば、熱方程式 - 以下のリンクを参照) を持つ時変である偏微分方程式を解いています。私は線の数値法を使用しています。つまり、空間導関数を離散化して、Modelica で (Dymola ツールを使用して) 容易に解ける ODE のシステムを生成します。正確には、システムをシミュレートするとき、または結果をプロットするときに問題が発生します。方程式自体は正しく解かれているように見えますが、各離散状態の個別の時変挙動ではなく、特定の時点での離散化されたすべての状態変数の空間変化を表現したいと考えています。

私の問題に至るまでの戦略は、このYoutube チュートリアルに示されていますが、これは私が作成したものではありません。チュートリアルの最後でわかるように、ロッドのすべての離散点について、温度の時間変化の挙動が個別にプロットされます。私が望むのは、特定の時間におけるロッドの温度、つまり空間座標の関数としての温度を示すプロットです。私が苦労しているこれを達成するための私の戦略は次のとおりです。 N エントリの状態ベクトルが与えられた場合:

Real[N] T "Temperature";

plotArray..以下に示すように、Dymola 関数を使用します。

plotArray( {i for i in 1:N}, {T[i] for i in 1:N} )

直観的には、これにより、温度を空間座標の関数として示すプロット、または正確には離散単位の行の数が得られます。このコマンドは結果を生成しますが、プロットではすべての T 値が 0 に見えますが、これはまったく当てはまりません。私の質問は次のとおりです。特定の時間にすべての離散点で温度を取得してプロットするにはどうすればよいですか? よろしくお願いします。

問題のコードは次のとおりです。

model conduction

   parameter Real rho = 1;
   parameter Real Cp = 1;
   parameter Real L = 1;
   parameter Real k = 1;
   parameter Real Tlo = 0;
   parameter Real Thi = 100;
   parameter Real Tinit = 30;
   parameter Integer N = 10 "Number of discrete segments";
   Real T[N-1] "Temperatures";
   Real deltaX = L/N;

initial equation 
   for i in 1:N-1 loop
     T[i] = Tinit;
   end for;

equation 

   rho*Cp*der(T[1]) = k*( T[2] - 2*T[1] + Thi) /deltaX^2;
   rho*Cp*der(T[N-1]) = k*( Tlo - 2*T[N-1] + T[N-2]) /deltaX^2;

   for i in 2:N-2 loop
     rho*Cp*der(T[i]) = k*( T[i+1] - 2*T[i] + T[i-1]) /deltaX^2;
   end for
   annotation (uses(Modelica(version="3.2")));

end conduction;

追加の編集: シミュレーションは、たとえば T[3]、つまり個別のセグメント番号の温度であることを明確に示しています。3、30 度から開始し、70 度で終了します。ただし、コマンド ウィンドウに T[3] と書き込むと、T3 = 0.0 が返されます。何故ですか?plotArray0.0 だけでなく、特定の時間に実際の変数値を抽出できれば、関数が機能するため、これが問題の核心です。

推奨される解決策:これは、私が望むものを達成するためのかなり面倒な解決策です。誰かがより良い解決策を知っていることを願っています。Dymola でシミュレーションを実行すると、ソフトウェアは、シミュレーション中の変数の値を含む .mat ファイルを生成します。このファイルを MATLAB にロードし、選択した変数をプロット用に手動で抽出できます。上記の問題に対して、次のコマンドを書きました。

plot( [1:9]' , data_2(2:2:18 , 10)' )

このコマンドは、個別のセグメント/要素のそれぞれの数に対して温度をプロットします (温度は導関数と共に .mat ファイルの data_2 配列に保存されるため)。これを Dymola 内で行うことを本当に望んでいました。つまり、MATLAB を使用しないようにすることです。この特定の問題では、この問題が単純であるため、変数の量は少なかったのですが、先ほど行ったように手動でナビゲートするのが非常に困難な .mat ファイルを簡単にイメージできます。

4

1 に答える 1

4

明示的には言及していませんがplotArray、Dymola のコマンド ウィンドウでコマンドを入力すると仮定します。そこに表示される変数にはシミュレーション結果が含まれていないため、直接は機能しません。モデルをシミュレートしてT[:]から Dymola のコマンド ウィンドウに入力すると、出力される結果は次のようになります。

T[:]
 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}

私は Dymola の専門家ではありません。私が見つけた唯一の解決策 (目的のシミュレーション結果を積極的に保存およびロードするため) は非常に面倒です。

simulateModel("conduction", resultFile="conduction.mat")
n = readTrajectorySize("conduction.mat")
X = readTrajectory("conduction.mat", {"Time"}, n)
Y = readTrajectory("conduction.mat", {"T[1]", "T[2]", "T[3]"}, n)
plotArrays(X[1, :], transpose(Y))

ここに画像の説明を入力

于 2014-01-09T13:54:58.720 に答える