https://github.com/reneniehus/bact_warfare
Tip revision: 923e104aa634230547ba464c6bc8fee07f662ffa authored by Rene Niehus on 03 March 2020, 02:26:02 UTC
Update invasion_analysis.m
Update invasion_analysis.m
Tip revision: 923e104
invasion_analysis.m
% Invasion analysis
clc; clear all
% close all
tic;
%%%%%%%% get filename %%%%%%%%
p = mfilename('fullpath');
[pathstr, name, ext] = fileparts(p); % CHANGE IF YOU RUN IT IN ZOOLOGY
plotting_0 = 0; % no plotting for Zoology server
rpath = [pathstr '/Results/'];
fpath = [pathstr '/graphs/'];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Settings
% Run description
% set initial condition ODE
Endtime = 48; % given in hours
TIME = [0,Endtime];
dt = 0.1; % time step
% -----------
param.Ca0 = 0.1; param.Cb0 = param.Ca0; Ta0 = 0; Tb0 = 0; % define initial conditions
param.N0 = 1;
param.KN = 5; % half-saturation constant for nutrient-dependent growth
param.mu = 10; % max growth rate
param.kay = 30; %0.7; % how many cells are killed per unit toxin
param.D = 0.20; % loss of toxin
% -------------
InitC = [param.Ca0;param.Cb0;Ta0;Tb0;param.N0];
%% Algorithm to get as fast as possible to exact f*
% starts at highest and lowest f
for fresini = [0 1]
singular = 0; % boolean saying if singular strategy is found
newres = 1; % is there a new resident strategy
fres = fresini; % resident strategy
forward = 1; % indicates is new mutant will be higher or lower than resident
step = 0.1; % initial step for the mutant. Initially coarse
nbflip = 0; % record the number of consecutive flips in direction
minstep = 0.00001; % the precision we want for the strategy value
%
while singular ~= 1 % do this while you haven't found the singular strategy
if newres == 1 % new resident strategy; calculate new residents avarage fitness
%%%%%%%% local one-on-one competition (ODE solving)%%%%%%%%%%%%
[t,X] = myODE_solver01([fres 0 0 0 0 0 0 0 0],[fres 0 0 0 0 0 0 0 0],param,InitC,[0,Endtime],dt); % solve ODE b vs b
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wresav = X(1,end); % residents w as final biomass
end
fmut = fres + forward*step; % pick an invader that differs from resident according to direction
if fmut < 0 % if mutant is smaller than 0, set to 0
fmut = 0;
end
if fmut > 1
fmut = 1; % if mutant is bigger than 1, set to 1
end
%%%%%%%% local one-on-one competition (ODE solving)%%%%%%%%%%%%
[t,X] = myODE_solver01([fmut 0 0 0 0 0 0 0 0],[fres 0 0 0 0 0 0 0 0],param,InitC,[0,Endtime],dt); % solve ODE b vs b
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wmut = X(1,end); % record mutant biomass at end of competition
previousforward = forward; % saver: update previous direction
previousfres = fres; % saver: update previous resident
if wmut <= wresav % resident stays the resident
forward = (-1) * forward; % change the dircetion for mutant
newres = 0;
end
if wmut > wresav % the mutant invades and replaces the resident
fres = fmut; % the new resident will take the mutant value
disp(['Resident:' num2str(fres)])
if fres == 0 || fres == 1
singular = 1; % you have found a singular strategy
end
newres = 1; % we have a new resident
end
%
if forward ~= previousforward % compare with previous direction
nbflip = nbflip + 1;
end
if forward == previousforward % compare with previous direction
nbflip = 0;
end
if previousfres == fres && nbflip > 1 % singular strategy localised
if step <= minstep % precision high enough
singular = 1; % we have found an optimal strategy
end
if step > minstep % will redo the whole procedure with tinier step
step = step/10; % increase precision 10 times
nbflip = 0; % reset the number of consecutive flips
end
end
end % while you search for singular strategy
fres % record the final fres (ESS)
end
%%
disp(['Done after ' secs2hms(toc)]);