-1

私は代数方程式と混合された放物線偏微分方程式を扱っており、さらにこれらすべての方程式が結合されています。オイラー法 (Dassl は遅すぎる) と大きな許容誤差 (高速シミュレーション用) を使用し、OM(1.9.1)("residualFcn[some number]") でエラーを受け取ります (両方のタイプに対して)。問題は、ソルバーが「 t 非線形システムを解きます (数学的に、システムは正しいです)。最初の質問は、OM でオイラー積分法を使用する方法の種類 (明示的または暗黙的またはクランク-ニコルソン..または...) です。だから私はそれを数値的に解決しようとしました(明示的なオイラー法(「new [N]」の下のコード内)(おそらく問題はCFL条件である可能性があります))が、問題があります(特定のサンプル時間のサンプル再構成)。質問は、特定のサンプル時間の値を再現することを指しています?! 以下のコードには、配列 "a[3]" があります。

もう 1 つ、delta(t)/(delta(x))^2 >= 0.5 (delta(t) がユーザーを定義し、方程式セクションを参照する場合、delta(x) は以下のコードのようになり、空間離散化が使用されます。方程式のセクション (古典的なフィードフォワード法) で)、数値安定性は満たされていますか? 同じ例ですが、アルゴリズムセクションですか? よろしく

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

model Euler1D
import Modelica.Utilities.*;
parameter Integer N=10; //50
parameter Real Lp=1e-6;
parameter Real deltax=1/(N-1)*Lp;
Real a[3];
Real old[N];
Real new[N];
Real b;
equation 
a[1]=if 
   (time>5) then 0 else time+5;
a[2]=time;
a[3]=2;
when 
(sample(0,1)) then
d=b;
end when;
algorithm 
// IN t=ts;
 when (sample(0,1)) then
 for i in 1:2 loop
  b:=a[i];
 Streams.print(String(time)+"   "+String(a[i])+ "     "+String(b), "C:/Some_Path/text.txt");
end for;
end when;

// Another problem
old[1]:=10;
old [N]:=0;
new[1]:=10;
new [N]:=0;
// Boundary
for i in 2:N-1 loop
old [i]:=10;
new[i]:=10;
end for;

for dx in deltax:deltax:Lp-deltax loop  // spatial discretization

for i in 2:N-1 loop
(new[i]):=(old[i]+0.5*(old[i + 1] +old[i-1]- 2*old[i]));
//def:=def+abs(new[i]-old[i]);
end for;
 for i in 2:N-1 loop
 old[i]:=new[i]; // switch the values
 end for;

 for i in 1:N loop
 Streams.print(String(time)+"   "+ String(new[2]), "C:/Some_Path/Anel_Nodes.txt");
 end for;

 annotation (uses(Modelica(version="3.2")));
 end Euler1D;
4

1 に答える 1

3

あなたのコメントを考えると、これは私がモデルを構築する方法です:

model Euler1D 
  parameter Integer N=10 "Spatial discretization";
  parameter Modelica.SIunits.Length L=1;
protected 
  parameter Modelica.SIunits.Length dx=L/(N-1) "Segment size";
  Real c[N] "Solution variable c";
  Real J[N] "Solution variable J";
  Real dc_dx "Spatial derivative at x==L";
  Real d2c_dx2[N] "Second spatial derivative of c";
initial equation 
  der(c[2:N-1]) = zeros(N-2);
equation 
  // Equations for spatial derivatives
  d2c_dx2[2:N-1] = { (c[i+1]-2*c[i]+c[i-1])/(dx^2) for i in 2:N-1};
  dc_dx = (c[N]-c[N-1])/dx;

  // Boundary conditions
  c[1] = 0 "Dirichlet B.C.";
  dc_dx = 1 "Neumann B.C.";

  // PDE
  J = c .* c "J = c^2";
  der(c) = d2c_dx2+J "PDE";
end Euler1D;

初期方程式は、シミュレーションの開始時に大きな過渡現象を回避します。非常に効果的に、私が提起したモデルは、定常状態のソリューションを提供します。しかし、あなたは物事を時間変化させることができます(例えば境界条件)。

これにはまだいくつかのエラーがある可能性がありますが、私はこのシステムについてあまり直感的ではなく、使用した値が物理的に意味があるかどうかを知ることができないため、言うのは難しいです。

しかし、うまくいけば、そのようなモデルをどのように構築できるかが概説されています。このモデルはDymolaで実行されます。OpenModelicaでは試しませんでした。

そうは言っても、時間積分スキームが明示的に見ることができない物理学から生じる暗黙の制約があるというPDEのこの問題を常に回避します(たとえば、CFL条件)。一般に、可変時間ステップアルゴリズムには誤差推定があり、これらの暗黙の制約の違反によって導入された不安定性を間接的に確認できます。しかし、彼らは彼らを「いじくり回す」必要があります。これが上記のモデルでどの程度問題になるかはわかりません。

ソリューションに少し興奮を加えたい場合は、方程式を変更できます

  dc_dx = 1 "Neumann B.C.";

...に...

  dc_dx = 0.7+0.2*sin(time) "Neumann B.C.";

...そしてあなたは素晴らしい時間変化する解決策を得るでしょう。これをいじってみると、端のグラデーションを急にしすぎるとモデルが不安定になることに気づきました。それが基礎となる数学方程式の真の解決策なのか、それとも上記の問題による数値のアーティファクトなのか、私にはわかりません。したがって、安定したソリューションが必要な場合、このモデルに入れることができるものには制限があります。

于 2013-02-27T15:16:05.860 に答える