Team:Groningen/Modelling/model/calc.js

From 2009.igem.org

(Difference between revisions)
 
(57 intermediate revisions not shown)
Line 28: Line 28:
   document.getElementById('modelDataGraph').refresh();
   document.getElementById('modelDataGraph').refresh();
}
}
 +
Line 35: Line 36:
   node.value = v;
   node.value = v;
}
}
 +
Line 90: Line 92:
function transport(){
function transport(){
-
alert("TRANSPORT");
 
  // variablen
  // variablen
Line 101: Line 102:
               ArsBAs: [0]};
               ArsBAs: [0]};
-
// constanten
+
  // constanten
   var totalTime = 300;
   var totalTime = 300;
   var stepSize = 0.1;
   var stepSize = 0.1;
Line 135: Line 136:
-
// ------- het gehele model -------------------------------------------
 
 +
 +
 +
 +
 +
 +
// ------- het gehele model -------------------------------------------
function modelTotal(){
function modelTotal(){
-
+
 
-
// Definieren van begincondities dit zijn dus constanten die later niet gebruikt worden
+
  alert("hallo");
 +
 
 +
  // Definieren van begincondities dit zijn dus constanten die later niet gebruikt worden
   //Begincondities (op tijdstip nul) die in het 0-de element van een array moeten worden gezet.
   //Begincondities (op tijdstip nul) die in het 0-de element van een array moeten worden gezet.
-
   var data = { AsexT:  [5],
+
   var data = {  
-
            ArsBas: [0],
+
  AsexT:  [5],
-
            GlpFas: [0],
+
  ArsBas: [0],
-
            GlpFT:  [5],
+
  GlpFas: [0],
-
            ArsBT:  [5],
+
  GlpFT:  [5],
-
            AsinT:  [0],
+
  ArsBT:  [5],
-
            ars1T:  [5],
+
  AsinT:  [0],
-
            ars2T:  [5],
+
  ars1T:  [5],
-
            pro:    [5],
+
  ars2T:  [5],
-
            ArsRT:  [5],
+
  pro:    [5],
-
            GV:    [0],
+
  ArsRT:  [5],
-
            Time:  [0]};
+
  GV:    [0],
 +
  Time:  [0],
 +
  ArsB:  [0],
 +
  Asin:  [0],
 +
  ArsR:  [0],
 +
  ars:  [0],
 +
  GlpF:  [0],
 +
  ArsRas:[0],
 +
  ars1:  [0],
 +
  ars2:  [0],
 +
  arsT:  [0],
 +
  ArsRars:[0],
 +
  Asex:  [0]};
 +
 
   // Begincondities die constantes blijven
   // Begincondities die constantes blijven
   var Vc = 10;
   var Vc = 10;
-
   var Timestep = 10;
+
   var TotalTime = 10; // 10 seconds
-
   var N = Time/Timestep; // dit gaat niet goed!! je kunt niet delen door de gehele array misschien een totaltime ofzo gebruiken
+
   var Timestep = 0.01; // 1/100th of a second
 +
  //var N = TotalTime/Timestep;  
 +
 
 +
var N = 5;
 +
 
 +
  var K5 = 10;
   var Vs = 10;
   var Vs = 10;
 +
  var K7 = 10;
   var k8 = 10;
   var k8 = 10;
   var v5 = 10;
   var v5 = 10;
Line 170: Line 197:
   var Beta3 = 10;
   var Beta3 = 10;
   var Beta1 = 10;
   var Beta1 = 10;
-
   var K3d = 0,33; // micromolair;
+
   var K3d = 0.33; // micromolair;
   var K1d = K3d/10;
   var K1d = K3d/10;
-
 
+
 
-
//Er komen nog een hoop nieuwe variabelen aan stop ze tenzij anders aangegeven allemaal in een Array
+
  //Er komen nog een hoop nieuwe variabelen aan stop ze tenzij anders aangegeven allemaal in een Array
-
    //We stoppen nu het gehele programma in een loop (Ik doe een forloop, je moet zelf maar kijken wat het handigst is.)
+
  //We stoppen nu het gehele programma in een loop (Ik doe een forloop, je moet zelf maar kijken wat het handigst is.)
   var TOL = 10^-6;
   var TOL = 10^-6;
   var getal = 500;
   var getal = 500;
-
  var Yvalue = getal > TOL; // is dit een if lus??? of zomaar iets om een waarde aan y te geven??
+
   
-
 
+
   
-
 
+
-
 
+
-
  var dataEndConcentrations = {  ArsB:  [0],
+
-
Asin:  [0],
+
-
ArsR:  [0],
+
-
ars:  [0],
+
-
GlpF:  [0],
+
-
ArsRas:[0],
+
-
Asex: [0]};
+
-
   for(var i = 1 ; i < N ; i++) {
+
  function nonnegative(v) { /*return v>=0?v:0;*/ return v; }
-
//We passen nu eerst Newton's methode toe
+
 
-
// Eerst maken we een Array X met de Afschatting van de variabelen
+
   for(var i = 0 ; i < N ; i++) {
-
+
    //We passen nu eerst Newton's methode toe
-
// heb nu de waarden genomen van uit de array's en die in de tmp array x gezet.
+
  // Eerst maken we een Array X met de Afschatting van de variabelen
-
+
 
-
var x =new Array(6);
+
    var x =new Array(7);
-
x[0] = ArsBT[i]/2; //(ArsB)
+
  x[0] = data.ArsBT[i]/2; //(ArsB)
-
x[1] = Asex[i]/10; // Asin        // zit nog niks in asex dus kun je ook niet delen
+
  x[1] = data.Asex[i]/10; // Asin         
-
x[2] = ArsRT[i]/3; // ArsR
+
  x[2] = data.ArsRT[i]/3; // ArsR
-
x[3] = ArsRT[i]/3; // ars
+
  x[3] = data.ArsRT[i]/3; // ars
-
x[4] = GlpF[i]/2; // GlpF        // zit nog niks in GLPF dus kun je ook niet delen
+
  x[4] = data.GlpF[i]/2; // GlpF         
-
x[5] = ArsRT[i]/3; // ArsRas
+
  x[5] = data.ArsRT[i]/3; // ArsRas
-
x[6] = Asex[i]/2;  // Asex      // zit nog niks in asex dus kun je ook niet delen
+
  x[6] = data.Asex[i]/2;  // Asex       
-
+
-
//Nu maken we weer een forloop aan
+
  //Nu maken we weer een forloop aan
-
for ( var j = 1; j <= N && Yvalue>TOL; j++) {
+
  var Yvalue = TOL+1;
-
   
+
  for ( var j = 1; j <= N && Yvalue>TOL; j++) {
-
// variabelen ??
+
 
-
var K7 = 10;  
+
                  var F = new Array(6);
 +
  F[0] =  ((data.ArsBT[i] * K7) / (x[1] + K7)) - x[0];
 +
  F[1] = ((data.AsinT[i] / (1 + (x[2] / K1d) + (x[0]) / K7))) - x[1];
 +
  F[2] = ((data.ArsRT[i]) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[2];
 +
  F[3] = ((K3d) / (Math.pow(x[2],2) + K3d)) - x[3] ;
 +
  F[4] = ((data.GlpFT[i] * K5) / (x[6] + K5)) - x[4];
 +
  F[5] = ((data.ArsRT[i] * x[1] / K1d) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[5];
 +
  F[6] = ((data.AsexT[i] * K5) / (K5 + x[4])) - x[6];
-
+
 
-
var f =new Array(6); // als het een functie moet zijn, dan moet het vast anders gedifineerd worden
+
  //Hierna maken we een Matrix 7x7 matrix aan
-
    f[0] = ((ArsBT[i] * K7) / (x[1] + K7)) - x[0]
+
  var matrix = new Array(7);  
-
f[1] = ((AsinT[i]) / (1 + (x[2] / K1d) + (x[0]) / K7))) - X[1];
+
  matrix[0] = new Array(7);
-
F[2] = ((ArsRT[i]) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[2];
+
  matrix[1] = new Array(7);  
-
F[3] = ((K3d) / (x[2]^2 + K3d)) - x[3] ;
+
  matrix[2] = new Array(7);  
-
F[4] = ((GlpFT[i] * K5) / (x(6) + K5)) - x[4];
+
  matrix[3] = new Array(7);  
-
F[5] = ((ARsRT[i] * x[1] / K1d) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[5];
+
  matrix[4] = new Array(7);
-
F[6] = ((AsexT[i] * K5) / (K5 + x[4])) - x[6];
+
  matrix[5] = new Array(7);
-
+
  matrix[6] = new Array(7);
-
+
-
    // matrix:  http://www.iterasi.net/openviewer.aspx?sqrlitid=pvgcg4m2ike_hwifjguc5a geen idee hoe het er weer uit moet drm, array in array
+
 
 
-
//Hierna maken we een Matrix 7x7 matrix J aan
 
-
var matrix = new Array(7);
 
-
j[0] = new Array(7);
 
-
j[1] = new Array(7);
 
-
j[2] = new Array(7);
 
-
j[3] = new Array(7);
 
-
j[4] = new Array(7);
 
-
j[5] = new Array(7);
 
-
j[6] = new Array(7);
 
-
j[7] = new Array(7);
 
-
 
-
j[1][1] = -1;  j[1][2] = 0; j[1][3] = 0; j[1][4] = 0; j[1][5] = 0; j[1][6] = 0; j[1][7] = 0;
 
-
    j[2][1] = 0;  j[2][2] = -1; j[2][3] = 0; j[2][4] = 0; j[2][5] = 0; j[2][6] = 0; j[2][7] = 0;
 
-
j[3][1] = 0;  j[3][2] = 0; j[3][3] = (-2 * ((ArsRT) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))^2) - 1); j[3][4] = 0; j[3][5] = 0; j[3][6] = 0; j[3][7] = 0;
 
-
    j[4][1] = 0;  j[4][2] = 0; j[4][3] = 0; j[4][4] = -1; j[4][5] = 0; j[4][6] = 0; j[4][7] = 0;
 
-
j[5][1] = 0;  j[5][2] = 0; j[5][3] = 0; j[5][4] = 0; j[5][5] = -1; j[5][6] = 0; j[5][7] = 0;
 
-
j[6][1] = 0;  j[6][2] = 0; j[6][3] = 0; j[6][4] = 0; j[6][5] = 0; j[6][6] = -1; j[6][7] = 0;
 
-
j[7][1] = 0;  j[7][2] = 0; j[7][3] = 0; j[7][4] = 0; j[7][5] = 0; j[7][6] = 0; j[7][7] = -1;
 
-
 
-
//Nu maken we een Array Y aan
 
-
var y =new Array(6);
 
-
y[0] = f[0]/ j[1][1];
 
-
y[1] = f[1]/ j[2][2];
 
-
y[2] = f[2]/ j[3][3];
 
-
y[3] = f[3]/ j[4][4];
 
-
y[4] = f[4]/ j[5][5];
 
-
y[5] = f[5]/ j[6][6];
 
-
y[6] = f[6]/ j[7][7];
 
-
 
-
 
-
// Math.abs om de Y waarden zetten (bijv. Math.abs(Y(0)))
 
-
Yvalue = Math.abs(Y[0]) + Math.abs(Y[1]) + Math.abs(Y[2]) + Math.abs(Y[3]) + Math.abs(Y[4]) + Math.abs(Y[5]) + Math.abs(Y[6]);
 
-
+
  matrix[0][0] = -1; matrix[0][1] = 0; matrix[0][2] = 0; matrix[0][3] = 0; matrix[0][4] = 0; matrix[0][5] = 0; matrix[0][6] = 0;
-
+
  matrix[1][0] = 0; matrix[1][1] = -1; matrix[1][2] = 0; matrix[1][3] = 0; matrix[1][4] = 0; matrix[1][5] = 0; matrix[1][6] = 0;
-
for ( i = 0 ; i <= 6 ; i++) {
+
  matrix[2][0] = 0;  matrix[2][1] = 0; matrix[2][2] = (-2 * Math.pow(((data.ArsRT[i]) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))),2) - 1); matrix[2][3] = 0; matrix[2][4] = 0; matrix[2][5] = 0; matrix[2][6] = 0;
-
x[i] = x[i] + y[i];
+
  matrix[3][0] = 0;  matrix[3][1] = 0; matrix[3][2] = 0; matrix[3][3] = -1; matrix[3][4] = 0; matrix[3][5] = 0; matrix[3][6] = 0;
-
}
+
  matrix[4][0] = 0;  matrix[4][1] = 0; matrix[4][2] = 0; matrix[4][3] = 0; matrix[4][4] = -1; matrix[4][5] = 0; matrix[4][6] = 0;
-
}
+
  matrix[5][0] = 0;  matrix[5][1] = 0; matrix[5][2] = 0; matrix[5][3] = 0; matrix[5][4] = 0; matrix[5][5] = -1; matrix[5][6] = 0;
-
+
  matrix[6][0] = 0;  matrix[6][1] = 0; matrix[6][2] = 0; matrix[6][3] = 0; matrix[6][4] = 0; matrix[6][5] = 0; matrix[6][6] = -1;
-
if(x[0]>0){
+
-
ArsB[i] = x[0];  
+
-
}esle{
+
-
ArsB[i]= 0;
+
-
}
+
-
+
-
if(x[1]>0){
+
-
Asin[i] = x[1];
+
-
}esle{
+
-
Asin[i] = 0;
+
-
}
+
-
+
-
if(X(2)>0){
+
-
ArsR[i] = x[2];
+
-
}esle{
+
-
ArsR[i] = 0;
+
-
}
+
-
+
-
if(X(3)>0){
+
-
ars[i] = x[3];
+
-
}esle{
+
-
ars[i] = 0;
+
-
}
+
-
+
-
if(X(4)>0){
+
-
GlpF[i] = x[4];
+
-
}esle{
+
-
GlpF[i] = 0;
+
-
}
+
-
+
-
if(x[5]>0){
+
-
ArsRas[i] = x[5];
+
-
}esle{
+
-
ArsRas[i] = 0;
+
-
}
+
-
+
-
if(X(6)>0){
+
-
Asex[i] = x[6];
+
-
}esle{
+
-
Asex[i] = 0;
+
-
}
+
-
+
-
var data2 = {
 
-
ars1:  [0],
 
-
ars2:  [0],
 
-
ArsBas: [0],
 
-
GlpFas: [0], // ookal bovenin gedifineerd, is het dezelfde of een andere
 
-
arsT:  [0],
 
-
ArsRars:[0],
 
-
Asex:  [0], //  ookal bovenin gedifineerd, is het dezelfde of een andere
 
-
k6:    [0]};    // is dit ook een array?? blijft deze niet gewoon een vaste snelheid houden??
 
-
//Nu gaan we verdere variabelen opstellen ook deze moeten weer in Array's komen te staan
+
  //Nu maken we een Array Y aan
-
k6[i] = (v5 * Vc) / (GlpFT[i] * Vs);
+
  var y =new Array(7);
-
ars1[i] = (ars1T[i] * K3d) /(K3d + ArsR[i]^2);
+
  y[0] = F[0]/ matrix[0][0];
-
if(ars1[i])<0){
+
  y[1] = F[1]/ matrix[1][1];
-
ars1[i] = 0;
+
  y[2] = F[2]/ matrix[2][2];
-
}
+
  y[3] = F[3]/ matrix[3][3];
-
ars2[i] = (ars2T[i] * K3d) /(K3d + ArsR[i]^2);
+
  y[4] = F[4]/ matrix[4][4];
-
if(ars2[i]<0){
+
  y[5] = F[5]/ matrix[5][5];
-
ars2[i] = 0;
+
  y[6] = F[6]/ matrix[6][6];
-
}
+
 
-
ArsBas[i] = ArsBT[i] - ArsB[i];
+
  // Math.abs om de Y waarden zetten (bijv. Math.abs(Y(0)))
-
if(ArsBas[i]<0){
+
  Yvalue = Math.abs(y[0]) + Math.abs(y[1]) + Math.abs(y[2]) + Math.abs(y[3]) + Math.abs(y[4]) + Math.abs(y[5]) + Math.abs(y[6]);
-
ArsBas[i] = 0;
+
-
}
+
-
GlpFas[i] = GlpFT[i] - GlpF[i];
+
-
if(GlpFas[i]<0){
+
-
GlpFas[i] = 0;
+
-
}
+
-
arsT[i] = ars1T[i] + ars2T[i];
+
-
if(arsT[i]<0){
+
-
arsT[i] = 0;
+
-
}
+
-
ArsRars[i] = arsT(i) - ars(i);
+
-
if(ArsRars[i]<0){
+
-
ArsRars[i] = 0;
+
-
}
+
-
Asex[i] = AsexT[i] - GlpFas[i];
+
-
if(Asex[i]<0){
+
-
Asex[i] = 0;
+
-
}
+
-
//We gaan nu met Eulers methode de volgende slag voorbereiden
+
  for (var k = 0 ; k <= 6 ; k++) {
-
AsexT[i+1] = AsexT[i] + Timestep((Vc/Vs)*k8*ArsBas[i]-k6*GlpFas[i]);
+
    x[k] = x[k] + y[k];
-
if (AsexT [i+1]<0){
+
  }
-
AsexT[i+1] = 0;
+
  }
-
}
+
-
GlpfT[i+1] = GlpfT[i];
+
-
ArsBT[i+1] = ArsBT[i] + Timestep*(Beta4*ars1[i] - Ln[2]/(tauB * ArsB[i]));
+
-
if (ArsBT[i+1]<0){
+
-
ArsBT[i+1] = 0;
+
-
}
+
-
AsinT[i+1] = AsinT[i] + Timestep*((Vs/Vc)*k6*GlpFas[i]-k8*ArsBas[i]);
+
-
if (AsinT[i+1]<0){
+
-
AsinT[i+1] = 0;
+
-
}
+
-
ars1T[i+1] = ars1T[i];
+
-
if (ars1T[i+1]<0){
+
-
ars1T[i+1] = 0;
+
-
}
+
-
ars2T[i+1] = ars2T[i];
+
-
if (ars2T[i+1]<0){
+
-
ars2T[i+1] = 0;
+
-
}
+
-
pro[i+1] = pro[i];
+
-
if (pro[i+1]<0){
+
-
pro[i+1] = 0;
+
-
}
+
-
ArsRT[i+1] = ArsRT[i] + Timestep(Beta1*ars1[i] + Beta3*pro[i] - (ln[2]/tauR)*ArsR[i]);
+
-
if (ArsRT[i+1]<0){
+
-
ArsRT[i+1] = 0;
+
-
}
+
-
GV[i+1] = GV[i] + Timestep(Beta5*ars2[i] - ln[2]*tauG*GV[i])
+
-
if (GV[i+1]<0){
+
-
GV[i+1] = 0;
+
-
}
+
-
Time[i+1] = Time[i] + Timestep;
+
-
if (Time[i+1]<0){
+
-
Time[i+1] = 0;
+
-
}
+
-
}
+
 +
  data.ArsB[i]  = nonnegative(x[0]);
 +
  data.Asin[i]  = nonnegative(x[1]);
 +
  data.ArsR[i]  = nonnegative(x[2]);
 +
  data.ars[i]    = nonnegative(x[3]);
 +
  data.GlpF[i]  = nonnegative(x[4]);
 +
  data.ArsRas[i] = nonnegative(x[5]);
 +
  data.Asex[i]  = nonnegative(x[6]);
 +
  //Nu gaan we verdere variabelen opstellen ook deze moeten weer in Array's komen te staan
 +
  var k6 = (v5 * Vc) / (data.GlpFT[i] * Vs);
 +
  data.ars1[i] = nonnegative((data.ars1T[i] * K3d) /(K3d + Math.pow(data.ArsR[i],2)));
 +
  data.ars2[i] = nonnegative((data.ars2T[i] * K3d) /(K3d + Math.pow(data.ArsR[i],2)));
 +
  data.ArsBas[i] = nonnegative(data.ArsBT[i] - data.ArsB[i]);
 +
  data.GlpFas[i] = nonnegative(data.GlpFT[i] - data.GlpF[i]);
 +
  data.arsT[i] = nonnegative(data.ars1T[i] + data.ars2T[i]);
 +
  data.ArsRars[i] = nonnegative(data.arsT[i] - data.ars[i]);
 +
  data.Asex[i] = nonnegative(data.AsexT[i] - data.GlpFas[i]);
 +
// ln is niet gedifineerd, alleen ln[2] wordt gebruikt is dit een array of een variable
 +
// Math.log(x)  Math.LN2
 +
  //We gaan nu met Eulers methode de volgende slag voorbereiden
 +
  data.AsexT[i+1] = nonnegative(data.AsexT[i] + Timestep*((Vc/Vs)*k8*data.ArsBas[i]-k6*data.GlpFas[i]));
 +
          data.GlpFT[i+1] = data.GlpFT[i]; // mag deze wel negatief worden??
 +
data.ArsBT[i+1] = nonnegative(data.ArsBT[i] + Timestep*(Beta4*data.ars1[i] - Math.LN2/(tauB * data.ArsB[i])));
 +
          data.AsinT[i+1] = nonnegative(data.AsinT[i] + Timestep*((Vs/Vc)*k6*data.GlpFas[i]-k8*data.ArsBas[i]));
 +
          data.ars1T[i+1] = nonnegative(data.ars1T[i]);
 +
          data.ars2T[i+1] = nonnegative(data.ars2T[i]);
 +
          data.pro[i+1] = nonnegative(data.pro[i]);
 +
alert("data.ArsRT[i] "+ data.ArsRT[i]);
 +
          data.ArsRT[i+1] = nonnegative(data.ArsRT[i] + Timestep*(Beta1*data.ars1[i] + Beta3*data.pro[i]-(Math.LN2/tauR)*data.ArsR[i]));
 +
          data.GV[i+1] = nonnegative(data.GV[i] + Timestep*(Beta5*data.ars2[i] - Math.LN2*tauG*data.GV[i])); 
 +
          data.Time[i+1] = nonnegative(data.Time[i] + Timestep);
 +
  }
 +
  var TotalmodelNode = document.getElementById("Totalmodel");
 +
  TotalmodelNode.data = data;
 +
  document.getElementById("TotalmodelGraph").refresh();
