Je voudrais utiliser Matlab pour calculer deux boucles de différences finies de telle sorte que si nous avons deux équations, disons (1) et (2), il termine une étape de (1) puis résout (2) pour une étape puis (1) pour l'étape suivante, puis (2) et ainsi de suite et ainsi de suite.Comment exécuter deux boucles en alternance sur Matlab?
À cette fin, je fournir les paramètres de mon code ci-dessous:
%% Parameters
L = 5; % size of domain
T = 5; % measurement time
dx = 1e-2; % spatial step
dt = 1e-3; % time step
x0 = 0;
c = 1;
%%
t = 0:dt:T; % time vector
x = (0:dx:L)'; % spatial vector
nt = length(t);
nx = length(x);
Lx = (1/dx^2)*spdiags(ones(nx,1)*[1 -2 1],-1:1,nx,nx); % discrete Laplace operator
mu = dt/dx;
I = eye(nx,nx); % identity matrix
A = spdiags(ones(nx,1)*[-1 1 0],-1:1,nx,nx); % finite difference matrix
Ensuite, la première boucle est donnée par
%% Finite Difference Equation (1)
% preallocate memory
u = zeros(nx,nt);
v = zeros(nx,nt);
% initial condition in time
u(:,1) = sinc((x-x0)/dx);
v(:,1) = sinc((x-x0)/dx);
for i = 1:nx-1
u(:,i+1) = ((1/(c*dt))*I+(1/dx)*A)\((1/(c*dt))*u(:,i)+v(:,i));
end
et la seconde équation (2) est donnée par
Dans le format actuel, Matlab exécute la première bouclei = 1:nx-1
, puis la seconde.
%% Finite Difference Equation (2)
% preallocate memory
u = zeros(nx,nt);
v = zeros(nx,nt);
% final condition in time
u(:,nt) = sinc((x-x0)/dt);
% initial condition in space
for j = nt:-1:2
v(:,j-1) = ((1/dx)*A+(1/(c*dt))*I)\((1/(c*dt))*v(:,j)
end
deuxième boucle j = nt:-1:2
.
Mais je veux courir les deux boucles comme suit: i = 1
, puis j = nt
, puis i = 2
, puis j = nt-1
et ainsi de suite et ainsi de suite. Comment dois-je coder ceci?
sont nt et nx les mêmes? Je ne pense pas, alors comment pouvez-vous itérer dans la même boucle sur deux vecteurs de taille différente? – Ivan
@Ivan N ° 'nt = 5001' et' nx = 501'. Oui, c'est un point. Peut-être est-ce possible si j'interpole 't' sur' x'? –
Comment allez-vous faire ces itérations avec une seule boucle comme vous voulez? – Ivan