Я хотел бы использовать Matlab для вычисления двух циклов конечных разностей таким образом, что если у нас есть два уравнения, скажем, (1) и (2), он завершает один шаг (1), затем решает (2) за один шаг, затем (1) для следующего шага, а затем (2) и так далее и тому подобное.
С этой целью я предоставляю параметры моего кода ниже:
%% 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
, а затем второй цикл j = nt:-1:2
.
Но я хочу запустить два цикла следующим образом: i = 1
, затем j = nt
, затем i = 2
, затем j = nt-1
и так далее и тому подобное. Как мне это закодировать?
nt = 5001
иnx = 501
. Да, это точка. Возможно, это возможно, если я интерполируюt
наx
? - person Jason Born   schedule 24.07.2017i
перед решением одного значенияj
, посколькуnt
примерно в десять раз больше, чемnx
. Можно ли это закодировать? - person Jason Born   schedule 24.07.2017for i = 1:nx-1 j = ((nt-i)/10)-1; end
возвращает одно значение. - person Jason Born   schedule 24.07.2017