-
 
+
} // end function modeltotal
-
 
+
-
 
+
-
}
+

Latest revision as of 20:26, 12 September 2009

function calc(){

 //  gets input
 var growthFactorNode = document.getElementById("growthFactor");
 // reads input
 var growthFactor = Number(growthFactorNode.value); 
 
 // begin variable
 var time = 0;
 var x = 0;
 var y = 0;
 arrValueX = new Array();
 arrValueY = new Array();


 // process
 var growthFactor = growthFactor + 1;
 for (var time = 0; time < 30; time++) {
   var y = growthFactor*x*x;
   var x = x + 1;
   arrValueX.push(x);
   arrValueY.push(y);
 }
 
 // Set outputs
 setOutput(growthFactorAnswer, growthFactor ); 
 document.getElementById('modelDataGraph').refresh();

}



function setOutput(node,v) {

 node.innerHTML = formatNumberToHTML(v);
 node.value = v;

}


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');

}


// ------ Annelies timer functie ---------

var mijnTimer;

function tijd(){

 //  gets input
 var timeMiliSecNode = document.getElementById("timeMiliSec");
 // reads input
 var timeMiliSec2 = Number(timeMiliSecNode.value); 
 //alert("functie tijd: "+timeMiliSec2);
 if (mijnTimer) clearInterval(mijnTimer);
 mijnTimer = setInterval( "doSomething()",timeMiliSec2);

}

