PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/matlab/examples/model.m

https://code.google.com/
MATLAB | 272 lines | 207 code | 21 blank | 44 comment | 10 complexity | 25fed4456aab87c744225a6fa490b612 MD5 | raw file
Possible License(s): GPL-3.0, CC-BY-3.0
  1. function [err, timepoints, species_out, observables_out ] = model( timepoints, species_init, parameters, suppress_plot )
  2. %MODEL Integrate reaction network and plot observables.
  3. % Integrates the reaction network corresponding to the BioNetGen model
  4. % 'model' and then (optionally) plots the observable trajectories,
  5. % or species trajectories if no observables are defined. Trajectories are
  6. % generated using either default or user-defined parameters and initial
  7. % species values. Integration is performed by the MATLAB stiff solver
  8. % 'ode15s'. MODEL returns an error value, a vector of timepoints,
  9. % species trajectories, and observable trajectories.
  10. %
  11. % [err, timepoints, species_out, observables_out]
  12. % = model( timepoints, species_init, parameters, suppress_plot )
  13. %
  14. % INPUTS:
  15. % -------
  16. % species_init : row vector of 10 initial species populations.
  17. % timepoints : column vector of time points returned by integrator.
  18. % parameters : row vector of 10 model parameters.
  19. % suppress_plot : 0 if a plot is desired (default), 1 if plot is suppressed.
  20. %
  21. % Note: to specify default value for an input argument, pass the empty array.
  22. %
  23. % OUTPUTS:
  24. % --------
  25. % err : 0 if the integrator exits without error, non-zero otherwise.
  26. % timepoints : a row vector of timepoints returned by the integrator.
  27. % species_out : array of species population trajectories
  28. % (columns correspond to species, rows correspond to time).
  29. % observables_out : array of observable trajectories
  30. % (columns correspond to observables, rows correspond to time).
  31. %
  32. % QUESTIONS about the BNG Mfile generator? Email justinshogg@gmail.com
  33. %% Process input arguments
  34. % define any missing arguments
  35. if ( nargin < 1 )
  36. timepoints = [];
  37. end
  38. if ( nargin < 2 )
  39. species_init = [];
  40. end
  41. if ( nargin < 3 )
  42. parameters = [];
  43. end
  44. if ( nargin < 4 )
  45. suppress_plot = 0;
  46. end
  47. % initialize outputs (to avoid error msgs if script terminates early
  48. err = 0;
  49. species_out = [];
  50. observables_out = [];
  51. % setup default parameters, if necessary
  52. if ( isempty(parameters) )
  53. parameters = [ 100, 100, 100, 100, 1, 1, 1, 1, 1, 1 ];
  54. end
  55. % check that parameters has proper dimensions
  56. if ( size(parameters,1) ~= 1 | size(parameters,2) ~= 10 )
  57. fprintf( 1, 'Error: size of parameter argument is invalid! Correct size = [1 10].\n' );
  58. err = 1;
  59. return;
  60. end
  61. % setup default initial values, if necessary
  62. if ( isempty(species_init) )
  63. species_init = initialize_species( parameters );
  64. end
  65. % check that species_init has proper dimensions
  66. if ( size(species_init,1) ~= 1 | size(species_init,2) ~= 10 )
  67. fprintf( 1, 'Error: size of species_init argument is invalid! Correct size = [1 10].\n' );
  68. err = 1;
  69. return;
  70. end
  71. % setup default timepoints, if necessary
  72. if ( isempty(timepoints) )
  73. timepoints = linspace(0,0.2,10+1)';
  74. end
  75. % check that timepoints has proper dimensions
  76. if ( size(timepoints,1) < 2 | size(timepoints,2) ~= 1 )
  77. fprintf( 1, 'Error: size of timepoints argument is invalid! Correct size = [t 1], t>1.\n' );
  78. err = 1;
  79. return;
  80. end
  81. % setup default suppress_plot, if necessary
  82. if ( isempty(suppress_plot) )
  83. suppress_plot = 0;
  84. end
  85. % check that suppress_plot has proper dimensions
  86. if ( size(suppress_plot,1) ~= 1 | size(suppress_plot,2) ~= 1 )
  87. fprintf( 1, 'Error: suppress_plots argument should be a scalar!\n' );
  88. err = 1;
  89. return;
  90. end
  91. % define parameter labels (this is for the user's reference!)
  92. param_labels = { 'A0', 'B0', 'C0', 'D0', 'kf1', 'kf2', 'kf3', 'kr1', 'kr2', 'kr3' };
  93. %% Integrate Network Model
  94. % calculate expressions
  95. [expressions] = calc_expressions( parameters );
  96. % set ODE integrator options
  97. opts = odeset( 'RelTol', 1e-008, ...
  98. 'AbsTol', 0.0001, ...
  99. 'Stats', 'off', ...
  100. 'BDF', 'off', ...
  101. 'MaxOrder', 5 );
  102. % define derivative function
  103. rhs_fcn = @(t,y)( calc_species_deriv( t, y, expressions ) );
  104. % simulate model system (stiff integrator)
  105. try
  106. [timepoints, species_out] = ode15s( rhs_fcn, timepoints, species_init', opts );
  107. catch
  108. err = 1;
  109. fprintf( 1, 'Error: some problem encounteredwhile integrating ODE network!\n' );
  110. return;
  111. end
  112. % calculate observables
  113. observables_out = zeros( length(timepoints), 3 );
  114. for t = 1 : length(timepoints)
  115. observables_out(t,:) = calc_observables( species_out(t,:), expressions );
  116. end
  117. %% Plot Output, if desired
  118. if ( ~suppress_plot )
  119. % define plot labels
  120. observable_labels = { 'A_B', 'A_C', 'A_D' };
  121. % construct figure
  122. plot(timepoints,observables_out);
  123. title('model observables','fontSize',14,'Interpreter','none');
  124. axis([0 timepoints(end) 0 inf]);
  125. legend(observable_labels,'fontSize',10,'Interpreter','none');
  126. xlabel('time','fontSize',12,'Interpreter','none');
  127. ylabel('number','fontSize',12,'Interpreter','none');
  128. end
  129. %~~~~~~~~~~~~~~~~~~~~~%
  130. % END of main script! %
  131. %~~~~~~~~~~~~~~~~~~~~~%
  132. % initialize species function
  133. function [species_init] = initialize_species( params )
  134. species_init = zeros(1,10);
  135. species_init(1) = params(1);
  136. species_init(2) = params(2);
  137. species_init(3) = params(3);
  138. species_init(4) = params(4);
  139. species_init(5) = 0;
  140. species_init(6) = 0;
  141. species_init(7) = 0;
  142. species_init(8) = 0;
  143. species_init(9) = 0;
  144. species_init(10) = 0;
  145. end
  146. % user-defined functions
  147. % Calculate expressions
  148. function [ expressions ] = calc_expressions ( parameters )
  149. expressions = zeros(1,10);
  150. expressions(1) = parameters(1);
  151. expressions(2) = parameters(2);
  152. expressions(3) = parameters(3);
  153. expressions(4) = parameters(4);
  154. expressions(5) = parameters(5);
  155. expressions(6) = parameters(6);
  156. expressions(7) = parameters(7);
  157. expressions(8) = parameters(8);
  158. expressions(9) = parameters(9);
  159. expressions(10) = parameters(10);
  160. end
  161. % Calculate observables
  162. function [ observables ] = calc_observables ( species, expressions )
  163. observables = zeros(1,3);
  164. observables(1) = species(5) +species(8) +species(10);
  165. observables(2) = species(8) +species(10);
  166. observables(3) = species(10);
  167. end
  168. % Calculate ratelaws
  169. function [ ratelaws ] = calc_ratelaws ( species, expressions, observables )
  170. ratelaws = zeros(1,3);
  171. ratelaws(1) = expressions(5)*species(1)*species(2);
  172. ratelaws(2) = expressions(6)*species(2)*species(3);
  173. ratelaws(3) = expressions(7)*species(3)*species(4);
  174. ratelaws(4) = expressions(5)*species(1)*species(6);
  175. ratelaws(5) = expressions(8)*species(5);
  176. ratelaws(6) = expressions(6)*species(2)*species(7);
  177. ratelaws(7) = expressions(6)*species(5)*species(3);
  178. ratelaws(8) = expressions(6)*species(5)*species(7);
  179. ratelaws(9) = expressions(9)*species(6);
  180. ratelaws(10) = expressions(7)*species(6)*species(4);
  181. ratelaws(11) = expressions(10)*species(7);
  182. ratelaws(12) = expressions(5)*species(1)*species(9);
  183. ratelaws(13) = expressions(8)*species(8);
  184. ratelaws(14) = expressions(8)*species(10);
  185. ratelaws(15) = expressions(9)*species(8);
  186. ratelaws(16) = expressions(9)*species(9);
  187. ratelaws(17) = expressions(9)*species(10);
  188. ratelaws(18) = expressions(7)*species(8)*species(4);
  189. ratelaws(19) = expressions(10)*species(9);
  190. ratelaws(20) = expressions(10)*species(10);
  191. end
  192. % Calculate species derivates
  193. function [ Dspecies ] = calc_species_deriv ( time, species, expressions )
  194. % initialize derivative vector
  195. Dspecies = zeros(10,1);
  196. % update observables
  197. [ observables ] = calc_observables( species, expressions );
  198. % update ratelaws
  199. [ ratelaws ] = calc_ratelaws( species, expressions, observables );
  200. % calculate derivatives
  201. Dspecies(1) = -ratelaws(4) -ratelaws(1) +ratelaws(13) -ratelaws(12) +ratelaws(14) +ratelaws(5);
  202. Dspecies(2) = -ratelaws(6) -ratelaws(1) +ratelaws(16) +ratelaws(9) -ratelaws(2) +ratelaws(5);
  203. Dspecies(3) = ratelaws(11) -ratelaws(3) -ratelaws(7) +ratelaws(9) -ratelaws(2) +ratelaws(15);
  204. Dspecies(4) = ratelaws(11) -ratelaws(18) -ratelaws(3) +ratelaws(19) -ratelaws(10) +ratelaws(20);
  205. Dspecies(5) = -ratelaws(8) +ratelaws(1) -ratelaws(7) +ratelaws(17) +ratelaws(15) -ratelaws(5);
  206. Dspecies(6) = -ratelaws(4) +ratelaws(19) +ratelaws(13) -ratelaws(10) -ratelaws(9) +ratelaws(2);
  207. Dspecies(7) = -ratelaws(8) -ratelaws(6) -ratelaws(11) +ratelaws(3) +ratelaws(16) +ratelaws(17);
  208. Dspecies(8) = ratelaws(4) -ratelaws(18) +ratelaws(7) -ratelaws(13) +ratelaws(20) -ratelaws(15);
  209. Dspecies(9) = ratelaws(6) -ratelaws(19) -ratelaws(16) +ratelaws(10) -ratelaws(12) +ratelaws(14);
  210. Dspecies(10) = ratelaws(8) +ratelaws(18) -ratelaws(17) +ratelaws(12) -ratelaws(20) -ratelaws(14);
  211. end
  212. end