本にあるような放物線PDEは、通常、線の方法を使用して解くことができます。最初に、方向のメッシュを作成します。プロットは不均一性の必要性を示す特性を示さないため、一定の間隔を使用したと想定します。次に、左側の時間微分のみで方程式を再キャストし、の微分を有限差分近似に変更します。一般的な内点の最初の方程式は次のとおりです。xxx
∂u1,i∂t=ε(u2,i−u1,i)−u1,i+1−2u1,i+u1,i−1Δx2−u1,i+2−4u1,i+1+6u1,i−4u1,i−1+u1,i−2Δx4−u1,iu1,i+1−u1,i−12Δx
2番目の方程式、境界方程式、および境界の近くの点はあなたに任せます。これで、のODEの結合セットができました。初期条件から、最初のタイムステップでとを割り当てることができます。ここで、各タイムステップで、使用している時間積分アルゴリズムに基づいて、異なる時間で上記の離散化方程式を満たします。オイラーが明示的である場合は、各タイムステップの開始時に満足します。それが暗黙のオイラーであれば、終わりです。 u 1 、i u 2 、ii=1...Nu1,iu2,i
ただし、MATLABでは、これらの(およびより複雑な)メソッドをすべて処理する簡単な方法があります。必要なのは、ベクトルが与えられたときに、上記の方程式の右辺に等しい値のベクトルを返す関数です。周期的な境界条件を想定すると、次のようになります。uj,i
function [ u_prime ] = derivative( t, u, delta_x )
u_prime = zeros(length(u),1);
u = [u(end-3:end); u; u(1:4)];
if t < 200
epsilon = 0;
else
epsilon = 0.1;
end
for i = 5:2:length(u) - 4;
u_prime(i-4) = epsilon*(u(i+1) - u(i)) - ...
(u(i+2) - 2*u(i) + u(i-2))/delta_x^2 - ...
(u(i+4) - 4*u(i+2) + 6*u(i) - 4*u(i-2) + u(i-4))/delta_x^4 - ...
u(i)*(u(i+2) - u(i-2))/(2*delta_x);
j = i+1;
u_prime(j-4) = epsilon*(u(j-1) - u(j)) - ...
(u(j+2) - 2*u(j) + u(j-2))/delta_x^2 - ...
(u(j+4) - 4*u(j+2) + 6*u(j) - 4*u(j-2) + u(j-4))/delta_x^4 - ...
u(j)*(u(j+2) - u(j-2))/(2*delta_x);
end
end
これを、MATLABの組み込みODEソルバーにフィードできます。ode15sのパフォーマンスはかなり良いことがわかりました。正弦波ICSも想定しましたが、問題ではないようです。
N = 1000; % Number of space discretizations
x = linspace(0, 150, N);
u_0 = zeros(2*N,1);
u_0(1:2:end-1) = sin(2*x/10); % u_1
u_0(2:2:end) = -sin(4*x/10); % u_2
delta_x = x(2) - x(1);
[t,u] = ode15s(@(t,u) derivative(t,u,delta_x), [0 400], u_0);
結果は次のとおりです。