0

1D 反応拡散 ODE システムの明示的な有限差分数値スキームで周期境界条件を実装したいと考えています。ただし、私はこの分野の専門家ではないので、どんな助けでも大歓迎です。コード (現在ノイマン境界条件がある場所) は次のとおりです。

clear all
close all
tic
Fig=figure('Position',[100 100 1200 600]); % Figure Settings [left, bottom, width, height]

% Spatial discretisation
DeltaX=0.05;

% Parameter values
a=0.2;
b=0.15;
h=0.2;
d=10;
epsilon=0.01;
k=0.3;

% Number of grid cells
m=400;
NX=m;

% Timesteps
dt=0.0002; 
Time=0;
EndTime=100000;
PlotStep=10;
PlotTime=PlotStep;

% Initialisation
V = zeros(1,m);
U = zeros(1,m);
S = zeros(1,m);
dV=zeros(1,m);
dU=zeros(1,m);
dS= zeros(1,m);
NetV=zeros(1,m);
NetU=zeros(1,m);

% Boundary conditions
% Neumann
FXV = zeros(1,NX+1);        % bound.con. no flow in/out to X-direction
FXU = zeros(1,NX+1);        % bound.con. no flow in/out to X-direction

% Initial state for V
    for i=1:NX
        if (i <= NX/2)
            V(i)=0.6; 
        else
            V(i)=0;
        end
    end
% Initial state for U
U(:)=61.5;

% figtitle = sgtitle('Time: 0');
figtitle=sgtitle(['A = ' num2str(a) ', B=' num2str(b) ', H=' num2str(h) ', D=' num2str(d) ', eps=' num2str(epsilon) ', k=' num2str(k)]);

index=1;

% Timesteps
while Time<=EndTime
     
    % Reaction
    dV= U.*V.^2 -k*U.*V.^3 -b*V-h*S.*V;
    
    dU= a*(1-U)-U.*V.^2; 
    
    dS= (1/d)*(b*V+h*S.*V-S);
    
    VU=max(0,U); 
    
    % Diffusion
    FXV(2:NX)=(V(2:NX)-V(1:NX-1))/DeltaX; % flow in x-direction : dV/dx;        
    NetV=(epsilon^2)*(FXV(2:NX+1)-FXV(1:NX))/DeltaX; % eps^2 * vector for Laplacian differences
    
    FXU(2:NX)=(VU(2:NX)-VU(1:NX-1))/DeltaX; % flow in x-direction : dU/dx;
    NetU=(FXU(2:NX+1)-FXU(1:NX))/DeltaX; % vector for Laplacian differences 
    
    % Update
    V=V+(NetV+dV)*dt; 
    U=U+(NetU+dU)*dt; 
    S=S+dS*dt;
    
    Time=Time+dt; 

    PlotTime=PlotTime-dt;
  if PlotTime<=0.00001
     
    figure(1)
    % V plot    
    subplot(1,3,1)
    plot(V)
    xlabel('x');
    ylabel('V');
    ylim([0 3]);
    % U plot    
    subplot(1,3,2)
    plot(U)
    xlabel('x');
    ylabel('U');
    ylim([0 1]);
    % S plot 
    subplot(1,3,3)
    plot(S)
    xlabel('x');
    ylabel('S');
    ylim([0 2]);
    
    PlotTime=PlotStep; 
    
  end
end
4

0 に答える 0