Advertisement
enkov

Nonlinear Hammerstein fuzzy functional integral equations

May 28th, 2017
626
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 solver example</title>
  5.     <meta name="Description" content="Web-based nonlinear Hammerstein fuzzy functional integral equations solver" />
  6.     <meta name="Keywords" content="fuzzy integral equation, Hammerstein, solver, numerical method, approximate method" />
  7.     <meta name="Author" content="Svetoslav Enkov. Atanaska Georgieva, Renato Nikolla" />
  8.     <meta charset="UTF-8" />
  9. <head>
  10.    <link href="solver.css" type="text/css" rel="stylesheet">
  11. </head>
  12. <body>
  13. <p align="center" style="font-size: 150%">Solver for nonlinear Hammerstein fuzzy
  14. functional integral equations</p>
  15.  
  16. <form name="EvalForm" id="EvalCalc" action="" method="post" novalidate="novalidate" scrolling="yes">
  17.  
  18. <div id="Formulaes">
  19. <p>&nbsp;&nbsp;g<sub>-</sub>(t,r) = <input name="glfunc" value="" type="text" size=115></p>
  20. <p>&nbsp;&nbsp;g<sub>+</sub>(t,r) = <input name="gufunc" value="" type="text" size=115></p>
  21. <p>&nbsp;&nbsp;&nbsp;k(t,s) = <input name="kfunc" value="" type="text" size=115></p>
  22. <p>H<sub>-</sub>(t,x,r) = <input name="Hlfunc" value="" type="text" size=115></p>
  23. <p>H<sub>+</sub>(t,x,r) = <input name="Hufunc" value="" type="text" size=115></p>
  24. <p>f<sub>-</sub>(t,x,r) = <input name="flfunc" value="" type="text" size=115></p>
  25. <p>f<sub>+</sub>(t,x,r) = <input name="fufunc" value="" type="text" size=115></p>
  26. <p>&nbsp;x*<sub>-</sub>(t,r) = <input name="xlfunc" value="" type="text" size=115></p>
  27. <p>&nbsp;x*<sub>+</sub>(t,r) = <input name="xufunc" value="" type="text" size=115></p>
  28. <p>
  29. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  30.  a = <input name="avalue" value="" type="text" size=6> &nbsp;
  31.  b = <input name="bvalue" value="" type="text" size=6> &nbsp;&nbsp;
  32.  &epsilon;' = <input name="epsvalue" value="" type="text" size=10> &nbsp;
  33.  n = <input name="nvalue" value="" type="text" size=4> &nbsp;
  34.  r = <input name="rvalue" value="" type="text" size=6> &nbsp;
  35. </p>
  36. </div>
  37.  
  38. <p><span align='left'>&nbsp;&nbsp;<input name = "CalcButton" value="Calculate" type="button" title="Evaluates the expression!" onclick="StartCalc();">&nbsp;&nbsp;&nbsp;<span id="ErrorLabel">
  39. </span>
  40. <p align='right'>
  41. <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">&nbsp;&nbsp;&nbsp;
  42. <input name = "PlotButton" value="Plot results" type="button" title="Plot of the results!" onclick="PlotGraph();">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
  43.  
  44. <div  id="animated-result" class="animated fadeInLeft" align="center" style="display:none">
  45. <span id="ResultLabel1"></span><br>
  46. <span id="ResultLabel2"></span>
  47. <table id="ResultsErrors" class="ResultTable"></table><br>
  48. <table id="ResultsValues" class="ResultTable"></table><br>
  49. </div>
  50.  
  51. <div style='font-family: "Times New Roman", Times, serif;'>Note: use E instead of e, PI instead of &pi;, ^ for power, etc...</div>
  52.  
  53. <div align="center" class="center-block">
  54. <br><span id="resultsplot"></span>
  55. <br><span id="plotlegend" style="display:none; font-size: 75%">
  56. Colors: Red - upper optimal, Blue - lower optimal, Black - upper exact, Brown - lower exact, Magenta - upper trapezoid, Pink - lower trapezoid.<br>Use zoom with mouse wheel to see in detail.
  57. </span>
  58. </div>
  59.  
  60. <div><a href=
  61. "Numerical%20Solution%20of%20Nonlinear%20Hammerstein%20Fuzzy%20Functional%20Integral%20Equations%20-%20Enkov%20Georgieva%20Nikolla.pdf" target="_blank"><img src="pdf-download-icon.png" alt="Read entire article in PDF" style="width:291px;height:92px;border:0;">
  62. </a>
  63. </div>
  64.  
  65. </form>
  66.  
  67. <script src="lib/parser.js" type="text/javascript"></script>
  68. <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>
  69. <script src="https://wzrd.in/standalone/function-plot@1.17.0"></script>
  70.  
  71. <script type="text/javascript">
  72. // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
  73. //  - please use old version, not new ECMAScript 6 version
  74. // Copyright (c)2016 Maurizio Poppe, Function Plot plotting library, http://maurizzzio.github.io/function-plot/ 1.17.0
  75. //
  76. // Copyright (c)2016 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, Renato Nikolla, freeware, public domain
  77. // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg
  78. // published at http://enkov.com/solver
  79. // https://pastebin.com/aTR7rYZ8
  80. //
  81. // Algorithm is based on the presentation at APPLICATIONS OF MATHEMATICS IN ENGINEERING AND ECONOMICS (AMEE’16): Proceedings of the 42nd International Conference on Applications of Mathematics in Engineering and Economics
  82. // article "Numerical solution of nonlinear Hammerstein fuzzy functional integral equations", DOI 10.1063/1.4968452
  83.  
  84. var d3 = window.d3;
  85. var functionPlot = window.functionPlot;
  86. var sFormElements = document.forms["EvalForm"].elements;
  87. var Calculated = false;
  88. // forward definitions (global) to be seen in the plotting function too
  89. var n; var m; var mo; var t; var to;
  90. var xml; var xmu; var xoml; var xomu; var xl; var xu;
  91. var a; var b;
  92.  
  93. function PlotGraph()
  94. {
  95.     if (!Calculated) {
  96.         alert("You haven't calculated nothing yet!");
  97.         return;
  98.     }
  99.     document.getElementById('plotlegend').style.display = ''; // show the legend
  100.     var pointsTL = [];
  101.     var pointsEL = [];
  102.     var pointsOL = [];
  103.     var pointsTU = [];
  104.     var pointsEU = [];
  105.     var pointsOU = [];
  106.     var minY = xml[m][0];
  107.     var maxY = xml[m][0];
  108.     for (var i=0; i<=n; i++) {
  109.         pointsTL.push([t[i],xml[m][i]]); // trapezoid
  110.         minY = Math.min(minY, xml[m][i]);
  111.         maxY = Math.max(maxY, xml[m][i]);      
  112.         pointsEL.push([t[i],xl[i]]); // exact
  113.         minY = Math.min(minY, xl[i]);
  114.         maxY = Math.max(maxY, xl[i]);      
  115.         if (i > 0) {
  116.             pointsOL.push([t[i],xoml[mo][i]]);   // optimal
  117.             minY = Math.min(minY, xoml[mo][i]);
  118.             maxY = Math.max(maxY, xoml[mo][i]);
  119.         }
  120.         pointsTU.push([t[i],xmu[m][i]]); // trapezoid
  121.         minY = Math.min(minY, xmu[m][i]);
  122.         maxY = Math.max(maxY, xmu[m][i]);      
  123.         pointsEU.push([t[i],xu[i]]); // exact
  124.         minY = Math.min(minY, xu[i]);
  125.         maxY = Math.max(maxY, xu[i]);      
  126.         if (i > 0) {
  127.             pointsOU.push([t[i],xomu[mo][i]]);  // optimal
  128.             minY = Math.min(minY, xomu[mo][i]);
  129.             maxY = Math.max(maxY, xomu[mo][i]);
  130.         }
  131.     }
  132.     // plot the results
  133.     functionPlot({
  134.         title: 'Graphics (drag and zoom with mouse)',
  135.         target: '#resultsplot',
  136.           xAxis: {
  137.             domain: [a-Math.abs(b-a)*0.1, b+Math.abs(b-a)*0.1]
  138.         },
  139.           yAxis: {
  140.             domain: [minY-Math.abs(maxY-minY)*0.1, maxY+Math.abs(maxY-minY)*0.1]
  141.         },
  142.         data: [{
  143.             points: pointsEU,
  144.             fnType: 'points',
  145.             graphType: 'polyline',
  146.             color: 'black'
  147.         }, {
  148.             points: pointsTU,
  149.             fnType: 'points',
  150.             graphType: 'polyline',
  151.             color: 'magenta'
  152.         }, {
  153.             points: pointsOU,
  154.             fnType: 'points',
  155.             graphType: 'polyline',
  156.             color: 'red'
  157.         },{
  158.             points: pointsEL,
  159.             fnType: 'points',
  160.             graphType: 'polyline',
  161.             color: 'brown'
  162.         }, {
  163.             points: pointsTL,
  164.             fnType: 'points',
  165.             graphType: 'polyline',
  166.             color: 'pink'
  167.         }, {
  168.             points: pointsOL,
  169.             fnType: 'points',
  170.             graphType: 'polyline',
  171.             color: 'blue'
  172.         }]
  173.     });
  174. }
  175.  
  176. function Sample()
  177. {   sFormElements["glfunc"].value = '-t/12+(3*t/54)*(1-r)-(1-r)/8';
  178.     sFormElements["gufunc"].value = '-t/12-(3*t/54)*(1-r)+(1-r)/8';
  179.     sFormElements["kfunc"].value = 't*s/3';
  180.     sFormElements["Hlfunc"].value = 'x*x';
  181.     sFormElements["Hufunc"].value = 'x*x';
  182.     sFormElements["flfunc"].value = 'x/4-(t/216)*(1-r)*(1-r)-(t/54)*(1-r)+3*t/4';
  183.     sFormElements["fufunc"].value = 'x/4-(t/216)*(1-r)*(1-r)+(t/54)*(1-r)+3*t/4';
  184.     sFormElements["xlfunc"].value = 't-(1-r)/6';
  185.     sFormElements["xufunc"].value = 't+(1-r)/6';
  186.     sFormElements["avalue"].value = '0';
  187.     sFormElements["bvalue"].value = '1';
  188.     sFormElements["epsvalue"].value = '1e-15';
  189.     sFormElements["nvalue"].value = '10';
  190.     sFormElements["rvalue"].value = '0.5';
  191.     document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
  192.     document.getElementById("ResultLabel1").innerHTML = '';
  193.     document.getElementById("ResultTable").innerHTML = '';
  194. }
  195.  
  196. function myFixed(p1, p2){
  197.     if (Math.trunc(p1)==p1)
  198.         { return p1; }
  199.     else
  200.         { return p1.toFixed(p2); }
  201. }
  202.  
  203. function StartCalc()
  204. {
  205.     document.getElementById("ErrorLabel").textContent = 'Calculating...';
  206.     document.getElementById('animated-result').style.display = 'none'; // hide result
  207.     window.setTimeout(Calc, 100);
  208. }
  209.  
  210. function Calc()
  211. {try {
  212.  
  213.     // Get the initial values from the user's input
  214.    
  215.     document.getElementById("ErrorLabel").textContent = ''; // clear error
  216.     document.getElementById('animated-result').style.display = 'none'; // hide result
  217.     Calculated = false;
  218.  
  219.     var glx = sFormElements['glfunc'].value;
  220.     var gux = sFormElements['gufunc'].value;
  221.     var kx  = sFormElements['kfunc'].value;
  222.     var Hlx = sFormElements['Hlfunc'].value;
  223.     var Hux = sFormElements['Hufunc'].value;
  224.     var flx = sFormElements['flfunc'].value;
  225.     var fux = sFormElements['fufunc'].value;
  226.     var xlx = sFormElements['xlfunc'].value;
  227.     var xux = sFormElements['xufunc'].value;
  228.    
  229.     if (glx == '') { document.getElementById("ErrorLabel").textContent = 'Function g- can not be empty!'; return; }
  230.     if (gux == '') { document.getElementById("ErrorLabel").textContent = 'Function g+ can not be empty!'; return; }
  231.     if (kx == '') { document.getElementById("ErrorLabel").textContent = 'Function k can not be empty!'; return; }
  232.     if (Hlx == '') { document.getElementById("ErrorLabel").textContent = 'Function H- can not be empty!'; return; }
  233.     if (Hux == '') { document.getElementById("ErrorLabel").textContent = 'Function H+ can not be empty!'; return; }
  234.     if (flx == '') { document.getElementById("ErrorLabel").textContent = 'Function f- can not be empty!'; return; }
  235.     if (fux == '') { document.getElementById("ErrorLabel").textContent = 'Function f+ can not be empty!'; return; }
  236.     if (xlx == '') { document.getElementById("ErrorLabel").textContent = 'Function x*- can not be empty!'; return; }
  237.     if (xux == '') { document.getElementById("ErrorLabel").textContent = 'Function x*+ can not be empty!'; return; }
  238.  
  239.     a = (sFormElements['avalue'].value != '') ? parseFloat(sFormElements['avalue'].value) : 0.0;
  240.     b = (sFormElements['bvalue'].value != '') ? parseFloat(sFormElements['bvalue'].value) : 0.0;
  241.     var eps = (sFormElements['epsvalue'].value != '') ? parseFloat(sFormElements['epsvalue'].value) : 0.0;
  242.     n = (sFormElements['nvalue'].value != '') ? parseInt(sFormElements['nvalue'].value) : 0;
  243.     var r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
  244.    
  245.     if (isNaN(a)) { document.getElementById("ErrorLabel").textContent = 'a value error!'; return; }
  246.     if (isNaN(b)) { document.getElementById("ErrorLabel").textContent = 'b value error!'; return; }
  247.     if (isNaN(eps)) { document.getElementById("ErrorLabel").textContent = 'eps value error!'; return; }
  248.     if (isNaN(n)) { document.getElementById("ErrorLabel").textContent = 'n value error!'; return; }
  249.     if (isNaN(r)) { document.getElementById("ErrorLabel").textContent = 'r value error!'; return; }
  250.    
  251.     if ( a >= b) { document.getElementById("ErrorLabel").textContent = 'a is not less than b error!'; return; }
  252.     if ( eps <= 0) { document.getElementById("ErrorLabel").textContent = 'eps must be greater than 0 error!'; return; }
  253.     if ( n <= 2) { document.getElementById("ErrorLabel").textContent = 'n must be greater than 2 error!'; return; }
  254.     if ( r < 0 || r > 1) { document.getElementById("ErrorLabel").textContent = 'r must be between 0 and 1 error!'; return; }
  255.    
  256.     document.getElementById("ErrorLabel").textContent = 'Calculating...';
  257.    
  258.     // Step 0 - set variables
  259.    
  260.     var MaxIterations = 500; // m = 500 points at least with results
  261.     var h = (b-a)/n; // step for points
  262.     var D = 0; // initial false distance (max dist of all points)
  263.     xl = new Array(n+1); // x*- exact
  264.     xu = new Array(n+1); // x*+ exact
  265.     // for trapezoid
  266.     t = new Array(n+1); // t(i)
  267.     xml = new Array(MaxIterations+1); // xml[0..m][0..n] - lower
  268.     for (var i = 0; i <= MaxIterations; i++) { xml[i] = new Array(n+1); }
  269.     xmu = new Array(MaxIterations+1); // xmu[0..m][0..n] - upper
  270.     for (var i = 0; i <= MaxIterations; i++) { xmu[i] = new Array(n+1); }
  271.     var el = new Array(n+1); // err-  approx - exact
  272.     var eu = new Array(n+1); // err+  approx - exact
  273.     // for optimal (middle rectangle)
  274.     to = new Array(n+1); // to(i)
  275.     xoml = new Array(MaxIterations+1); // xoml[0..m][0..n] - lower
  276.     for (var i = 0; i <= MaxIterations; i++) { xoml[i] = new Array(n+1); }
  277.     xomu = new Array(MaxIterations+1); // xomu[0..m][0..n] - upper
  278.     for (var i = 0; i <= MaxIterations; i++) { xomu[i] = new Array(n+1); }
  279.     var eol = new Array(n+1); // err-  approx - exact for opt
  280.     var eou = new Array(n+1); // err+  approx - exact for opt
  281.     var xtoml = new Array(MaxIterations+1); // xtoml[0..m][0..n] - lower
  282.     for (var i = 0; i <= MaxIterations; i++) { xtoml[i] = new Array(n+1); }
  283.     var xtomu = new Array(MaxIterations+1); // xtomu[0..m][0..n] - upper
  284.     for (var i = 0; i <= MaxIterations; i++) { xtomu[i] = new Array(n+1); }
  285.        
  286.     // initial values
  287.     for (var i = 0; i <= n; i++) { t[i] = a + i*h; }
  288.     for (var i = 1; i <= n; i++) { to[i] = a + (2*i-1)*(h/2); }
  289.     m = 0; // keep m < MaxIterations
  290.     mo = 0; // keep mo < MaxIterations
  291.     // parse functions once, outside of the loops
  292.     var Pglx = Parser.parse(glx);
  293.     var Pgux = Parser.parse(gux);
  294.     var Pkx = Parser.parse(kx);
  295.     var PHlx = Parser.parse(Hlx);
  296.     var PHux = Parser.parse(Hux);
  297.     var Pflx = Parser.parse(flx);
  298.     var Pfux = Parser.parse(fux);
  299.     var Pxlx = Parser.parse(xlx);
  300.     var Pxux = Parser.parse(xux);
  301.    
  302.     // Step 1 - x0(ti) m=0
  303.     for (var i = 0; i <= n; i++) {  // trapezoid
  304.         xml[0][i] = Pglx.evaluate({t: t[i], r: r});
  305.         xoml[0][i] = xml[0][i];
  306.         xmu[0][i] = Pgux.evaluate({t: t[i], r: r});
  307.         xomu[0][i] = xmu[0][i];
  308.     }
  309.     for (var i=1; i <= n; i++) { // optimal (middle finger)
  310.         xtoml[0][i] = Pglx.evaluate({t: to[i], r: r});
  311.         xtomu[0][i] = Pgux.evaluate({t: to[i], r: r});
  312.     }
  313.  
  314.     // Step 2 (the first iterative step)
  315.     // trapezoid
  316.     m = 1;
  317.     for (var i = 0; i <= n; i++) {
  318.         var sl = 0;  var su = 0;
  319.         for(var j = 1; j <= n; j++) {
  320.             sl = sl +
  321.                Pkx.evaluate({t: t[i], s: t[j-1]})
  322.                *
  323.                PHlx.evaluate({t: t[j-1], x: xml[m-1][j-1], r: r})
  324.             +
  325.                Pkx.evaluate({t: t[i], s: t[j]})
  326.                 *
  327.                PHlx.evaluate({t: t[j], x: xml[m-1][j], r: r});
  328.             su = su +
  329.                Pkx.evaluate({t: t[i], s: t[j-1]})
  330.                *
  331.                PHux.evaluate({t: t[j-1], x: xmu[m-1][j-1], r: r})
  332.             +
  333.                Pkx.evaluate({t: t[i], s: t[j]})
  334.                 *
  335.                PHux.evaluate({t: t[j], x: xmu[m-1][j], r: r});     
  336.         }
  337.         xml[m][i] = xml[0][i] + Pflx.evaluate({t: t[i], x: xml[m-1][i], r: r}) + (h/2)*sl;
  338.         xmu[m][i] = xmu[0][i] + Pfux.evaluate({t: t[i], x: xmu[m-1][i], r: r}) + (h/2)*su;
  339.     }
  340.     // optimal
  341.     mo = 1;
  342.     for (var i = 0; i <= n; i++) {
  343.         var sl = 0;  var su = 0;
  344.         var stl = 0; var stu = 0;
  345.         for(var j = 1; j <= n; j++) {
  346.             sl = sl +
  347.                Pkx.evaluate({t: t[i], s: to[j]})
  348.                *
  349.                PHlx.evaluate({t: to[j], x: xtoml[mo-1][j], r: r});
  350.             stl = stl +
  351.                Pkx.evaluate({t: to[i], s: to[j]})
  352.                *
  353.                PHlx.evaluate({t: to[j], x: xtoml[mo-1][j], r: r});
  354.             su = su +
  355.                Pkx.evaluate({t: t[i], s: to[j]})
  356.                *
  357.                PHux.evaluate({t: to[j], x: xtomu[mo-1][j], r: r});     
  358.             stu = stu +
  359.                Pkx.evaluate({t: to[i], s: to[j]})
  360.                *
  361.                PHux.evaluate({t: to[j], x: xtomu[mo-1][j], r: r});     
  362.         }
  363.         xoml[mo][i] = xoml[0][i] + Pflx.evaluate({t: t[i], x: xoml[mo-1][i], r: r}) + h*sl;
  364.         xomu[mo][i] = xomu[0][i] + Pfux.evaluate({t: t[i], x: xomu[mo-1][i], r: r}) + h*su;
  365.         if (i > 0) { xtoml[mo][i] = xtoml[0][i] + Pflx.evaluate({t: to[i], x: xtoml[mo-1][i], r: r}) + h*stl; }
  366.         if (i > 0) { xtomu[mo][i] = xtomu[0][i] + Pfux.evaluate({t: to[i], x: xtomu[mo-1][i], r: r}) + h*stu; }
  367.     }
  368.    
  369.     // Steps 3-4 (the generic iterative step)
  370.     // trapezoid
  371.     do {
  372.         m = m+1; // next iteration
  373.         if ( m > MaxIterations ) {
  374.             alert("Iterations exceeded "+MaxIterations+"! Stopped!"); return;
  375.         }
  376.         for (var i = 0; i <= n; i++) {
  377.             var sl = 0;  var su = 0;
  378.             for(var j = 1; j <= n; j++) {
  379.                 sl = sl +
  380.                    Pkx.evaluate({t: t[i], s: t[j-1]})
  381.                     *
  382.                    PHlx.evaluate({t: t[j-1], x: xml[m-1][j-1], r: r})
  383.                 +
  384.                    Pkx.evaluate({t: t[i], s: t[j]})
  385.                     *
  386.                    PHlx.evaluate({t: t[j], x: xml[m-1][j], r: r});
  387.                 su = su +
  388.                    Pkx.evaluate({t: t[i], s: t[j-1]})
  389.                     *
  390.                    PHux.evaluate({t: t[j-1], x: xmu[m-1][j-1], r: r})
  391.                 +
  392.                    Pkx.evaluate({t: t[i], s: t[j]})
  393.                     *
  394.                    PHux.evaluate({t: t[j], x: xmu[m-1][j], r: r});     
  395.             }
  396.             xml[m][i] = xml[0][i] + Pflx.evaluate({t: t[i], x: xml[m-1][i], r: r}) + (h/2)*sl;
  397.             xmu[m][i] = xmu[0][i] + Pfux.evaluate({t: t[i], x: xmu[m-1][i], r: r}) + (h/2)*su;
  398.         }
  399.         // calculate D as max(D(x(m,t(i)), x(m-1,t(i))) for i = 0..n
  400.         D = 0;
  401.         for (var i = 0; i <= n; i++) {
  402.             var Di = Math.max(Math.abs(xml[m][i] - xml[m-1][i]), Math.abs(xmu[m][i] - xmu[m-1][i]));
  403.             if ( Di > D ) { D = Di };
  404.         }
  405.     } while ( (D >= eps) && (m < MaxIterations) );
  406.     // possible also check m is reasonable to avoid endless looping if no convergence
  407.     if ( m >= MaxIterations)
  408.     {
  409.         alert("Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!");
  410.         return;
  411.     }
  412.     // optimal (middle rectangle)
  413.     do {
  414.         mo = mo+1; // next iteration
  415.         if ( mo >= MaxIterations ) {
  416.             alert("Iterations exceeded "+MaxIterations+"! Stopped!"); return;
  417.         }
  418.         for (var i = 0; i <= n; i++) {
  419.             var sl = 0;  var su = 0;
  420.             var stl = 0; var stu = 0;
  421.             for(var j = 1; j <= n; j++) {
  422.                 sl = sl +
  423.                    Pkx.evaluate({t: t[i], s: to[j]})
  424.                    *
  425.                    PHlx.evaluate({t: to[j], x: xtoml[mo-1][j], r: r});
  426.                 stl = stl +
  427.                    Pkx.evaluate({t: to[i], s: to[j]})
  428.                    *
  429.                    PHlx.evaluate({t: to[j], x: xtoml[mo-1][j], r: r});
  430.                 su = su +
  431.                    Pkx.evaluate({t: t[i], s: to[j]})
  432.                    *
  433.                    PHux.evaluate({t: to[j], x: xtomu[mo-1][j], r: r});     
  434.                 stu = stu +
  435.                    Pkx.evaluate({t: to[i], s: to[j]})
  436.                    *
  437.                    PHux.evaluate({t: to[j], x: xtomu[mo-1][j], r: r});     
  438.             }
  439.             xoml[mo][i] = xoml[0][i] + Pflx.evaluate({t: t[i], x: xoml[mo-1][i], r: r}) + h*sl;
  440.             xomu[mo][i] = xomu[0][i] + Pfux.evaluate({t: t[i], x: xomu[mo-1][i], r: r}) + h*su;
  441.             if (i > 0) xtoml[mo][i] = xtoml[0][i] + Pflx.evaluate({t: to[i], x: xtoml[mo-1][i], r: r}) +  h*stl;
  442.             if (i > 0) xtomu[mo][i] = xtomu[0][i] + Pfux.evaluate({t: to[i], x: xtomu[mo-1][i], r: r}) +  h*stu;
  443.         }
  444.         // calculate D
  445.         D = 0;
  446.         for (var i = 0; i <= n; i++) {
  447.             var Di = Math.max(Math.abs(xoml[mo][i] - xoml[mo-1][i]), Math.abs(xomu[mo][i] - xomu[mo-1][i]));
  448.             if ( Di > D ) { D = Di };
  449.         }
  450.     } while ( (D >= eps) && (mo < MaxIterations) );
  451.     // possible also check m is reasonable to avoid endless looping if no convergence
  452.     if ( mo >= MaxIterations)
  453.     {
  454.         alert("Endless loop detected (>"+MaxIterations+" iterations) in optimal formula!");
  455.         return;
  456.     }
  457.    
  458.     Calculated = m > 0; // flag for the graphics plot
  459.    
  460.     // calculate the exact solution
  461.     for (var i = 0; i <= n; i++) {
  462.         xl[i] = Pxlx.evaluate({t: t[i], r: r});
  463.         el[i] = Math.abs(xl[i] - xml[m][i]);
  464.         eol[i] = Math.abs(xl[i] - xoml[mo][i]);
  465.         xu[i] = Pxux.evaluate({t: t[i], r: r});
  466.         eu[i] = Math.abs(xu[i] - xmu[m][i]);
  467.         eou[i] = Math.abs(xu[i] - xomu[mo][i]);
  468.     }
  469.  
  470.     // draw a table and plot a graphics
  471.     document.getElementById("ErrorLabel").textContent = 'Done calculation...';
  472.  
  473.     var errors ='<caption>Errors</caption><tr><th>t<sub>i</sub></th><th>e<sub>i-</sub></th><th>eo<sub>i-</sub></th><th>e<sub>i+</sub></th><th>eo<sub>i+</sub></th></tr>';
  474.     for (var i = 0; i <= n; i++) {
  475.         errors+='<tr><td>'+myFixed(t[i],2)+'</td><td>'+el[i].toFixed(6)+'</td><td>'+eol[i].toFixed(6)+'</td><td>'+eu[i].toFixed(6)+'</td><td>'+eou[i].toFixed(6)+'</td></tr>';
  476.     }
  477.  
  478.     var values ='<caption>Values</caption><tr><th>t<sub>i</sub></th><th>x<sub>i-</sub></th><th>xc<sub>i-</sub></th><th>xo<sub>i-</sub></th><th>x<sub>i+</sub></th><th>xc<sub>i+</sub></th><th>xo<sub>i+</sub></th></tr>';
  479.     for (var i = 0; i <= n; i++) {
  480.         values+='<tr><td>'+myFixed(t[i],2)+'</td><td>'+xl[i].toFixed(6)+'</td><td>'+xml[m][i].toFixed(6)+'</td><td>'+xoml[mo][i].toFixed(6)+'</td><td>'+xu[i].toFixed(6)+'</td><td>'+xmu[m][i].toFixed(6)+'</td><td>'+xomu[mo][i].toFixed(6)+'</td></tr>';
  481.     }
  482.  
  483.     document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for n='+n+', r='+r.toFixed(2)+' (iterations: '+m+' classical, '+mo+' optimal)</center>';
  484.     document.getElementById("ResultsErrors").innerHTML = errors;
  485.     document.getElementById("ResultsValues").innerHTML = values;
  486.    
  487.     document.getElementById("ResultLabel2").innerHTML = '';
  488.     document.getElementById('animated-result').style.display = ''; // show the result
  489.    
  490. } // catch the error and show the eror message
  491. catch(err) {
  492.     var vDebug = "";
  493.     for (var prop in err)
  494.     {  
  495.        vDebug += "property: "+ prop+ " ["+ err[prop]+ "], ";
  496.     }
  497.     vDebug += "[" + err.toString() + "]";
  498.     document.getElementById('animated-result').style.display = 'none'; // hide result
  499.     document.getElementById("ErrorLabel").textContent = 'Error: ' + err.message +
  500.       ' ' + vDebug;}   
  501. }
  502.  
  503. </script>
  504.  
  505. </p>
  506.  
  507. </body>
  508. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement