Advertisement
enkov

2D nonlinear Fredholm fuzzy functional integral equations

Oct 5th, 2016
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html>
  4.     <title>Web-based 2D solver example</title>
  5.     <meta name="Description" content="Web-based 2D nonlinear Fredholm fuzzy functional integral equations solver" />
  6.     <meta name="Keywords" content="two-dimmensional nonlinear fuzzy integral equation, Fredholm, solver, numerical method, approximate method, iterative method" />
  7.     <meta name="Author" content="Svetoslav Enkov. Atanaska Georgieva" />
  8. <head>
  9.    <link href="solver.css" type="text/css" rel="stylesheet">
  10. </head>
  11. <body>
  12. <p align="center" style="font-size: 150%">Solver for 2D nonlinear Fredholm fuzzy
  13. functional integral equations</p>
  14.  
  15. <form name="EvalForm" id="EvalCalc" action="" method="post" novalidate="novalidate" scrolling="yes">
  16.  
  17. <div id="Formulaes">
  18. <p>&nbsp;&nbsp;g<sub>-</sub>(s,t,r) = <input name="glfunc" value="" type="text" size=115></p>
  19. <p>&nbsp;&nbsp;g<sub>+</sub>(s,t,r) = <input name="gufunc" value="" type="text" size=115></p>
  20. <p>&nbsp;H(s,t,x,y) = <input name="Hfunc" value="" type="text" size=115></p>
  21. <p>&nbsp;&nbsp;&nbsp;&nbsp;G<sub>-</sub>(F,r) = <input name="Glfunc" value="" type="text" size=115></p>
  22. <p>&nbsp;&nbsp;&nbsp;&nbsp;G<sub>+</sub>(F,r) = <input name="Gufunc" value="" type="text" size=115></p>
  23. <p>f<sub>-</sub>(s,t,F,r) = <input name="flfunc" value="" type="text" size=115></p>
  24. <p>f<sub>+</sub>(s,t,F,r) = <input name="fufunc" value="" type="text" size=115></p>
  25. <p>&nbsp;F*<sub>-</sub>(s,t,r) = <input name="Flfunc" value="" type="text" size=115></p>
  26. <p>&nbsp;F*<sub>+</sub>(s,t,r) = <input name="Fufunc" value="" type="text" size=115></p>
  27. <p> a =<input name="avalue" value="" type="text" size=6>
  28.  b =<input name="bvalue" value="" type="text" size=6>
  29.  c =<input name="cvalue" value="" type="text" size=6>
  30.  d =<input name="dvalue" value="" type="text" size=6>&nbsp;
  31.  &#955; =<input name="lvalue" value="" type="text" size=6>  
  32.  &epsilon; =<input name="epsvalue" value="" type="text" size=6>
  33.  n =<input name="nvalue" value="" type="text" size=4>  
  34.  n' =<input name="npvalue" value="" type="text" size=4>
  35.  r =<input name="rvalue" value="" type="text" size=6>
  36. </p>
  37. <p> s<sub>0</sub> =<input name="s0value" value="" type="text" size=6>
  38.  t<sub>0</sub> =<input name="t0value" value="" type="text" size=6>
  39.  </p>
  40.  
  41. </div>
  42.  
  43. <p><span align='left'>&nbsp;&nbsp;<input name = "CalcButton" value="Calculate" type="button" title="Calculate" onclick="StartCalc();">&nbsp;&nbsp;&nbsp;<span id="ErrorLabel">
  44. </span>
  45. <p align='right'>
  46. <input type="checkbox" name="ResultsType" value="Squeeze">Squeeze results&nbsp;&nbsp;
  47. <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">&nbsp;&nbsp;&nbsp;
  48. </p>
  49.  
  50. <div  id="animated-result" class="animated fadeInLeft" align="center" style="display:none">
  51. <span id="ResultLabel1"></span><br>
  52. <span id="ResultLabel2"></span>
  53. <table id="ResultsErrors" class="ResultTable"></table><br>
  54. <table id="ResultsValues" class="ResultTable"></table><br>
  55. </div>
  56.  
  57. <div style='font-family: "Times New Roman", Times, serif;'>Note: use E instead of e, PI instead of &pi;, ^ for power, etc...</div>
  58.  
  59. </div>
  60.  
  61. <!-- will be enabled later with the actual article PDF
  62. <div><a href=
  63. "article.pdf" target="_blank"><img src="pdf-download-icon.png" alt="Read entire article in PDF" style="width:291px;height:92px;border:0;">
  64. </a>
  65. </div>
  66. -->
  67. </form>
  68.  
  69. <script src="lib/parser.js" type="text/javascript"></script>
  70. <!--
  71. <script src="lib/parallel.js"></script>
  72. -->
  73.  
  74. <script type="text/javascript">
  75. // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
  76. // Copyright (c)2015 Adam Savitzky, Parallel JS library, http://adambom.github.io/parallel.js/
  77. // -- parallel calculations will be added later for a bigger arrays and more steps support
  78. //
  79. // Copyright (c)2016 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, freeware, public domain
  80. // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg
  81. // published at http://enkov.com/solver2D
  82. //
  83. // Algorithm is based on the presentation at BMC-XII 5-10.09.2016, Minsk
  84.  
  85. var sFormElements = document.forms["EvalForm"].elements; // for accessing DOM elements of the form/page
  86. var Calculated = false; // flag for completion
  87. // predefined global forwards to be viewable outside a calculation routine
  88. var n; var np; // n x np matrices
  89. var a; var b; var c; var d; // intervals x/y
  90. var Fml; var Fmu; var Ftoml; var Ftomu; // iteration's arrays for trapezoid and optimal
  91. var Fl; var Fu; // exact values F* calculated by net, lower/upper
  92. var m; var mo; // current iteration classic/optimal
  93. var s; var so; var t; var to; // s, t arrays of points classic/optimal
  94. var lambda; // coefficient for correction
  95. var s0; var t0; // calculation point
  96. var F0ml; var F0mu; // F(s0,t0) values values at the calculation point
  97.  
  98. function Sample() // preloads sample values for fast evaluation of the algorithm
  99. {
  100. // our sample
  101.     sFormElements["glfunc"].value = '(3/4)*(2+r)*s*t-(1/8)*(2+r)*(2+r)*s*t';
  102.     sFormElements["gufunc"].value = '(3/4)*(4-r)*s*t-(1/8)*(4-r)*(4-r)*s*t';
  103.     sFormElements["Hfunc"].value = 's*x*t*y';
  104.     sFormElements["Glfunc"].value = 'F*F';
  105.     sFormElements["Gufunc"].value = 'F*F';
  106.     sFormElements["flfunc"].value = '(F/4)+(1/16)*(2+r)*(2+r)*s*t';
  107.     sFormElements["fufunc"].value = '(F/4)+(1/16)*(4-r)*(4-r)*s*t';
  108.     sFormElements["Flfunc"].value = '(2+r)*s*t';
  109.     sFormElements["Fufunc"].value = '(4-r)*s*t';
  110.     sFormElements["avalue"].value = '0';
  111.     sFormElements["bvalue"].value = '1';
  112.     sFormElements["cvalue"].value = '0';
  113.     sFormElements["dvalue"].value = '1';
  114.     sFormElements["lvalue"].value = '1';
  115.     sFormElements["epsvalue"].value = '1e-10';
  116.     sFormElements["nvalue"].value = '10';
  117.     sFormElements["npvalue"].value = '10';
  118.     sFormElements["rvalue"].value = '0.5';
  119.     sFormElements["s0value"].value = '0.5';
  120.     sFormElements["t0value"].value = '0.5';
  121. /* // sample 2 - sample 2 and 3 are removed from the form, leaving it for internal evaluation
  122.     sFormElements["glfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t';
  123.     sFormElements["gufunc"].value = '(4-r)*s*t-(1/16)*(r-4)*(r-4)*s*t';
  124.     sFormElements["Hfunc"].value = 's*x*t*y';
  125.     sFormElements["Glfunc"].value = 'F*F';
  126.     sFormElements["Gufunc"].value = 'F*F';
  127.     sFormElements["flfunc"].value = '0';
  128.     sFormElements["fufunc"].value = '0';
  129.     sFormElements["Flfunc"].value = '(2+r)*s*t';
  130.     sFormElements["Fufunc"].value = '(4-r)*s*t';
  131.     sFormElements["avalue"].value = '0';
  132.     sFormElements["bvalue"].value = '1';
  133.     sFormElements["cvalue"].value = '0';
  134.     sFormElements["dvalue"].value = '1';
  135.     sFormElements["lvalue"].value = '1';
  136.     sFormElements["epsvalue"].value = '1e-10';
  137.     sFormElements["nvalue"].value = '10';
  138.     sFormElements["npvalue"].value = '10';
  139.     sFormElements["rvalue"].value = '0.5';
  140.     sFormElements["s0value"].value = '0.5';
  141.     sFormElements["t0value"].value = '0.5';
  142.     // sample 3
  143.     sFormElements["glfunc"].value = 'r*E^(s+t)+8*(2-3*E^0.5+E)*r^0.5*s*t';
  144.     sFormElements["gufunc"].value = '(2-r)*E^(s+t)+8*(2-3*E^0.5+E)*(2-r)^0.5*s*t';
  145.     sFormElements["Hfunc"].value = 's*t*(x+y)';
  146.     sFormElements["Glfunc"].value = 'F^0.5';
  147.     sFormElements["Gufunc"].value = 'F^0.5';
  148.     sFormElements["flfunc"].value = '0';
  149.     sFormElements["fufunc"].value = '0';
  150.     sFormElements["Flfunc"].value = 'r*E^(s+t)';
  151.     sFormElements["Fufunc"].value = '(2-r)*E^(s+t)';
  152.     sFormElements["avalue"].value = '0';
  153.     sFormElements["bvalue"].value = '1';
  154.     sFormElements["cvalue"].value = '0';
  155.     sFormElements["dvalue"].value = '1';
  156.     sFormElements["lvalue"].value = '1';
  157.     sFormElements["epsvalue"].value = '1e-10';
  158.     sFormElements["nvalue"].value = '10';
  159.     sFormElements["npvalue"].value = '5';
  160.     sFormElements["rvalue"].value = '0.5';
  161.     sFormElements["s0value"].value = '0.5';
  162.     sFormElements["t0value"].value = '0.5';
  163. */
  164. // prepare for calculation - reset messages
  165.     document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
  166.     document.getElementById("ResultLabel1").innerHTML = '';
  167.     document.getElementById("ResultLabel2").innerHTML = '';
  168.     document.getElementById("ResultsErrors").innerHTML = '';
  169.     document.getElementById("ResultsValues").innerHTML = '';
  170. }
  171.  
  172. function myFixed(p1, p2){ // our formatting routine - input p1 - output formatted as toFixed
  173.                           // but if the number is .00 do not add .00
  174.     if (Math.trunc(p1)==p1)
  175.         { return p1; }
  176.     else
  177.         { return p1.toFixed(p2); }
  178. }
  179.  
  180. function StartCalc() // using setTimeout to refresh message before starting calculations
  181. {
  182.     document.getElementById("ErrorLabel").textContent = 'Calculating...';
  183.     document.getElementById('animated-result').style.display = 'none'; // hide result
  184.     window.setTimeout(Calc, 100);
  185. }
  186.  
  187. function Calc() // main calculation routine
  188. {try {
  189.  
  190.     Calculated = false; // flag - not yet calculated
  191.    
  192.     // Get the initial values from the user's input
  193.  
  194.     // input fields
  195.     // functions
  196.     var glx = sFormElements['glfunc'].value;
  197.     var gux = sFormElements['gufunc'].value;
  198.     var Hx  = sFormElements['Hfunc'].value;
  199.     var Glx = sFormElements['Glfunc'].value;
  200.     var Gux = sFormElements['Gufunc'].value;
  201.     var flx = sFormElements['flfunc'].value;
  202.     var fux = sFormElements['fufunc'].value;
  203.     var Flx = sFormElements['Flfunc'].value;
  204.     var Fux = sFormElements['Fufunc'].value;
  205.    
  206.     // validate for not empty
  207.     if (glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>-</sub> can not be empty!'; return; }
  208.     if (gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>+</sub> can not be empty!'; return; }
  209.     if (Hx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H can not be empty!'; return; }
  210.     if (Glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>-</sub> can not be empty!'; return; }
  211.     if (Gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>+</sub> can not be empty!'; return; }
  212.     if (flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function f<sub>-</sub> can not be empty!'; return; }
  213.     if (fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function f<sub>+</sub> can not be empty!'; return; }
  214.     if (Flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>-</sub> can not be empty!'; return; }
  215.     if (Fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>+</sub> can not be empty!'; return; }
  216.     // constants validate for not empty
  217.     if (sFormElements['avalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant a can not be empty!'; return; }
  218.     if (sFormElements['bvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant b can not be empty!'; return; }
  219.     if (sFormElements['cvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant c can not be empty!'; return; }
  220.     if (sFormElements['dvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant d can not be empty!'; return; }
  221.     if (sFormElements['lvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant &#955; can not be empty!'; return; }
  222.     if (sFormElements['epsvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant &epsilon; can not be empty!'; return; }
  223.     if (sFormElements['nvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n can not be empty!'; return; }
  224.     if (sFormElements['npvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n&#39; can not be empty!'; return; }
  225.     if (sFormElements['rvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant r can not be empty!'; return; }
  226.     if (sFormElements['s0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> can not be empty!'; return; }
  227.     if (sFormElements['t0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> can not be empty!'; return; }
  228.     // validate constants for correct number
  229.     a = (sFormElements['avalue'].value != '') ? parseFloat(sFormElements['avalue'].value) : 0.0;
  230.     b = (sFormElements['bvalue'].value != '') ? parseFloat(sFormElements['bvalue'].value) : 0.0;
  231.     c = (sFormElements['cvalue'].value != '') ? parseFloat(sFormElements['cvalue'].value) : 0.0;
  232.     d = (sFormElements['dvalue'].value != '') ? parseFloat(sFormElements['dvalue'].value) : 0.0;
  233.     lambda = (sFormElements['lvalue'].value != '') ? parseFloat(sFormElements['lvalue'].value) : 0.0;
  234.     var eps = (sFormElements['epsvalue'].value != '') ? parseFloat(sFormElements['epsvalue'].value) : 0.0;
  235.     n = (sFormElements['nvalue'].value != '') ? parseInt(sFormElements['nvalue'].value) : 0;
  236.     np = (sFormElements['npvalue'].value != '') ? parseInt(sFormElements['npvalue'].value) : 0;
  237.     var r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
  238.     s0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['s0value'].value) : 0.0;
  239.     t0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['t0value'].value) : 0.0;
  240.     // validity check - ranges or NaN
  241.     if (isNaN(a)) { document.getElementById("ErrorLabel").innerHTML = 'a value error!'; return; }
  242.     if (isNaN(b)) { document.getElementById("ErrorLabel").innerHTML = 'b value error!'; return; }
  243.     if (isNaN(c)) { document.getElementById("ErrorLabel").innerHTML = 'c value error!'; return; }
  244.     if (isNaN(d)) { document.getElementById("ErrorLabel").innerHTML = 'd value error!'; return; }
  245.     if (isNaN(lambda)) { document.getElementById("ErrorLabel").innerHTML = '&#955; value error!'; return; }
  246.     if (isNaN(eps)) { document.getElementById("ErrorLabel").innerHTML = '&epsilon; value error!'; return; }
  247.     if (isNaN(n)) { document.getElementById("ErrorLabel").innerHTML = 'n value error!'; return; }
  248.     if (isNaN(np)) { document.getElementById("ErrorLabel").innerHTML = 'n&#39; value error!'; return; } //
  249.     if (isNaN(r)) { document.getElementById("ErrorLabel").innerHTML = 'r value error!'; return; }
  250.     if ( a >= b) { document.getElementById("ErrorLabel").innerHTML = 'a is not less than b error!'; return; }
  251.     if ( c >= d) { document.getElementById("ErrorLabel").innerHTML = 'c is not less than d error!'; return; }
  252.     if (lambda == 0) { document.getElementById("ErrorLabel").innerHTML = '&#955; cannot be zero error!'; return; }
  253.     if ( eps <= 0) { document.getElementById("ErrorLabel").innerHTML = '&epsilon; must be greater than 0 error!'; return; }
  254.     if ( n <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n must be greater than 2 error!'; return; }
  255.     if ( np <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n&#39; must be greater than 2 error!'; return; }
  256.     if ( r < 0 || r > 1) { document.getElementById("ErrorLabel").innerHTML = 'r must be between 0 and 1 error!'; return; }
  257.     if (isNaN(s0)) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> value error!'; return; }
  258.     if (isNaN(t0)) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> value error!'; return; }
  259.     if ( s0 < a || s0 > b) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> must be between a and b error!'; return; }
  260.     if ( t0 < c || t0 > d) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> must be between c and d error!'; return; }   
  261.    
  262.     // flag for results output format - compact table first 1..3 and last values if checked
  263.     var SqueezeResults = sFormElements['ResultsType'].checked;
  264.          
  265.     // start calcualtions
  266.    
  267.     // Step 0 - set the variables and initial values
  268.  
  269.     var MaxIterations = 250; // 250 points at least with results
  270.  
  271.     var sigma = (b-a)/n; // step for points x-axis
  272.     var sigmaprim = (d-c)/np; // step for points y-axis
  273.     var D; // error (Distance between iterations and/or exact solution)
  274.    
  275.     // create arrays (matrices and vectors)
  276.  
  277.     Fl = new Array(n+1); // F*- exact array lower
  278.     for (var i = 0; i <= n; i++) { Fl[i] = new Array(np+1); }  
  279.     Fu = new Array(n+1); // F*+ exact array upper
  280.     for (var i = 0; i <= n; i++) { Fu[i] = new Array(np+1); }  
  281.    
  282.     Fml = new Array(MaxIterations+1); // Fml[0..iter][0..n][0..np] - lower trapezoidal array
  283.     for (var i = 0; i <= MaxIterations; i++) {
  284.         Fml[i] = new Array(n+1);
  285.         for (var j = 0; j <= n; j++) { Fml[i][j] = new Array(np+1); }  
  286.     }
  287.  
  288.     Fmu = new Array(MaxIterations+1); // Fmu[0..iter][0..n][0..np] - upper trapezoidal array
  289.     for (var i = 0; i <= MaxIterations; i++) {
  290.         Fmu[i] = new Array(n+1);
  291.         for (var j = 0; j <= n; j++) { Fmu[i][j] = new Array(np+1); }
  292.     }  
  293.    
  294.     Ftoml = new Array(MaxIterations+1); // Ftoml[0..iter][0..n][0..np] - lower optimal middle point array
  295.     for (var i = 0; i <= MaxIterations; i++) {
  296.         Ftoml[i] = new Array(n+1);
  297.         for (var j = 0; j <= n; j++) { Ftoml[i][j] = new Array(np+1); }
  298.     }
  299.  
  300.     Ftomu = new Array(MaxIterations+1); // Ftomu[0..iter][0..n][0..np] - upper optimal middle point array
  301.     for (var i = 0; i <= MaxIterations; i++) {
  302.         Ftomu[i] = new Array(n+1);
  303.         for (var j = 0; j <= n; j++) { Ftomu[i][j] = new Array(np+1); }
  304.     }  
  305.    
  306.     F0ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower trapezioid at point (s0,t0)
  307.     F0mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper trapezioid at point (s0,t0)
  308.     F0oml = new Array(MaxIterations+1); // Fo-(s0,t0) - lower optimal at point (s0,t0)
  309.     F0omu = new Array(MaxIterations+1); // Fo+(s0,t0) - upper optimal at point (s0,t0)
  310.     var e0l; var e0u; // error between iteration and exact solution at point (s0,t0)
  311.    
  312.     var el = new Array(n+1); // err-  approx - exact for trapez
  313.     for (var i = 0; i <= n; i++) { el[i] = new Array(np+1); }
  314.     var eu = new Array(n+1); // err+  approx - exact for trapez
  315.     for (var i = 0; i <= n; i++) { eu[i] = new Array(np+1); }
  316.     var eol = new Array(n+1); // err-  approx - exact for optimal
  317.     for (var i = 0; i <= n; i++) { eol[i] = new Array(np+1); }
  318.     var eou = new Array(n+1); // err+  approx - exact for optimal
  319.     for (var i = 0; i <= n; i++) { eou[i] = new Array(np+1); }
  320.    
  321.     // arrays for vaues of the points coordinates - network points
  322.     s = new Array(n+1); // s(i)
  323.     t = new Array(np+1); // t(j)
  324.     so = new Array(n+1); // so(i)
  325.     to = new Array(np+1); // to(j)
  326.    
  327.     // calculate values of arrays of network points coordinates
  328.     for (var i = 0; i <= n; i++) { s[i] = a + i*sigma; }
  329.     for (var i = 0; i <= np; i++) { t[i] = c + i*sigmaprim; }
  330.     for (var i = 1; i <= n; i++) { so[i] = a + (2*i-1)*(sigma/2); }
  331.     for (var i = 1; i <= np; i++) { to[i] = c + (2*i-1)*(sigmaprim/2); }
  332.    
  333.     m = 0; // keep m < MaxIterations - m is trapezoidal current step number
  334.     mo = 0; // keep mo < MaxIterations - mo is optimal current step number
  335.    
  336.     // parse the functions once, outside of the loops
  337.     var Pglx = Parser.parse(glx);
  338.     var Pgux = Parser.parse(gux);
  339.     var PHx = Parser.parse(Hx);
  340.     var PGlx = Parser.parse(Glx);
  341.     var PGux = Parser.parse(Gux);
  342.     var Pflx = Parser.parse(flx);
  343.     var Pfux = Parser.parse(fux);
  344.     var PFlx = Parser.parse(Flx);
  345.     var PFux = Parser.parse(Fux);
  346.  
  347.     // Step 1 - Fm Fom m=0 initial values for network points - preliminary step
  348.     for (var i = 0; i <= n; i++) {  // trapezoid
  349.         for (var j = 0; j <= np; j++) {
  350.             Fml[0][i][j] = Pglx.evaluate({s: s[i], t: t[j], r: r});
  351.             Fmu[0][i][j] = Pgux.evaluate({s: s[i], t: t[j], r: r});
  352.         }
  353.     }
  354.     // initial values at (s0,t0) trap/opt
  355.     F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
  356.     F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
  357.     F0oml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
  358.     F0omu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
  359.    
  360.     for (var i=1; i <= n; i++) { // optimal (middle finger) values for network points
  361.         for (var j = 1; j <= np; j++) {
  362.             Ftoml[0][i][j] = Pglx.evaluate({s: so[i], t: to[j], r: r});
  363.             Ftomu[0][i][j] = Pgux.evaluate({s: so[i], t: to[j], r: r});
  364.         }
  365.     }
  366.  
  367.     // Step 2 (the first iterative step)
  368.  
  369.     // trapezoid loop preliminary step
  370.     m = 1;
  371.     // loop through all points of the n x np matrix - see the formulaes in the article
  372.     for (var i = 0; i <= n; i++) {
  373.         for (var j = 0; j <= np; j++) {
  374.             var sl = 0;  var su = 0;
  375.             for (var k = 0; k <= n-1; k++) {
  376.                 for (var p = 0; p <= np-1; p++) {
  377.                     sl = sl +
  378.                         PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  379.                         *
  380.                         PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  381.                     +
  382.                         PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  383.                         *
  384.                         PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  385.                     +  
  386.                         PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  387.                         *
  388.                         PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  389.                     +
  390.                         PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  391.                         *
  392.                         PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  393.                     su = su +
  394.                         PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  395.                         *
  396.                         PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  397.                     +
  398.                         PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  399.                         *
  400.                         PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  401.                     +  
  402.                         PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  403.                         *
  404.                         PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  405.                     +
  406.                         PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  407.                         *
  408.                         PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  409.                 }
  410.             }
  411.             Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: s[i], t: t[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*sl*lambda;
  412.             Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: s[i], t: t[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*su*lambda;
  413.             // check for NaN - possible errors (divide by zero or over/under-flows)
  414.             if (isNaN(Fml[m][i][j])) {
  415.                 document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  416.                 return;
  417.             }
  418.             if (isNaN(Fmu[m][i][j])) {
  419.                 document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  420.                 return;
  421.             }      
  422.         }
  423.     }
  424.     // F0[1] // at point (s0,t0)
  425.     var s0l = 0;  var s0u = 0;
  426.     for (var k = 0; k <= n-1; k++) {
  427.         for (var p = 0; p <= np-1; p++) {
  428.             s0l = s0l +
  429.                 PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  430.                 *
  431.                 PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  432.             +
  433.                 PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  434.                 *
  435.                 PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  436.             +  
  437.                 PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  438.                 *
  439.                 PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  440.             +
  441.                 PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  442.                 *
  443.                 PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  444.             s0u = s0u +
  445.                 PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  446.                 *
  447.                 PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  448.             +
  449.                 PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  450.                 *
  451.                 PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  452.             +  
  453.                 PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  454.                 *
  455.                 PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  456.             +
  457.                 PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  458.                 *
  459.                 PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  460.         }
  461.     }
  462.     F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim/4)*s0l*lambda;
  463.     F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim/4)*s0u*lambda;
  464.     // check for NaN - possible errors (divide by zero or over/under-flows)
  465.     if (isNaN(F0ml[m])) {
  466.         document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  467.         return;
  468.     }
  469.     if (isNaN(F0mu[m])) {
  470.         document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  471.         return;
  472.     }
  473.    
  474.     // optimal formula loop preliminary step
  475.     mo = 1;
  476.     // loop through all points of the n x np matrix - see the formulaes in the article
  477.     for (var i = 1; i <= n; i++) {
  478.         for (var j = 1; j <= np; j++) {
  479.             var stl = 0;  var stu = 0;
  480.             for (var k = 1; k <= n; k++) {
  481.                 for (var p = 1; p <= np; p++) {
  482.                     stl = stl +
  483.                         PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
  484.                         *
  485.                         PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
  486.                     stu = stu +
  487.                         PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
  488.                         *
  489.                         PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
  490.                 }
  491.             }
  492.             Ftoml[mo][i][j] = Ftoml[0][i][j] + Pflx.evaluate({s: so[i], t: to[j], F: Ftoml[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
  493.             Ftomu[mo][i][j] = Ftomu[0][i][j] + Pfux.evaluate({s: so[i], t: to[j], F: Ftomu[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
  494.             // check for NaN - possible errors (divide by zero or over/under-flows)
  495.             if (isNaN(Ftoml[mo][i][j])) {
  496.                 document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at point ("+i+","+j+").";
  497.                 return;
  498.             }
  499.             if (isNaN(Ftomu[mo][i][j])) {
  500.                 document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at point ("+i+","+j+").";
  501.                 return;
  502.             }      
  503.         }
  504.     }
  505.     // Ft0[1] // at point (s0,t0)
  506.     var st0l = 0;  var st0u = 0;
  507.     for (var k = 1; k <= n; k++) {
  508.         for (var p = 1; p <= np; p++) {
  509.             st0l = st0l +
  510.                 PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
  511.                 *
  512.                 PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
  513.             st0u = st0u +
  514.                 PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
  515.                 *
  516.                 PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
  517.         }
  518.     }
  519.     F0oml[mo] = F0oml[0] + Pflx.evaluate({s: s0, t: t0, F: F0oml[mo-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
  520.     F0omu[mo] = F0omu[0] + Pfux.evaluate({s: s0, t: t0, F: F0omu[mo-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
  521.     // check for NaN - possible errors (divide by zero or over/under-flows)
  522.     if (isNaN(F0oml[mo])) {
  523.         document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at (s<sub>0</sub>, t<sub>0</sub>).";
  524.         return;
  525.     }
  526.     if (isNaN(F0omu[mo])) {
  527.         document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at (s<sub>0</sub>, t<sub>0</sub>).";
  528.         return;
  529.     }
  530.        
  531.     // Steps 3-4 (the generic iterative step)
  532.    
  533.     // trapezoid - loop through all points of the n x np matrix - see the formulaes in the article
  534.     do {
  535.         m = m+1; // next iteration for trapezoidal
  536.         if ( m > MaxIterations ) { // check for posible endless loop
  537.             document.getElementById("ErrorLabel").innerHTML = "Iterations trapezoid exceeded "+MaxIterations+"! Stopped!";
  538.             alert("Iterations trapezoid exceeded "+MaxIterations+"! Stopped!");
  539.             return;
  540.         }
  541.         // loop through all points of the n x np matrix - see the formulaes in the article
  542.         for (var i = 0; i <= n; i++) {
  543.             for (var j = 0; j <= np; j++) {
  544.                 var sl = 0;  var su = 0;
  545.                 for (var k = 0; k <= n-1; k++) {
  546.                     for (var p = 0; p <= np-1; p++) {
  547.                         sl = sl +
  548.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  549.                             *
  550.                             PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  551.                         +
  552.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  553.                             *
  554.                             PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  555.                         +  
  556.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  557.                             *
  558.                             PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  559.                         +
  560.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  561.                             *
  562.                             PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  563.                         su = su +
  564.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  565.                             *
  566.                             PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  567.                         +
  568.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  569.                             *
  570.                             PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  571.                         +  
  572.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  573.                             *
  574.                             PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  575.                         +
  576.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  577.                             *
  578.                             PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  579.                     }
  580.                 }
  581.                 Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: s[i], t: t[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*sl*lambda;
  582.                 Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: s[i], t: t[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*su*lambda;
  583.                 if (isNaN(Fml[m][i][j])) {
  584.                     document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  585.                     return;
  586.                 }
  587.                 if (isNaN(Fmu[m][i][j])) {
  588.                     document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  589.                     return;
  590.                 }      
  591.             }
  592.         }
  593.         // point(s0,t0)
  594.         s0l=0; s0u=0;
  595.         // see the formulaes in the article
  596.         for (var k = 0; k <= n-1; k++) {
  597.             for (var p = 0; p <= np-1; p++) {
  598.                 s0l = s0l +
  599.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  600.                     *
  601.                     PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  602.                 +
  603.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  604.                     *
  605.                     PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  606.                 +  
  607.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  608.                     *
  609.                     PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  610.                 +
  611.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  612.                     *
  613.                     PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  614.                 s0u = s0u +
  615.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  616.                     *
  617.                     PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  618.                 +
  619.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  620.                     *
  621.                     PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  622.                 +  
  623.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  624.                     *
  625.                     PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  626.                 +
  627.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  628.                     *
  629.                     PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  630.             }
  631.         }
  632.         F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim/4)*s0l*lambda;
  633.         F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim/4)*s0u*lambda;    
  634.         if (isNaN(F0ml[m])) {
  635.             document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  636.             return;
  637.         }
  638.         if (isNaN(F0mu[m])) {
  639.             document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  640.             return;
  641.         }
  642.         // calculate D for (s0,t0) trapezoidal
  643.         D = Math.max(Math.abs(F0ml[m] - F0ml[m-1]), Math.abs(F0mu[m] - F0mu[m-1]));
  644.     } while ( (D >= eps) && (m < MaxIterations) ); // stop if epsilon is reached or iterations exceeded
  645.     // possible also check m is reasonable to avoid endless looping if no convergence
  646.     if ( m >= MaxIterations )
  647.     {
  648.         document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!";
  649.         alert("Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!");
  650.         return;
  651.     }
  652.  
  653.     // optimal - step3-4 main iteration
  654.    
  655.     do {
  656.         mo = mo+1; // next iteration for optimal formula
  657.         if ( mo > MaxIterations ) {  // check for posible endless loop
  658.             document.getElementById("ErrorLabel").innerHTML = "Iterations optimal exceeded "+MaxIterations+"! Stopped!";
  659.             alert("Iterations optimal exceeded "+MaxIterations+"! Stopped!");
  660.             return;
  661.         }
  662.         // loop through all points of the n x np matrix - see the formulaes in the article
  663.         for (var i = 1; i <= n; i++) {
  664.             for (var j = 1; j <= np; j++) {
  665.                 var stl = 0;  var stu = 0;
  666.                 for (var k = 1; k <= n; k++) {
  667.                     for (var p = 1; p <= np; p++) {
  668.                         stl = stl +
  669.                             PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
  670.                             *
  671.                             PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
  672.                         stu = stu +
  673.                             PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
  674.                             *
  675.                             PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
  676.                     }
  677.                 }
  678.                 Ftoml[mo][i][j] = Ftoml[0][i][j] + Pflx.evaluate({s: so[i], t: to[j], F: Ftoml[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
  679.                 Ftomu[mo][i][j] = Ftomu[0][i][j] + Pfux.evaluate({s: so[i], t: to[j], F: Ftomu[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
  680.                 // check for NaN - possible errors (divide by zero or over/under-flows)
  681.                 if (isNaN(Ftoml[mo][i][j])) {
  682.                     document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at point ("+i+","+j+").";
  683.                     return;
  684.                 }
  685.                 if (isNaN(Ftomu[mo][i][j])) {
  686.                     document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at point ("+i+","+j+").";
  687.                     return;
  688.                 }      
  689.             }
  690.         }
  691.         // Ft0[1]
  692.         var st0l = 0;  var st0u = 0;
  693.         for (var k = 1; k <= n; k++) {
  694.             for (var p = 1; p <= np; p++) {
  695.                 st0l = st0l +
  696.                     PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
  697.                     *
  698.                     PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
  699.                 st0u = st0u +
  700.                     PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
  701.                     *
  702.                     PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
  703.             }
  704.         }
  705.         F0oml[mo] = F0oml[0] + Pflx.evaluate({s: s0, t: t0, F: F0oml[mo-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
  706.         F0omu[mo] = F0omu[0] + Pfux.evaluate({s: s0, t: t0, F: F0omu[mo-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
  707.         // check for NaN - possible errors (divide by zero or over/under-flows)
  708.         if (isNaN(F0oml[mo])) {
  709.             document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at (s<sub>0</sub>, ts<sub>0</sub>).";
  710.             return;
  711.         }
  712.         if (isNaN(F0omu[mo])) {
  713.             document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at (s<sub>0</sub>, ts<sub>0</sub>).";
  714.             return;
  715.         }
  716.         // calculate D for (s0,t0) optimal
  717.         D = Math.max(Math.abs(F0oml[mo] - F0oml[mo-1]), Math.abs(F0omu[mo] - F0omu[mo-1]));
  718.     } while ( (D >= eps) && (mo < MaxIterations) ); // stop if epsilon is reached or iterations exceeded
  719.     // possible also check mo is reasonable to avoid endless looping if no convergence
  720.     if ( mo >= MaxIterations ) // error
  721.     {
  722.         document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations) in optimal!";
  723.         alert("Endless loop optimal detected (>"+MaxIterations+" iterations) in optimal!");
  724.         return;
  725.     }
  726.  
  727.     // calculate lower-upper exact value at point (s0,t0)
  728.     var F0l = PFlx.evaluate({s: s0, t: t0, r: r});
  729.     var F0u = PFux.evaluate({s: s0, t: t0, r: r});
  730.    
  731.     Calculated = m > 1; // flag for completion
  732.    
  733.     document.getElementById("ErrorLabel").textContent = 'Done calculations, iteration '+m+'...';
  734.  
  735.     // draw a tables with results
  736.    
  737.     var mx = Math.max(m, mo); // take a bigger count of iterations for table size (rows)
  738.  
  739.     // errors table string (innerHTML)
  740.     var errors ='<caption>Errors at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>ec<sub>m-</sub></th><th>ec<sub>m+</sub></th><th>eo<sub>m-</sub></th><th>eo<sub>m+</sub></th></tr>';
  741.     if (SqueezeResults)  
  742.     {   // compact table 1..3 and last
  743.         for (var i = 1; i <= 3; i++) {
  744.             errors+='<tr><td>'+i+'</td>';
  745.             if ( i <= m )
  746.             {errors+='<td>'+Math.abs(F0l-F0ml[i])+'</td><td>'+Math.abs(F0u-F0mu[i])+'</td>';}
  747.             else {errors+='<td>-</td><td>-</td>'}
  748.             if ( i <= mo )
  749.             {errors+='<td>'+Math.abs(F0l-F0oml[i])+'</td><td>'+Math.abs(F0u-F0omu[i])+'</td>';}
  750.             else {errors+='<td>-</td><td>-</td>'}
  751.             errors+='</tr>';
  752.         }
  753.         errors+='<tr><td>...</td><td>...</td><td>...</td><td>....</td><td>...</td></tr>';
  754.     }
  755.     else
  756.     {   // full table
  757.         for (var i = 1; i <= mx; i++) {
  758.             errors+='<tr><td>'+i+'</td>';
  759.             if ( i <= m )
  760.             {errors+='<td>'+Math.abs(F0l-F0ml[i])+'</td><td>'+Math.abs(F0u-F0mu[i])+'</td>';}
  761.             else {errors+='<td>-</td><td>-</td>'}
  762.             if ( i <= mo )
  763.             {errors+='<td>'+Math.abs(F0l-F0oml[i])+'</td><td>'+Math.abs(F0u-F0omu[i])+'</td>';}
  764.             else {errors+='<td>-</td><td>-</td>'}
  765.             errors+='</tr>';
  766.         }
  767.     }
  768.     errors +='<tr><td colspan="5" align="center">Errors comparable optimal to classic </td></tr><tr><th></th><th>eo<sub>m-</sub></th><th>ec<sub>m-</sub></th><th>eo<sub>m+</sub></th><th>ec<sub>m+</sub></th></tr>';
  769.     errors+='<tr><td>Last</td>';
  770.     errors+='<td>'+Math.abs(F0l-F0oml[mo])+'</td><td>'+Math.abs(F0l-F0ml[m])+'</td>';
  771.     errors+='<td>'+Math.abs(F0u-F0omu[mo])+'</td><td>'+Math.abs(F0u-F0mu[m])+'</td>';
  772.     errors+='</tr>';
  773.    
  774.     // values table string (innerHTML)
  775.     var values ='<caption>Values at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>Fc<sub>m-</sub></th><th>Fc<sub>m+</sub></th><th>Fo<sub>m-</sub></th><th>Fo<sub>m+</sub></th></tr>';
  776.     if (SqueezeResults)
  777.     {   // compact table 1..3 and last
  778.         for (var i = 1; i <= 3; i++) {
  779.             values+='<tr><td>'+i+'</td>';
  780.             if ( i <= m )
  781.             {values+='<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';}
  782.             else {values+='<td>-</td><td>-</td>'}
  783.             if ( i <= mo )
  784.             {values+='<td>'+F0oml[i]+'</td><td>'+F0omu[i]+'</td>';}
  785.             else {values+='<td>-</td><td>-</td>'}
  786.             values+='</tr>';
  787.         }
  788.         values+='<tr><td>...</td><td>...</td><td>...</td><td>....</td><td>...</td></tr>';
  789.         values +='<tr><td colspan="5" align="center">Final values (last iteration) </td></tr>';
  790.         values+='<tr><td><small>Last</small></td>';
  791.         values+='<td>'+F0ml[m]+'</td><td>'+F0mu[m]+'</td>';
  792.         values+='<td>'+F0oml[mo]+'</td><td>'+F0omu[mo]+'</td>';
  793.         values+='</tr>';
  794.     }
  795.     else
  796.     {   // full table
  797.         for (var i = 1; i <= mx; i++) {
  798.             values+='<tr><td>'+i+'</td>';
  799.             if ( i <= m )
  800.             {values+='<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';}
  801.             else {values+='<td>-</td><td>-</td>'}
  802.             if ( i <= mo )
  803.             {values+='<td>'+F0oml[i]+'</td><td>'+F0omu[i]+'</td>';}
  804.             else {values+='<td>-</td><td>-</td>'}
  805.             values+='</tr>';
  806.         }
  807.     }
  808.  
  809.     // show the info and tables
  810.     document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for n='+n+', n&#39;='+np+', r='+r.toFixed(2)+' (iterations: '+m+' classical, '+mo+' optimal)</center>';
  811.     document.getElementById("ResultsErrors").innerHTML = errors;
  812.     document.getElementById("ResultsValues").innerHTML = values;
  813.     //
  814.     document.getElementById("ErrorLabel").textContent = 'Done calculation...';
  815.     document.getElementById("ResultLabel2").innerHTML = '';
  816.     document.getElementById('animated-result').style.display = ''; // show the result
  817.    
  818. } // catch the error and show the eror message (debug information)
  819. catch(err) {
  820.     var vDebug = "";
  821.     var el = err.lineNumber;
  822.     for (var prop in err)
  823.     {  
  824.        vDebug += "property: "+ prop+ " ["+ err[prop]+ "], ";
  825.     }
  826.     vDebug += "[" + err.toString() + "]";
  827.     if ( !(el === undefined) ) { vDebug += ", on line " + el; }
  828.     document.getElementById('animated-result').style.display = 'none'; // hide result
  829.     document.getElementById("ErrorLabel").textContent = 'Error: ' + err.message +
  830.       ' ' + vDebug;
  831.     }  
  832. }
  833. </script>
  834. </p>
  835. </body>
  836. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement