2017-07-24 536 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