function doSomething(){

   //alert("functie doe iets BOVEN DE IF LUS: "+doSomething.time);
   if (doSomething.time === undefined) {
     doSomething.time = 0;
     
     //alert("functie doe ietsFDBADFNA: "+doSomething.time);
   }
   // Set outputs
   setOutput(tijdAnswer, doSomething.time);
   doSomething.time += 1;
  
   transport();

}



// -------- transport model, geeft waarden mee in een object/array ----------


function transport(){


// variablen
 var data = {time: [0],
             AsIn: [0],
             ArsB: [5],
             AsEx: [5],
             GlpF: [5],
             GlpFAs: [0],
             ArsBAs: [0]};
 // constanten
 var totalTime = 300;
 var stepSize = 0.1;
 var K5on = 1;
 var K5off = 1e-6;
 var K6 = 1e-3;
 var Vc = 1.1 - 0.0073;
 var Vs = 0.0073;
 var K7on = 1;
 var K7off = 1e-6;
 var K8 = 1e-3;


 var N = totalTime / stepSize ;
 for (var i=1;i<=N;i++){
   data.GlpFAs[i] = data.GlpFAs[i-1] + stepSize * (K5on * data.AsEx[i-1] * data.GlpF[i-1] - (K5off + K6) * data.GlpFAs[i-1]);
   data.AsEx[i] = data.AsEx[i-1] + stepSize * (-K5on * data.AsEx[i-1] * data.GlpF[i-1] + K5off * data.GlpFAs[i-1] + (Vc/Vs) * K8 * data.ArsBAs[i-1]);
   data.GlpF[i] = data.GlpF[i-1] + stepSize * (-(K5on * data.AsEx[i-1] * data.GlpF[i-1] - (K5off + K6) * data.GlpFAs[i-1]));
   data.ArsBAs[i] = data.ArsBAs[i-1] + stepSize * (K7on * data.AsIn[i-1] * data.ArsB[i-1] - (K7off+K8) * data.ArsBAs[i-1]);
   data.AsIn[i] = data.AsIn[i-1] + stepSize * (-K7on * data.AsIn[i-1] * data.ArsB[i-1] - (K7off + K8) * data.ArsBAs[i-1] - K8 * data.ArsBAs[i-1] + (Vs/Vc) * K6 * data.GlpFAs[i-1]);
   data.ArsB[i] = data.ArsB[i-1] + stepSize * (-(K7on * data.AsIn[i-1] * data.ArsB[i-1] - (K7off + K8) * data.ArsBAs[i-1]));
   data.time[i] = data.time[i-1] + stepSize;
 }
 setOutput(ModelAnswer, data.AsEx[4]); 
 var modelDataNode = document.getElementById("modelData");
 modelDataNode.data = data;
 document.getElementById("modelDataGraph").refresh();

}





