Main Content

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

単一の PDE の求解

この例では、単一の PDE の定式化、計算、および解のプロット方法を説明します。

次の偏微分方程式を考えます。

π2ut=2ux2.

この方程式は、時間 t0 について区間 0x1 で定義されます。t=0 で、解は次の初期条件を満たします。

u(x,0)=sin(πx).

また、x=0 および x=1 で、解は以下の境界条件を満たします。

u(0,t)=0,

πe-t+ux(1,t)=0.

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

方程式のコード化

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

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

この形式で記述すると、PDE は次のようになります。

π2ut=x0x(x0ux)+0.

適切な形式の方程式を使用すると、関連する項を読み取ることができます。

m=0

c(x,t,u,ux)=π2

f(x,t,u,ux)=ux

s(x,t,u,ux)=0

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

  • x は独立空間変数。

  • t は独立時間変数。

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

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

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

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

function [c,f,s] = pdex1pde(x,t,u,dudx)
c = pi^2;
f = dudx;
s = 0;
end

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

初期条件のコード化

次に、初期条件を返す関数を記述します。初期条件は、最初の時間値 tspan(1) で適用されます。この関数にはシグネチャ u0 = pdex1ic(x) がなければなりません。

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

function u0 = pdex1ic(x)
u0 = sin(pi*x);
end

境界条件のコード化

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

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

この標準形式で境界条件を書き直し、係数値を読み取ります。

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

u(0,t)=0u+0ux=0.

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

  • p(0,t,u)=u

  • q(0,t)=0

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

πe-t+ux(1,t)=0πe-t+1ux(1,t)=0.

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

  • p(1,t,u)=πe-t

  • q(1,t)=1

境界条件関数は f(x,t,u,ux) によって表現され、この項は既にメインの PDE 関数で定義されているため、方程式のこの部分を境界条件関数内で指定する必要はありません。p(x,t,u) および q(x,t) の値のみを各境界で指定する必要があります。

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

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

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

  • t は独立時間変数。

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

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

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

function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end

解のメッシュの選択

方程式を解く前に、メッシュ点 (t,x) を、pdepe が解を評価する点として指定する必要があります。これらは、ベクトル tx に設定します。ベクトル tx は、ソルバーの中で異なる役割をもちます。特に求解のコストと精度は、ベクトル x の長さに強く依存します。しかし、ベクトル t の値にはあまり影響を受けません。

この問題では、空間区間 [0,1] 内で等間隔に配置された 20 個の点をもつメッシュと、時間区間 [0,2] からの t の 5 つの値を使用します。

x = linspace(0,1,20);
t = linspace(0,2,5);

方程式の求解

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

m = 0;
sol = pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,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 は 5 行 20 列の行列になりますが、通常はコマンド u = sol(:,:,k) を使用して k 番目の解要素を抽出できます。

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

u = sol(:,:,1);

解のプロット

解の表面プロットを作成します。

surf(x,t,u)
title('Numerical solution computed with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

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

この問題の初期条件と境界条件は、次で与えられる解析解となるように選択されました。

u(x,t)=e-tsin(πx).

同じメッシュ点で解析解をプロットします。

surf(x,t,exp(-t)'*sin(pi*x))
title('True solution plotted with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

Figure contains an axes object. The axes object with title True solution plotted with 20 mesh points, xlabel Distance x, ylabel Time t contains an object of type surface.

次に、数値解と解析解を t の最終値である tf において比較します。この例では、tf=2 となります。

plot(x,u(end,:),'o',x,exp(-t(end))*sin(pi*x))
title('Solution at t = 2')
legend('Numerical, 20 mesh points','Analytical','Location','South')
xlabel('Distance x')
ylabel('u(x,2)')

Figure contains an axes object. The axes object with title Solution at t = 2, xlabel Distance x, ylabel u(x,2) contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Numerical, 20 mesh points, Analytical.

ローカル関数

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

function [c,f,s] = pdex1pde(x,t,u,dudx) % Equation to solve
c = pi^2;
f = dudx;
s = 0;
end
%----------------------------------------------
function u0 = pdex1ic(x) % Initial conditions
u0 = sin(pi*x);
end
%----------------------------------------------
function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) % Boundary conditions
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end
%----------------------------------------------

参考

関連するトピック