Skip to content

Matlab Example Becker

Clemens Kreutz edited this page Oct 29, 2018 · 2 revisions

At this page, it is illustrated how the benchmark models are used in Matlab based on the Becker model.

Loading the Becker model and writing code for simulation

The following commands are sufficient for simulating the Becker model in Matlab:

cd Benchmark-Models            % set working directory
addpath('../Matlab_scripts/')  % add matlab function in folder Matlab_scripts to search path
folder = 'Becker_Science2010'; % folder name of the model to be loaded

[Is,ms,ds] = ReadBenchmarks(folder)  % loading of general info in Is, models in variable ms, data sets in variable ds

m=ms(1);   % simulate 1st model 
d=ds(1);   % simulate for the 1st data set
ode_tolerances = 1e-6;

status = WriteMatlabODEs(Is,m,d,ode_tolerances);    % writing ODE_call.m and ODE_file.m 
ODE_call    % simulation and comparison with the reference simulation

who         % shows all variables which are created in ODE_call

Simulation code example

The automatically generated code for the Becker model looks like this:

% This script can be used to integrate ODEs (here using ode15s) for simulation the dynamics x(t) for this benchmark model.

% The model corresponds to:
% General_Info file = Becker_Science2010\General_info.xlsx
% model-file        = Becker_Science2010\Model\model1_data1.xlsx
% data-file         = Becker_Science2010\Data\model1_data1.xlsx
init_Epo = 10^3.1295;
init_EpoR_rel = 10^-1.036;
kD = 10^2.1519;
kde = 10^-1.9212;
kdi = 10^-2.8953;
ke = 10^-1.256;
kex = 10^-3.2381;
koff = 10^-1.0932;
kon = 10^-0.82004;
kt = 10^-1.7955;
offset = 10^-5;
scale = 10^-0.0088494;
sd_Epo_bound = 10^-1.4342;
sd_Epo_ext = 10^-2.108;
sd_Epo_int = 10^-1.2904;
sd_Epo_mem = 10^-1.3538;
p=[ init_Epo, init_EpoR_rel, kD, kde, kdi, ke, kex, koff, kon, kt, offset, scale, sd_Epo_bound, sd_Epo_ext, sd_Epo_int, sd_Epo_mem];

initial_Epo = init_Epo;
initial_EpoR = 4*init_Epo*init_EpoR_rel;
initial_Epo_EpoR = 0;
initial_Epo_EpoR_i = 0;
initial_dEpo_i = 0;
initial_dEpo_e = 0;
x0=[ initial_Epo; initial_EpoR; initial_Epo_EpoR; initial_Epo_EpoR_i; initial_dEpo_i; initial_dEpo_e];

tsim = unique([0,0.820000,0.820000,0.820000,5.820000,5.820000,5.820000,20.820000,20.820000,20.820000,60.820000,60.820000,60.820000,120.820000,120.820000,120.820000,180.820000,180.820000,180.820000,240.820000,240.820000,240.820000,300.820000,300.820000,300.820000,0.820000,0.820000,0.820000,5.820000,5.820000,5.820000,20.820000,20.820000,20.820000,60.820000,60.820000,60.820000,120.820000,120.820000,120.820000,180.820000,180.820000,180.820000,240.820000,240.820000,240.820000,300.820000,300.820000,300.820000,300.820000]);
if length(tsim)==1, tsim = [tsim,1.1]; end

[t,x] = ode15s(@ODE_file,tsim,x0,odeset('AbsTol',1.000000e-06,'RelTol',1.000000e-06,'MaxStep',range(tsim)/1000),p);

close all
plot(t,x)


% Calcuation of Observables:
Epo = x(:,1);
EpoR = x(:,2);
Epo_EpoR = x(:,3);
Epo_EpoR_i = x(:,4);
dEpo_i = x(:,5);
dEpo_e = x(:,6);


% a) Definitions:
Epo_ext = Epo + dEpo_e;
Epo_int = Epo_EpoR_i + dEpo_i;


