Las PDE parabólicas como las del libro generalmente se pueden resolver utilizando el Método de líneas . Primero creas algo de malla para la dirección . Asumiré que utilizó un espaciado uniforme ya que las gráficas no muestran ninguna característica que muestre la necesidad de no uniformidad. A continuación, reformule sus ecuaciones con solo la derivada del tiempo en el lado izquierdo y cambie las derivadas en a aproximaciones de diferencias finitas. Aquí está la primera ecuación para un punto interior general:XX
∂tu1 , yo∂t= ε ( u2 , yo- U1 , yo) - u1 , i + 1- 2 u1 , yo+ u1 , i - 1Δ x2- U1 , i + 2- 4 u1 , i + 1+ 6 u1 , yo- 4 u1 , i - 1+ u1 , i - 2Δ x4 4- U1 , yotu1 , i + 1- U1 , i - 12 Δ x
Voy a dejarles la segunda ecuación, las ecuaciones de límite y los puntos cerca del límite. Ahora usted tiene un conjunto acoplado de ODE es para . Desde sus condiciones iniciales, puede asignar y en el primer paso. Ahora, en cada paso de tiempo, satisface las ecuaciones discretizadas anteriores en diferentes momentos según el algoritmo de integración de tiempo que esté utilizando. Si es Euler explícito, lo satisface al comienzo de cada paso de tiempo. Si está implícito Euler, el final. i = 1 . . . nortetu1 , yotu2 , yo
Sin embargo, en matlab, hay una manera fácil de manejar todos estos métodos (y muchos más complicados). Lo que desea es una función que devuelva un vector de valores igual al lado derecho de la ecuación anterior dado un vector de . Si asume condiciones límite periódicas, obtendrá:tuj , 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
Ahora puede alimentar esto a cualquiera de los solucionadores de ODE incorporados de matlabs. Encontré que ode15s funcionó bastante bien. También asumí ICS sinusoidal, pero no parece importar.
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);
Los resultados dan: