Team:Groningen/Modelling/Model.js

From 2009.igem.org

(Difference between revisions)
m
m
 
(13 intermediate revisions not shown)
Line 19: Line 19:
}
}
-
/*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;});
   maxt.sort(function(a,b){return a - b;});
Line 26: Line 26:
   var data = {time: [0], timeKey: []}, x = {}, k1 = {};
   var data = {time: [0], timeKey: []}, x = {}, k1 = {};
   for(var v in x0) {
   for(var v in x0) {
-
     x[v] = x0[v];
+
     if (v.charAt(0)=='_') {
-
     data[v] = [x0[v]];
+
      x[v] = x0[v];
 +
      data[v] = [];
 +
     } else {
 +
      x[v] = x0[v];
 +
      data[v] = [x0[v]];
 +
    }
   }
   }
   do {
   do {
Line 39: Line 44:
     k1 = f(t,x);
     k1 = f(t,x);
     for(var v in x) {
     for(var v in x) {
-
       x[v] += h*k1[v];
+
       if (v.charAt(0)=='_') {
 +
        x[v] = k1[v];
 +
      } else {
 +
        x[v] += h*k1[v];
 +
      }
       data[v].push(x[v]);
       data[v].push(x[v]);
     }
     }
Line 50: Line 59:
   } while(t<maxt[maxt.length-1]);
   } while(t<maxt[maxt.length-1]);
   return data;
   return data;
-
}*/
+
}
 +
/*
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;});
   maxt.sort(function(a,b){return a - b;});
   var t = 0;
   var t = 0;
-
   var h, nt, mti = 0;
+
   var h = maxt[maxt.length-1], nt, mti = 0;
-
   var data = {time: [0], timeKey: []}, x = {}, k1 = {}, nx = {}, nk1 = {}, e, cont;
+
   var data = {time: [0], timeKey: []}, x = {}, k1, nx, nk1, e, cont;
   for(var v in x0) {
   for(var v in x0) {
-
     nx[v] = x[v] = x0[v];
+
     x[v] = x0[v];
     data[v] = [x0[v]];
     data[v] = [x0[v]];
   }
   }
   k1 = f(t,x);
   k1 = f(t,x);
   for(var mti=0; mti<maxt.length; mti++) {
   for(var mti=0; mti<maxt.length; mti++) {
-
     h = maxt[mti]-t;
+
     nt = Math.min(t + h,maxt[mti]);
-
     nt = maxt[mti];
+
     h = nt-t;
     do {
     do {
 +
      nx = {};
       for(var v in x) {
       for(var v in x) {
         nx[v] = x[v] + h*k1[v];
         nx[v] = x[v] + h*k1[v];
Line 74: Line 85:
       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 (isNaN(e) || Math.abs(e)>(Math.abs(x[v])+Math.abs(nx[v]))*1e-3) {
           h /= 2;
           h /= 2;
           nt = t + h;
           nt = t + h;
Line 82: Line 93:
       }
       }
       if (!cont) {
       if (!cont) {
-
         var nnt = Math.min(t + 1.5*h,maxt[mti]);
+
         var nnt = Math.min(nt + 1.1*h,maxt[mti]);
         h = nnt-nt;
         h = nnt-nt;
         t = nt;
         t = nt;
Line 97: Line 108:
   }
   }
   return data;
   return data;
-
}
+
}*/

Latest revision as of 09:39, 16 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) {
   if (v.charAt(0)=='_') {
     x[v] = x0[v];
     data[v] = [];
   } else {
     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) {
     if (v.charAt(0)=='_') {
       x[v] = k1[v];
     } else {
       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 = maxt[maxt.length-1], nt, mti = 0;
 var data = {time: [0], timeKey: []}, x = {}, k1, nx, nk1, e, cont;
 for(var v in x0) {
   x[v] = x0[v];
   data[v] = [x0[v]];
 }
 k1 = f(t,x);
 for(var mti=0; mti<maxt.length; mti++) {
   nt = Math.min(t + h,maxt[mti]);
   h = nt-t;
   do {
     nx = {};
     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 (isNaN(e) || Math.abs(e)>(Math.abs(x[v])+Math.abs(nx[v]))*1e-3) {
         h /= 2;
         nt = t + h;
         cont = true;
         break;
       }
     }
     if (!cont) {
       var nnt = Math.min(nt + 1.1*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;

}*/