Team:Groningen/Modelling/Model.js

From 2009.igem.org

(Difference between revisions)
(Enable specifying multiple explicit time-points.)
m (Sort maxt entries.)
Line 21: Line 21:
function simulate(x0,maxt,f) {
function simulate(x0,maxt,f) {
   if (!maxt.length) maxt = [maxt];
   if (!maxt.length) maxt = [maxt];
 +
  maxt.sort(function(a,b){return a - b;});
   var t = 0;
   var t = 0;
   var oh = Math.min(1,maxt[0]/2), h, nt, mti = 0;
   var oh = Math.min(1,maxt[0]/2), h, nt, mti = 0;

Revision as of 13:14, 28 September 2009

function formatNumberToHTML(v,p) {

 if (p===undefined) p = 5;
 return v.toPrecision(p)
         .replace(/e\+([0-9]+)$/i,'·10$1')
         .replace(/e\-([0-9]+)$/i,'·10-$1');

}

function setOutput(name,v,p) {

 var node = document.getElementById(name);
 if (!node) return;
 node.innerHTML = formatNumberToHTML(v);
 node.value = v;

}

function getInput(name) {

 var node = document.getElementById(name);
 if (!node) return undefined;
 return Number(node.value);

}

function simulate(x0,maxt,f) {

 if (!maxt.length) maxt = [maxt];
 maxt.sort(function(a,b){return a - b;});
 var t = 0;
 var oh = Math.min(1,maxt[0]/2), h, nt, mti = 0;
 var data = {time: [0]}, x = {}, k1 = {};
 for(var v in x0) {
   x[v] = x0[v];
   data[v] = [x0[v]];
 }
 do {
   if (t+oh>=maxt[mti]) {
     h = maxt[mti]-t;
     nt = maxt[mti];
   } else {
     h = oh;
     nt = t + h;
   }
   k1 = f(t,x);
   for(var v in x) {
     x[v] += h*k1[v];
     data[v].push(x[v]);
   }
   t = nt;
   data.time.push(t);
   if (t>=maxt[mti]) mti++;
 } while(t<maxt[maxt.length-1]);
 return data;

}