// ------- het gehele model -------------------------------------------


function modelTotal(){

 alert("hallo");
 // Definieren van begincondities dit zijn dus constanten die later niet gebruikt worden
 //Begincondities (op tijdstip nul) die in het 0-de element van een array moeten worden gezet.
 var data = { 
 AsexT:  [5],
 ArsBas: [0],
 GlpFas: [0],
 GlpFT:  [5],
 ArsBT:  [5],
 AsinT:  [0],
 ars1T:  [5],
 ars2T:  [5],
 pro:    [5],
 ArsRT:  [5],
 GV:     [0],
 Time:   [0],
 ArsB:  [0],
 Asin:  [0],
 ArsR:  [0],
 ars:   [0],
 GlpF:  [0],
 ArsRas:[0],
 ars1:   [0],
 ars2:   [0],
 arsT:   [0],
 ArsRars:[0],
 Asex:   [0]};


 // Begincondities die constantes blijven
 var Vc = 10;
 var TotalTime = 10;  // 10 seconds
 var Timestep = 0.01; // 1/100th of a second
 //var N = TotalTime/Timestep; 
var N = 5;
 var K5 = 10;
 var Vs = 10;
 var K7 = 10; 
 var k8 = 10;
 var v5 = 10;		
 var tauG = 10;
 var tauB = 10;
 var tauR = 10;
 var Beta5 = 10;
 var Beta4 = 10;
 var Beta3 = 10;
 var Beta1 = 10;
 var K3d = 0.33; // micromolair;
 var K1d = K3d/10;
 
 //Er komen nog een hoop nieuwe variabelen aan stop ze tenzij anders aangegeven allemaal in een Array
 //We stoppen nu het gehele programma in een loop (Ik doe een forloop, je moet zelf maar kijken wat het handigst is.)
 var TOL = 10^-6;
 var getal = 500;


 function nonnegative(v) { /*return v>=0?v:0;*/ return v; }
 for(var i = 0 ; i < N ; i++) {
 	  //We passen nu eerst Newton's methode toe

// Eerst maken we een Array X met de Afschatting van de variabelen

 	  var x =new Array(7);

x[0] = data.ArsBT[i]/2; //(ArsB) x[1] = data.Asex[i]/10; // Asin x[2] = data.ArsRT[i]/3; // ArsR x[3] = data.ArsRT[i]/3; // ars x[4] = data.GlpF[i]/2; // GlpF x[5] = data.ArsRT[i]/3; // ArsRas x[6] = data.Asex[i]/2; // Asex

//Nu maken we weer een forloop aan var Yvalue = TOL+1; for ( var j = 1; j <= N && Yvalue>TOL; j++) {

                 var F = new Array(6); 

F[0] = ((data.ArsBT[i] * K7) / (x[1] + K7)) - x[0]; F[1] = ((data.AsinT[i] / (1 + (x[2] / K1d) + (x[0]) / K7))) - x[1]; F[2] = ((data.ArsRT[i]) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[2]; F[3] = ((K3d) / (Math.pow(x[2],2) + K3d)) - x[3] ; F[4] = ((data.GlpFT[i] * K5) / (x[6] + K5)) - x[4]; F[5] = ((data.ArsRT[i] * x[1] / K1d) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))) - x[5]; F[6] = ((data.AsexT[i] * K5) / (K5 + x[4])) - x[6];


//Hierna maken we een Matrix 7x7 matrix aan var matrix = new Array(7); matrix[0] = new Array(7); matrix[1] = new Array(7); matrix[2] = new Array(7); matrix[3] = new Array(7); matrix[4] = new Array(7); matrix[5] = new Array(7); matrix[6] = new Array(7);


matrix[0][0] = -1; matrix[0][1] = 0; matrix[0][2] = 0; matrix[0][3] = 0; matrix[0][4] = 0; matrix[0][5] = 0; matrix[0][6] = 0; matrix[1][0] = 0; matrix[1][1] = -1; matrix[1][2] = 0; matrix[1][3] = 0; matrix[1][4] = 0; matrix[1][5] = 0; matrix[1][6] = 0; matrix[2][0] = 0; matrix[2][1] = 0; matrix[2][2] = (-2 * Math.pow(((data.ArsRT[i]) / (1 + (x[1] / K1d) + (2 * x[2] * x[3] / K3d))),2) - 1); matrix[2][3] = 0; matrix[2][4] = 0; matrix[2][5] = 0; matrix[2][6] = 0; matrix[3][0] = 0; matrix[3][1] = 0; matrix[3][2] = 0; matrix[3][3] = -1; matrix[3][4] = 0; matrix[3][5] = 0; matrix[3][6] = 0; matrix[4][0] = 0; matrix[4][1] = 0; matrix[4][2] = 0; matrix[4][3] = 0; matrix[4][4] = -1; matrix[4][5] = 0; matrix[4][6] = 0; matrix[5][0] = 0; matrix[5][1] = 0; matrix[5][2] = 0; matrix[5][3] = 0; matrix[5][4] = 0; matrix[5][5] = -1; matrix[5][6] = 0; matrix[6][0] = 0; matrix[6][1] = 0; matrix[6][2] = 0; matrix[6][3] = 0; matrix[6][4] = 0; matrix[6][5] = 0; matrix[6][6] = -1;


//Nu maken we een Array Y aan var y =new Array(7); y[0] = F[0]/ matrix[0][0]; y[1] = F[1]/ matrix[1][1]; y[2] = F[2]/ matrix[2][2]; y[3] = F[3]/ matrix[3][3]; y[4] = F[4]/ matrix[4][4]; y[5] = F[5]/ matrix[5][5]; y[6] = F[6]/ matrix[6][6];

		  // Math.abs om de Y waarden zetten (bijv. Math.abs(Y(0)))

Yvalue = Math.abs(y[0]) + Math.abs(y[1]) + Math.abs(y[2]) + Math.abs(y[3]) + Math.abs(y[4]) + Math.abs(y[5]) + Math.abs(y[6]);

for (var k = 0 ; k <= 6 ; k++) { x[k] = x[k] + y[k]; } }

