有限差分法によって離散化された移流方程式の境界条件


14

有限差分法を使用してPDEを解くときに境界条件を選択する方法を説明するのに役立つリソースを見つけようとしています。

私が現在アクセスできるすべての本とメモは、同様のことを言っています:

境界が存在する場合の安定性を管理する一般規則は、入門テキストとしては複雑すぎます。彼らは洗練された数学的な機械を必要とします

(A.イセル微分方程式の数値解析の最初のコース)

たとえば、移流方程式に2段階のリープフロッグ法を実装しようとする場合:

あなたはn+1=あなたはn1+μあなたは+1nあなたは1n

MATLABを使用して

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);
    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end

このソリューションは、境界に到達するまでうまく動作し、突然突然動作が異常になります。

このような境界条件の処理方法はどこで学べますか?

回答:


12

Sloedeの対応は非常に綿密で正確です。把握しやすいように、いくつかのポイントを追加したかっただけです。

基本的に、波動方程式には固有の波速度と方向があります。1次元の波動方程式の場合: 波速度は定数であり、情報がドメイン内を伝播する速度だけでなく、その方向も決定します。場合、情報は左から右に進み、場合は逆になります。a a > 0 a < 0

ut+aux=0
aa>0a<0

リープフロッグ法の場合、方程式を離散化すると、次のようになります。 または: ここで、です。あなたの場合、、U N iは =uと N - 2 I +μU N - 1 I + 1 -U N - 1 I - 1

あなたはnあなたはn22t+aあなたは+1n1あなたは1n12バツ=0
あなたはn=あなたはn2+μあなたは+1n1あなたは1n1
μ=at/バツμ>0これは、左に行く波に変換されます。考えてみると、左に移動している波は、右の境界で境界条件のみが必要になります。これは、左のすべての値が右隣を介して更新されるためです。実際、左の境界で値を指定することは、問題の性質と矛盾します。単純な風上などの特定の方法では、スキームはステンシル内の正しい近傍のみを含むため、これは自動的に処理されます。跳躍カエルのような他の方法では、「正しい」値を指定する必要があります。

これは通常、内部ドメインからの外挿によって行われ、欠損値が検出されます。多次元および非正準問題の場合、これには、フラックスヤコビアンのすべての固有ベクトルを見つけて、境界のどの部分が実際に境界条件を必要とし、どの部分が外挿を必要とするかを決定することが含まれます。


物理的には、左側と右側の境界条件でこの方程式を使用するとはどういう意味ですか?
フランク

5

一般的な答え
あなたの問題は、境界条件をまったく設定していない(または指定さえしていない)ことです。数値問題は不明確です。

一般に、境界条件を指定するには2つの方法があります。

  1. 外部でおよびu 101を指定することにより、たとえば正確な解を通して境界条件を設定します。あなたは0あなたは101
  2. 境界で内部情報のみを使用するように数値ステンシルを変更します。

どちらに進むかは、問題の物理学に大きく依存します。波動方程式タイプの問題では、通常、外部境界条件が必要かどうか、または内部解を使用するかどうかを決定するために、フラックスヤコビアンの固有値を決定します(この方法は一般に「巻き上げ」と呼ばれます)。



あなたは1nあなたは+1nn+1=1あなたは0nあなたは100n+1あなたは101n

あなたは1nあなたは100n

ソースコードの修正版は以下にあります:

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    %u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);

    % Apply the numerical stencil to all interior points
    for j = 2:M-1
        u(j,i) = u(j,i-2) + mu*(u(j+1,i-1) - u(j-1,i-1));
    end

    % Set the boundary values by interpolating linearly from the interior
    u(1,i) = 2*u(2,i) - u(3,i);
    u(M,i) = 2*u(M-1,i) - u(M-2,i);

    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end

いい答えです。scicomp、Sloedeへようこそ。質問の1つは、通常、ドメインの1つの境界のみから情報が引き出される片面ステンシルの使用として定義される「巻き上げ」です。あなたの応答でそれを言うつもりでしたか?
アロンアーマディア

1
はい、確かに。申し訳ありませんが、私の答えが十分に明確ではありませんでした。ただし、一般的に、「巻き上げ」とは、情報の流れの方向を考慮することを意味します。ソリューションの片側を完全に破棄することを意味する必要はなく、「風上」方向にあるソリューションの部分を優先することを意味します。
マイケルシュロットケレイクパー

N = 1000コードをもう少し作成して実行すると、期待どおりに動作しないことがわかります。
サイモンモリス

この理由は、私の「クイックフィックス」ソリューションは物理的に健全ではなく、その上でソリューションのスプリアス振動にかなり敏感だからです。これを実際の科学計算に使用しないでください!
マイケルシュロットケレイクパー

2

それで、これをもう少し詳しく見てきましたが、これは(少なくとも私が扱っている基本的なケースでは)メソッドのグループ速度に依存しているようです。

leapfrogメソッド(たとえば)は次のとおりです。

あなたはn+1=あなたはn1+μあなたは+1nあなたは1n

あなたはkn=eζkバツ+ωζnt

e2ωt=1+μeωteζバツeζバツ

ωt=μζバツ

dωdζ=cosζバツ1μ2sn2ζバツ[11]

次に、境界条件の群速度を見つける必要があります。

あなたは1n+2=あなたは1n+μあなたは2n+1

次のように境界グループの速度を計算できます。

2ωt=μeζバツ

そのため、境界が許可するグループ速度を見つけるには、次を見つける必要があります。

ω=cζ

cosζバツ=0μζバツ=2ζct

ζ=π2バツμ=2cμπ2c[11]μ


あなたは0n+1=あなたは1n[11]

これを完全に理解する前に、これについてさらに読む必要があります。私が探しているキーワードはGKS理論だと思います。

このすべてのA IserlesパートIIIノートのソース


私がやったことのより明確な計算は、ここで見つけることができます:http : //people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

みんな私はこのサイトに非常に新しいです。たぶんこれは尋ねる場所ではないかもしれませんが、私はここで非常に新しいのでご容赦ください:)私は非常に似た問題を抱えています。唯一の違いは開始関数であり、私の場合は余弦波です。私のコードはこれです:すべてをクリアします。clc; すべて閉じる;

M = 1000; N = 2100;

mu = 0.5;

c = [mu 0 -mu]; f = @(x)1- cos(20 * pi * x-0.025)。^ 2; u =ゼロ(M、N); x = 0:(1 / M):0.05; u(1:length(x)、1)= f(x); u(1:length(x)、2)= f(x-mu /(M)); x = linspace(0,1、M);

for i = 3:Nホールドオフ;

% Apply the numerical stencil to all interior points
for j = 2:M-1
    u(j,i) = u(j,i-2) - mu*(u(j+1,i-1) - u(j-1,i-1));
end

% Set the boundary values by interpolating linearly from the interior
u(M,i) =  2*u(M-1,i-1) - u(M-2,i-1);

plot(x、u(:、i)); axis([0 1.5 -0.5 2])drawnow; %pause end

このコードはすでにここにありますが、何らかの理由で、おそらくコサイン波に関連して、私のコードは失敗します:/助けていただければ幸いです:)ありがとう!


2
SciComp.SEへようこそ!これを新しい質問にする必要があります。(回答は、実際の回答のみを対象としています。)下部にある「独自の質問リンクを使用」を使用する場合(明るい黄色に濃い黄色、そこにあるかどうかわからないのは確かに難しい) 、質問をこの質問に自動的にリンクします。(この質問へのリンクを自分のリンクに含めることもできます。)
クリスチャンクラソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.