メインコンテンツ

不連続性をもつ PDE の求解

この例では、物質と境界を接する PDE を解く方法を説明します。この問題では x=0.5 において物質の境界により不連続性が作成され、初期条件には右の境界 x=1 に不連続性があります。

区分的な PDE を考えます。

{ut=x-2x(x25ux)-1000eu(0x0.5)ut=x-2x(x2ux)-eu(0.5x1)

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

u(x,0)=0  (0x<1),u(1,0)=1  (x=1).

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

       ux=0  (x=0),u(1,t)=1  (x=1).

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

方程式のコード化

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

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

この場合、PDE は適切な形式であるため、係数の値を読み取ることができます。

{ut=x-2x(x25ux)-1000eu(0x0.5)ut=x-2x(x2ux)-eu(0.5x1)

流束項 f(x,t,u,ux) とソース項 s(x.t,u,ux) の値は、x の値に応じて変化します。係数は次のようになります。

m=2

c(x,t,u,ux)=1

{f(x,t,u,ux)=5ux(0x0.5)f(x,t,u,ux)=ux(0.5x1)

{s(x,t,u,ux)=-1000eu(0x0.5)s(x,t,u,ux)=-eu(0.5x1)

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

  • x は独立空間変数。

  • t は独立時間変数。

  • u は、x および t について微分される従属変数。

  • dudx は空間偏導関数 u/x

  • 出力 cf、および s は、pdepe で想定される標準 PDE 方程式形式の係数に対応。これらの係数は、入力変数 xtu、および dudx によってコード化されます。

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

function [c,f,s] = pdex2pde(x,t,u,dudx)
c = 1;
if x <= 0.5
    f = 5*dudx;
    s = -1000*exp(u);
else
    f = dudx;
    s = -exp(u);
end
end

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

初期条件のコード化

次に、初期条件を返す関数を記述します。初期条件は最初の時間値において適用され、u(x,t0) の値を任意の x の値に対して提供します。関数シグネチャ u0 = pdex2ic(x) を使用して関数を記述します。

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

u(x,0)=0        (0x<1),u(1,0)=1        (x=1).

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

function u0 = pdex2ic(x)
if x < 1
    u0 = 0;
else
    u0 = 1;
end
end

境界条件のコード化

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

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

この例には球面対称性 (m=2) があるため、pdepe ソルバーは左境界条件を自動的に強制して解を原点に拘束し、境界関数内で左境界に指定された条件はすべて無視します。したがって、左境界条件には pL=qL=0 を指定できます。右境界条件については、境界条件を標準形式で書き直し、pRqR の係数値を読み取ることができます。

x=1 に対し、方程式は u(1,t)=1(u-1)+0ux=0 になります。係数は次のようになります。

  • pR(1,t,u)=u-1

  • qR(1,t)=0

境界関数は関数シグネチャ [pl,ql,pr,qr] = pdex2bc(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] = pdex2bc(xl,ul,xr,ur,t)
pl = 0; 
ql = 0; 
pr = ur - 1;
qr = 0;
end

解のメッシュの選択

空間メッシュは、不連続な境界を考慮するために x=0.5 近傍の値をいくつか含んでいなければならず、また、x=1 近傍の点を含んでいなければなりません。これは、その点での初期値 (u(1,0)=1) と境界値 (u(1,t)=0) が一致しないためです。小さい t に対して解は急速に変化するため、この急激な変化を解決できるタイム ステップを使用します。

x = [0 0.1 0.2 0.3 0.4 0.45 0.475 0.5 0.525 0.55 0.6 0.7 0.8 0.9 0.95 0.975 0.99 1];
t = [0 0.001 0.005 0.01 0.05 0.1 0.5 1];

方程式の求解

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

m = 2;
sol = pdepe(m,@pdex2pde,@pdex2ic,@pdex2bc,x,t);

pdepe は 3 次元配列 sol に解を返します。ここで、sol(i,j,k)t(i)x(j) で評価した解の k 番目の要素 uk を近似します。u0 が各解要素の初期条件を指定するため、sol のサイズは length(t) x length(x) x length(u0) となります。この問題では、u の要素は 1 つのみであるため、sol は 8 行 18 列の行列になりますが、通常はコマンド u = sol(:,:,k) を使用して k 番目の解要素を抽出できます。

最初の解要素を sol から抽出します。

u = sol(:,:,1);

解のプロット

xt の選択されたメッシュ点でプロットされた解 u の表面プロットを作成します。m=2 であるため、問題は球面対称性をもつ球面幾何学で提示されます。したがって、解は半径 x の方向にのみ変化します。

surf(x,t,u)
title('Numerical solution with nonuniform mesh')
xlabel('Distance x')
ylabel('Time t')
zlabel('Solution u')

Figure contains an axes object. The axes object with title Numerical solution with nonuniform mesh, xlabel Distance x, ylabel Time t contains an object of type surface.

次に、xu のみをプロットして、表面プロットの等高線の側面図を取得します。x=0.5 にラインを追加して、物質の境界の影響を強調表示します。

plot(x,u,x,u,'*')
line([0.5 0.5], [-3 1], 'Color', 'k')
xlabel('Distance x')
ylabel('Solution u')
title('Solution profiles at several times')

Figure contains an axes object. The axes object with title Solution profiles at several times, xlabel Distance x, ylabel Solution u contains 17 objects of type line. One or more of the lines displays its values using only markers

ローカル関数

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

function [c,f,s] = pdex2pde(x,t,u,dudx) % Equation to solve
c = 1;
if x <= 0.5
    f = 5*dudx;
    s = -1000*exp(u);
else
    f = dudx;
    s = -exp(u);
end
end
%----------------------------------------------
function u0 = pdex2ic(x) %Initial conditions
if x < 1
    u0 = 0;
else
    u0 = 1;
end
end
%----------------------------------------------
function [pl,ql,pr,qr] = pdex2bc(xl,ul,xr,ur,t) % Boundary conditions
pl = 0;
ql = 0;
pr = ur - 1;
qr = 0;
end
%----------------------------------------------

参考

トピック