data.ArsB[i] = nonnegative(x[0]); data.Asin[i] = nonnegative(x[1]); data.ArsR[i] = nonnegative(x[2]); data.ars[i] = nonnegative(x[3]); data.GlpF[i] = nonnegative(x[4]); data.ArsRas[i] = nonnegative(x[5]); data.Asex[i] = nonnegative(x[6]);

	  //Nu gaan we verdere variabelen opstellen ook deze moeten weer in Array's komen te staan

var k6 = (v5 * Vc) / (data.GlpFT[i] * Vs); data.ars1[i] = nonnegative((data.ars1T[i] * K3d) /(K3d + Math.pow(data.ArsR[i],2))); data.ars2[i] = nonnegative((data.ars2T[i] * K3d) /(K3d + Math.pow(data.ArsR[i],2)));

data.ArsBas[i] = nonnegative(data.ArsBT[i] - data.ArsB[i]); data.GlpFas[i] = nonnegative(data.GlpFT[i] - data.GlpF[i]); data.arsT[i] = nonnegative(data.ars1T[i] + data.ars2T[i]); data.ArsRars[i] = nonnegative(data.arsT[i] - data.ars[i]); data.Asex[i] = nonnegative(data.AsexT[i] - data.GlpFas[i]);

// ln is niet gedifineerd, alleen ln[2] wordt gebruikt is dit een array of een variable // Math.log(x) Math.LN2

