我想用Matlab來計算兩個有限差分環,如果我們有兩個方程,比如(1)和(2),它完成(1)的一個步驟,然後解決(2)一個然後(1)進行下一步然後(2)等等等等。如何在Matlab上以交替方式運行兩個循環?
爲此,我提供的下面我的代碼參數:
%% 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
然後,第一環由
%% 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
和第二等式(2)是由
給出給定%% 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
在當前格式中,Matlab將運行第一個循環i = 1:nx-1
然後sec ond loop j = nt:-1:2
。
但我想運行兩個循環,如下所示:i = 1
,然後j = nt
,然後i = 2
,然後j = nt-1
等等等等。我應該如何編碼?
nt和nx是否一樣?我想不是,那麼如何在同一個循環中遍歷兩個不同大小的向量? – Ivan
@ Ivan號'nt = 5001'和'nx = 501'。是的,這是一個觀點。也許可以通過在'x'上插入't'來實現嗎? –
你應該怎麼做只用一個循環的迭代? – Ivan