Team:Groningen/Modelling/Model.js

From 2009.igem.org

(Difference between revisions)
m
m
Line 72: Line 72:
       nk1 = f(nt,nx);
       nk1 = f(nt,nx);
       cont = false;
       cont = false;
-
       for(var v in x) {
+
       /*for(var v in x) {
         e = nx[v] - h*nk1[v] - x[v];
         e = nx[v] - h*nk1[v] - x[v];
         if (Math.abs(e)>(Math.abs(x[v])+Math.abs(nx[v]))*1e-5) {
         if (Math.abs(e)>(Math.abs(x[v])+Math.abs(nx[v]))*1e-5) {
Line 80: Line 80:
           break;
           break;
         }
         }
-
       }
+
       }*/
       if (!cont) {
       if (!cont) {
         var nnt = Math.min(t + 1.5*h,maxt[mti]);
         var nnt = Math.min(t + 1.5*h,maxt[mti]);

Revision as of 12:26, 5 October 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], timeKey: []}, 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]) {
     data.timeKey.push(data.time.length-1);
     mti++;
   }
 } while(t<maxt[maxt.length-1]);
 return data;

}*/

function simulate(x0,maxt,f) {

 if (!maxt.length) maxt = [maxt];
 maxt.sort(function(a,b){return a - b;});
 var t = 0;
 var h, nt, mti = 0;
 var data = {time: [0], timeKey: []}, x = {}, k1 = {}, nx = {}, nk1 = {}, e, cont;
 for(var v in x0) {
   nx[v] = x[v] = x0[v];
   data[v] = [x0[v]];
 }
 k1 = f(t,x);
 for(var mti=0; mti<maxt.length; mti++) {
   h = maxt[mti]-t;
   nt = maxt[mti];
   do {
     for(var v in x) {
       nx[v] = x[v] + h*k1[v];
     }
     nk1 = f(nt,nx);
     cont = false;
     /*for(var v in x) {
       e = nx[v] - h*nk1[v] - x[v];
       if (Math.abs(e)>(Math.abs(x[v])+Math.abs(nx[v]))*1e-5) {
         h /= 2;
         nt = t + h;
         cont = true;
         break;
       }
     }*/
     if (!cont) {
       var nnt = Math.min(t + 1.5*h,maxt[mti]);
       h = nnt-nt;
       t = nt;
       nt = nnt;
       x = nx;
       k1 = nk1;
       for(var v in x) {
         data[v].push(x[v]);
       }
       data.time.push(t);
     }
   } while(cont || t<maxt[mti]);
   data.timeKey.push(data.time.length-1);
 }
 return data;

}