//We gaan nu met Eulers methode de volgende slag voorbereiden data.AsexT[i+1] = nonnegative(data.AsexT[i] + Timestep*((Vc/Vs)*k8*data.ArsBas[i]-k6*data.GlpFas[i]));

         data.GlpFT[i+1] = data.GlpFT[i]; // mag deze wel negatief worden??
data.ArsBT[i+1] = nonnegative(data.ArsBT[i] + Timestep*(Beta4*data.ars1[i] - Math.LN2/(tauB * data.ArsB[i])));
         data.AsinT[i+1] = nonnegative(data.AsinT[i] + Timestep*((Vs/Vc)*k6*data.GlpFas[i]-k8*data.ArsBas[i]));
         data.ars1T[i+1] = nonnegative(data.ars1T[i]);
         data.ars2T[i+1] = nonnegative(data.ars2T[i]);
         data.pro[i+1] = nonnegative(data.pro[i]);

alert("data.ArsRT[i] "+ data.ArsRT[i]);

         data.ArsRT[i+1] = nonnegative(data.ArsRT[i] + Timestep*(Beta1*data.ars1[i] + Beta3*data.pro[i]-(Math.LN2/tauR)*data.ArsR[i]));
         data.GV[i+1] = nonnegative(data.GV[i] + Timestep*(Beta5*data.ars2[i] - Math.LN2*tauG*data.GV[i]));  
         data.Time[i+1] = nonnegative(data.Time[i] + Timestep);
 }
 var TotalmodelNode = document.getElementById("Totalmodel");
 TotalmodelNode.data = data;
 document.getElementById("TotalmodelGraph").refresh();


} // end function modeltotal