如何在Matlab上以交替方式运行两个循环?
我想用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
等等等等。我应该如何编码?
您可以组合两个循环如下所示:
% define other variables and preallocations
j = nt;
for i = 1:nx-1
u(:,i+1) = ((1/(c*dt))*I+(1/dx)*A)\((1/(c*dt))*u(:,i)+v(:,i));
v(:,j-1) = ((1/dx)*A+(1/(c*dt))*I)\((1/(c*dt))*v(:,j)
j = j - 1;
end
感谢您的回答,但有趣的是,以这种方式制定它会产生一个不受欢迎的'v',它在任何地方都有零(即方法变得不稳定)。也许我需要安排我的初始条件,因为可能会有一些重叠 –
for i = 1:nx-1
u(:,i+1) = ((1/(c*dt))*I+(1/dx)*A)\((1/(c*dt))*u(:,i)+v(:,i));
%This if will be true once each 10 iterations
if(mod((nt-i),10)==0)
j=((nt-i)/10)+1;
v(:,j-1) = ((1/dx)*A+(1/(c*dt))*I)\((1/(c*dt))*v(:,j);
end
end
真的不知道这是否会工作,但使它更可作为你想我的想法。
顺便说一句,你是否确定'u'和'v'?的索引,他们都在列中的所有行中进行分配,并且他们都有'nt'columns – Ivan
nt和nx是否一样?我想不是,那么如何在同一个循环中遍历两个不同大小的向量? – Ivan
@ Ivan号'nt = 5001'和'nx = 501'。是的,这是一个观点。也许可以通过在'x'上插入't'来实现吗? –
你应该怎么做只用一个循环的迭代? – Ivan