Parabolische PDEs wie die im Buch beschriebenen können normalerweise mit der Methode der Linien gelöst werden . Zuerst erstellen Sie ein Netz für die Richtung. Ich gehe davon aus, dass Sie einen einheitlichen Abstand verwendet haben, da die Diagramme keine Merkmale aufweisen, die die Notwendigkeit einer Ungleichmäßigkeit anzeigen. Als nächstes fassen Sie Ihre Gleichungen nur mit der Zeitableitung auf der linken Seite neu zusammen und ändern die Ableitungen in in Näherungen mit endlicher Differenz. Hier ist die erste Gleichung für einen allgemeinen inneren Punkt:xx
∂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
Ich werde Ihnen die zweite Gleichung, die Grenzgleichungen und die Punkte in der Nähe der Grenze überlassen. Jetzt haben Sie einen gekoppelten Satz von ODE ist für . von Ihren Anfangsbedingungen können Sie im ersten Zeitschritt und zuweisen . Jetzt erfüllen Sie bei jedem Zeitschritt die oben genannten diskretisierten Gleichungen zu unterschiedlichen Zeiten, basierend auf dem von Ihnen verwendeten Zeitintegrationsalgorithmus. Wenn es sich um explizites Euler handelt, erfüllen Sie es zu Beginn jedes Zeitschritts. Wenn es impliziter Euler ist, das Ende. i=1...Nu1,iu2,i
In Matlab gibt es jedoch eine einfache Möglichkeit, all diese (und viele kompliziertere) Methoden zu handhaben. Was Sie wollen, ist eine Funktion, die einen Vektor von Werten zurückgibt, der der rechten Seite der obigen Gleichung entspricht, wenn ein Vektor von . Wenn Sie periodische Randbedingungen annehmen, erhalten Sie: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
Jetzt können Sie dies jedem der in Matlabs integrierten ODE-Löser zuführen. Ich fand, dass ode15s ziemlich gut abschnitten. Ich habe auch sinusförmiges ICS angenommen, aber es scheint keine Rolle zu spielen.
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);
Die Ergebnisse ergeben: