Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

PDE 系の求解

この例では、2 つの偏微分方程式系の定式化、計算、および解のプロットを行う方法を説明します。

次の PDE 系を考えます。

u1t=0.0242u1x2-F(u1-u2),

u2t=0.1702u2x2+F(u1-u2).

(関数 F(y)=e5.73y-e-11.46y は省略表現として使用されます。)

この方程式は、時間 t0 に対して区間 0x1 で成立します。初期条件は次のとおりです。

u1(x,0)=1,

u2(x,0)=0.

境界条件は次のとおりです。

xu1(0,t)=0,u2(0,t)=0,xu2(1,t)=0,u1(1,t)=1.

この方程式を MATLAB® で解くには、方程式、初期条件、および境界条件をコード化し、適切な解のメッシュを選択してから、ソルバー pdepe を呼び出す必要があります。(ここで行ったように) 必要な関数をファイルの最後にローカル関数として含めることも、あるいは個別の名前付きファイルとして MATLAB パスのディレクトリに保存することもできます。

方程式のコード化

方程式をコード化する前に、それが pdepe ソルバーで想定される形式であることを確認する必要があります。

c(x,t,u,ux)ut=x-mx(xmf(x,t,u,ux))+s(x,t,u,ux).

この形式では、PDE の係数は行列値であり、方程式は次のようになります。

[1001]t[u1u2]=x[0.024u1x0.170u2x]+[-F(u1-u2)F(u1-u2)].

したがって、方程式の係数の値は次のようになります。

m=0

c(x,t,u,ux)=[11] (対角値のみ)

f(x,t,u,ux)=[0.024u1x0.170u2x]

s(x,t,u,ux)=[-F(u1-u2)F(u1-u2)]

これで、方程式をコード化する関数を作成できるようになりました。この関数にはシグネチャ [c,f,s] = pdefun(x,t,u,dudx) がなければなりません。

  • x は独立空間変数。

  • t は独立時間変数。

  • u は、x および t について微分される従属変数。これは 2 要素ベクトルで、u(1)u1(x,t)u(2)u2(x,t) です。

  • dudx は空間偏導関数 u/x。これは 2 要素ベクトルで、dudx(1)u1/xdudx(2)u2/x です。

  • 出力 cf、および s は、pdepe で想定される標準 PDE 方程式形式の係数に対応。

結果として、この例の方程式は次の関数で表すことができます。

function [c,f,s] = pdefun(x,t,u,dudx)
c = [1; 1];
f = [0.024; 0.17] .* dudx;
y = u(1) - u(2);
F = exp(5.73*y)-exp(-11.47*y);
s = [-F; F];
end

(メモ: 関数はすべて例の最後にローカル関数として含まれます。)

初期条件のコード化

次に、初期条件を返す関数を記述します。初期条件は最初の時間値において適用され、u(x,t0) の値を任意の x の値に対して提供します。初期条件の数は方程式の数と等しくなければならないため、この問題では初期条件が 2 つあります。関数シグネチャ u0 = pdeic(x) を使用して関数を記述します。

初期条件は次のとおりです。

u1(x,0)=1,

u2(x,0)=0.

対応する関数は次のようになります。

function u0 = pdeic(x)
u0 = [1; 0];
end

境界条件のコード化

次に、境界条件を評価する関数を記述します。

xu1(0,t)=0,u2(0,t)=0,xu2(1,t)=0,u1(1,t)=1.

区間 axb で提示される問題について、境界条件はすべての t、および x=a または x=b のいずれかに適用されます。ソルバーで想定される境界条件の標準形式は次のとおりです。

p(x,t,u)+q(x,t)f(x,t,u,ux)=0.

この形式で記述する場合、u の偏導関数の境界条件は流束 f(x,t,u,ux) によって表す必要があります。したがって、この問題の境界条件は以下のとおりです。

x=0 の場合、方程式は次のようになります。

[0u2]+[10][0.024u1x0.170u2x]=0.

係数は次のようになります。

pL(x,t,u)=[0u2],

qL(x,t)=[10].

同様に、x=1 の場合、方程式は次のようになります。

[u1-10]+[01][0.024u1x0.170u2x]=0.

係数は次のようになります。

pR(x,t,u)=[u1-10],

qR(x,t)=[01].

境界関数は関数シグネチャ [pl,ql,pr,qr] = pdebc(xl,ul,xr,ur,t) を使用しなければなりません。

  • 入力 xl および ul は左境界の u および x に対応。

  • 入力 xr および ur は右境界の u および x に対応。

  • t は独立時間変数。

  • 出力 pl および ql は左境界 (この問題では x=0) の pL(x,t,u) および qL(x,t) に対応。

  • 出力 pr および qr は右境界 (この問題では x=1) の pR(x,t,u) および qR(x,t) に対応。

この例の境界条件は次の関数で表されます。

function [pl,ql,pr,qr] = pdebc(xl,ul,xr,ur,t)
pl = [0; ul(2)];
ql = [1; 0];
pr = [ur(1)-1; 0];
qr = [0; 1];
end

解のメッシュの選択

この問題の解は、t が小さいときに急速に変化します。pdepe では、急激な変化を解決するのに相応しいタイム ステップが選択されますが、出力プロットでその動作を表示するには、適切な出力時間を選択する必要があります。空間メッシュでは 0x1 の両端において解に境界層があるため、そこにメッシュ点を指定して急激な変化を解決する必要があります。

x = [0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1];
t = [0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];

方程式の求解

最後に、対称性 m、PDE 方程式、初期条件、境界条件、および xt のメッシュを使用して方程式を解きます。

m = 0;
sol = pdepe(m,@pdefun,@pdeic,@pdebc,x,t);

pdepe は 3 次元配列 sol に解を返します。ここで、sol(i,j,k)t(i)x(j) で評価した解の k 番目の要素 uk を近似します。それぞれの解要素を別々の変数に抽出します。

u1 = sol(:,:,1);
u2 = sol(:,:,2);

解のプロット

xt の選択されたメッシュ点でプロットされた、u1u2 の解の表面プロットを作成します。

surf(x,t,u1)
title('u_1(x,t)')
xlabel('Distance x')
ylabel('Time t')

Figure contains an axes object. The axes object with title u indexOf 1(x,t) baseline, xlabel Distance x, ylabel Time t contains an object of type surface.

surf(x,t,u2)
title('u_2(x,t)')
xlabel('Distance x')
ylabel('Time t')

Figure contains an axes object. The axes object with title u indexOf 2(x,t) baseline, xlabel Distance x, ylabel Time t contains an object of type surface.

ローカル関数

ここでは、PDE ソルバー pdepe が解を計算するために呼び出すローカル補助関数を紹介しています。あるいは、これらの関数を独自のファイルとして MATLAB パスのディレクトリに保存することもできます。

function [c,f,s] = pdefun(x,t,u,dudx) % Equation to solve
c = [1; 1];
f = [0.024; 0.17] .* dudx;
y = u(1) - u(2);
F = exp(5.73*y)-exp(-11.47*y);
s = [-F; F];
end
% ---------------------------------------------
function u0 = pdeic(x) % Initial Conditions
u0 = [1; 0];
end
% ---------------------------------------------
function [pl,ql,pr,qr] = pdebc(xl,ul,xr,ur,t) % Boundary Conditions
pl = [0; ul(2)];
ql = [1; 0];
pr = [ur(1)-1; 0];
qr = [0; 1];
end
% ---------------------------------------------

参考

関連するトピック