% b) Observables:
Epo_ext_cpm = feval(inline('log10(offset + (Epo_ext.*scale)./init_Epo)',   'init_Epo',...
   'init_EpoR_rel',...
   'kD',...
   'kde',...
   'kdi',...
   'ke',...
   'kex',...
   'koff',...
   'kon',...
   'kt',...
   'offset',...
   'scale',...
   'sd_Epo_bound',...
   'sd_Epo_ext',...
   'sd_Epo_int',...
   'sd_Epo_mem',...
    'Epo_ext',...
    'Epo_int',...
     'Epo',     'EpoR',     'Epo_EpoR',     'Epo_EpoR_i',     'dEpo_i',     'dEpo_e'),...
   init_Epo,...
   init_EpoR_rel,...
   kD,...
   kde,...
   kdi,...
   ke,...
   kex,...
   koff,...
   kon,...
   kt,...
   offset,...
   scale,...
   sd_Epo_bound,...
   sd_Epo_ext,...
   sd_Epo_int,...
   sd_Epo_mem,...
    Epo_ext,...
    Epo_int,...
Epo,EpoR,Epo_EpoR,Epo_EpoR_i,dEpo_i,dEpo_e);
Epo_mem_cpm = feval(inline('log10(offset + (Epo_EpoR.*scale)./init_Epo)',   'init_Epo',...
   'init_EpoR_rel',...
   'kD',...
   'kde',...
   'kdi',...
   'ke',...
   'kex',...
   'koff',...
   'kon',...
   'kt',...
   'offset',...
   'scale',...
   'sd_Epo_bound',...
   'sd_Epo_ext',...
   'sd_Epo_int',...
   'sd_Epo_mem',...
    'Epo_ext',...
    'Epo_int',...
     'Epo',     'EpoR',     'Epo_EpoR',     'Epo_EpoR_i',     'dEpo_i',     'dEpo_e'),...
   init_Epo,...
   init_EpoR_rel,...
   kD,...
   kde,...
   kdi,...
   ke,...
   kex,...
   koff,...
   kon,...
   kt,...
   offset,...
   scale,...
   sd_Epo_bound,...
   sd_Epo_ext,...
   sd_Epo_int,...
   sd_Epo_mem,...
    Epo_ext,...
    Epo_int,...
Epo,EpoR,Epo_EpoR,Epo_EpoR_i,dEpo_i,dEpo_e);
Epo_int_cpm = feval(inline('log10(offset + (Epo_int.*scale)./init_Epo)',   'init_Epo',...
   'init_EpoR_rel',...
   'kD',...
   'kde',...
   'kdi',...
   'ke',...
   'kex',...
   'koff',...
   'kon',...
   'kt',...
   'offset',...
   'scale',...
   'sd_Epo_bound',...
   'sd_Epo_ext',...
   'sd_Epo_int',...
   'sd_Epo_mem',...
    'Epo_ext',...
    'Epo_int',...
     'Epo',     'EpoR',     'Epo_EpoR',     'Epo_EpoR_i',     'dEpo_i',     'dEpo_e'),...
   init_Epo,...
   init_EpoR_rel,...
   kD,...
   kde,...
   kdi,...
   ke,...
   kex,...
   koff,...
   kon,...
   kt,...
   offset,...
   scale,...
   sd_Epo_bound,...
   sd_Epo_ext,...
   sd_Epo_int,...
   sd_Epo_mem,...
    Epo_ext,...
    Epo_int,...
Epo,EpoR,Epo_EpoR,Epo_EpoR_i,dEpo_i,dEpo_e);
if(length(Epo_ext_cpm)==1 && length(Epo_ext_cpm)<length(t))
    Epo_ext_cpm = ones(size(t))*Epo_ext_cpm; 
end
if(length(Epo_mem_cpm)==1 && length(Epo_mem_cpm)<length(t))
    Epo_mem_cpm = ones(size(t))*Epo_mem_cpm; 
end
if(length(Epo_int_cpm)==1 && length(Epo_int_cpm)<length(t))
    Epo_int_cpm = ones(size(t))*Epo_int_cpm; 
end


% Comparison of simulated observables in the benchmark collection with simulated observables here:
if isfield(d.Simulation,'value')
    [~,ia,ib]=intersect(d.Simulation.time,t);
    figure,hold on;
    for i=1:length(ia)
        plot(d.Simulation.value{1}(ia(i)),Epo_ext_cpm(ib(i)),'b.');
    end
    for i=1:length(ia)
        plot(d.Simulation.value{2}(ia(i)),Epo_mem_cpm(ib(i)),'b.');
    end
    for i=1:length(ia)
        plot(d.Simulation.value{3}(ia(i)),Epo_int_cpm(ib(i)),'b.');
    end
    plot(xlim,xlim,'k-')
    xlabel('Simulation data in Benchmark-files')
    ylabel('simulation with Matlab''s ODE solver')


    % maximal difference between simulation in the benchmark collection and simulation here
    [~,ia,ib]=intersect(d.Simulation.time,t);
    maxdiff = 0;
    reldiff = 0;
    for i=1:length(ia)
        maxdiff = max(maxdiff,abs(d.Simulation.value{1}(ia(i))-Epo_ext_cpm(ib(i))));
        reldiff = max(reldiff,abs(d.Simulation.value{1}(ia(i))-Epo_ext_cpm(ib(i)))./max(1e-10,d.Simulation.value{1}(ia(i))));
    end
    for i=1:length(ia)
        maxdiff = max(maxdiff,abs(d.Simulation.value{2}(ia(i))-Epo_mem_cpm(ib(i))));
        reldiff = max(reldiff,abs(d.Simulation.value{2}(ia(i))-Epo_mem_cpm(ib(i)))./max(1e-10,d.Simulation.value{2}(ia(i))));
    end
    for i=1:length(ia)
        maxdiff = max(maxdiff,abs(d.Simulation.value{3}(ia(i))-Epo_int_cpm(ib(i))));
        reldiff = max(reldiff,abs(d.Simulation.value{3}(ia(i))-Epo_int_cpm(ib(i)))./max(1e-10,d.Simulation.value{3}(ia(i))));
    end
    fprintf('maxdiff=%f,',maxdiff)
    fprintf('reldiff=%f,',reldiff)
 disp(' ')
else
    disp('d.Simulation.value does not exist: Seems to be an empty prediction condition.')
end