2017-07-24 556 views
0

我想用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等等等等。我应该如何编码?

+0

nt和nx是否一样?我想不是,那么如何在同一个循环中遍历两个不同大小的向量? – Ivan

+0

@ Ivan号'nt = 5001'和'nx = 501'。是的,这是一个观点。也许可以通过在'x'上插入't'来实现吗? –

+0

你应该怎么做只用一个循环的迭代? – Ivan

回答

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 
+0

感谢您的回答,但有趣的是,以这种方式制定它会产生一个不受欢迎的'v',它在任何地方都有零(即方法变得不稳定)。也许我需要安排我的初始条件,因为可能会有一些重叠 –

1
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 

真的不知道这是否会工作,但使它更可作为你想我的想法。

+0

顺便说一句,你是否确定'u'和'v'?的索引,他们都在列中的所有行中进行分配,并且他们都有'nt'columns – Ivan