Advertisement
enkov

2D NL Hammerstein-Fredholm fuzzy Haar Wavelets

May 28th, 2017
646
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 2DNHFFFIE-HW solver</title>
  5.     <meta name="Description" content="Web-based 2D nonlinear Hammerstein-Fredholm fuzzy functional integral equations based on fuzzy Haar wavelets solver" />
  6.     <meta name="Keywords" content="two-dimmensional nonlinear fuzzy integral equation, Hammerstein-Fredholm, solver, numerical method, approximate method, iterative method, Haar wavelets, fuzzy Haar wavelets" />
  7.     <meta name="Author" content="Svetoslav Enkov. Atanaska Georgieva" />
  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 2D nonlinear Hammerstein-Fredholm fuzzy
  14. functional integral equations based on fuzzy Haar wavelets</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>(s,t,r) = <input name="glfunc" value="" type="text" size=115></p>
  20. <p>&nbsp;&nbsp;g<sub>+</sub>(s,t,r) = <input name="gufunc" value="" type="text" size=115></p>
  21. <p>&nbsp;k(s,t,x,y) = <input name="kfunc" value="" type="text" size=115></p>
  22. <p>H<sub>-</sub>(x,y,F,r) = <input name="Hlfunc" value="" type="text" size=115></p>
  23. <p>H<sub>+</sub>(x,y,F,r) = <input name="Hufunc" value="" type="text" size=115></p>
  24. <p>f<sub>-</sub>(s,t,F,r) = <input name="flfunc" value="" type="text" size=115></p>
  25. <p>f<sub>+</sub>(s,t,F,r) = <input name="fufunc" value="" type="text" size=115></p>
  26. <p>&nbsp;F*<sub>-</sub>(s,t,r) = <input name="Flfunc" value="" type="text" size=115></p>
  27. <p>&nbsp;F*<sub>+</sub>(s,t,r) = <input name="Fufunc" value="" type="text" size=115></p>
  28. <p> a =<input name="avalue" value="" type="text" size=6>
  29.  b =<input name="bvalue" value="" type="text" size=6>
  30.  c =<input name="cvalue" value="" type="text" size=6>
  31.  d =<input name="dvalue" value="" type="text" size=6>&nbsp;
  32.  &#955; =<input name="lvalue" value="" type="text" size=6>  
  33.  &epsilon; =<input name="epsvalue" value="" type="text" size=6>
  34.  M =<input name="Mvalue" value="" type="text" size=4>  
  35.  N =<input name="Nvalue" value="" type="text" size=4>
  36.  r =<input name="rvalue" value="" type="text" size=6>
  37. </p>
  38. <p> s<sub>0</sub> =<input name="s0value" value="" type="text" size=6>
  39.  t<sub>0</sub> =<input name="t0value" value="" type="text" size=6>
  40.  </p>
  41.  
  42. </div>
  43.  
  44. <p><span align='left'>&nbsp;&nbsp;<input name = "CalcButton" value="Calculate" type="button" title="Calculate" onclick="StartCalc();">&nbsp;&nbsp;&nbsp;<span id="ErrorLabel">
  45. </span>
  46. <p align='right'>
  47. <input type="checkbox" name="ResultsType" value="Squeeze">Squeeze results&nbsp;&nbsp;
  48. <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">&nbsp;
  49. Error output:
  50. <select name='FormattingErrors'>
  51.   <option value="-1">Normal</option>
  52.   <option value="0">Exponential 0</option>
  53.   <option value="1">Exponential 1</option>
  54.   <option value="2">Exponential 2</option>
  55.   <option value="3">Exponential 3</option>
  56.   <option value="4">Exponential 4</option>
  57.   <option value="5">Exponential 5</option>
  58.   <option value="6">Exponential 6</option>
  59. </select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  60. </p>
  61.  
  62. <div  id="animated-result" class="animated fadeInLeft" align="center" style="display:none">
  63. <span id="ResultLabel1"></span><br>
  64. <span id="ResultLabel2"></span>
  65. <table id="ResultsErrors" class="ResultTable"></table><br>
  66. <table id="ResultsValues" class="ResultTable"></table><br>
  67. </div>
  68.  
  69. <div style='font-family: "Times New Roman", Times, serif;'>Note: use E instead of e, PI instead of &pi;, ^ for power, etc...</div>
  70.  
  71. </div>
  72.  
  73. <!-- will be enabled later with the actual article PDF
  74. <div><a href=
  75. "article.pdf" target="_blank"><img src="pdf-download-icon.png" alt="Read entire article in PDF" style="width:291px;height:92px;border:0;">
  76. </a>
  77. </div>
  78. -->
  79. </form>
  80.  
  81. <script src="lib/parser.js" type="text/javascript"></script>
  82.  
  83. <script type="text/javascript">
  84. // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
  85. //  - please use old version, not new ECMAScript 6 version
  86. //
  87. // Copyright (c)2017 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, freeware, public domain
  88. // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg
  89. // published at http://enkov.com/solver2DWave
  90. // https://pastebin.com/kCKKsmmp source
  91. //
  92. // Algorithm is based on the presentation at APPLICATIONS OF MATHEMATICS IN ENGINEERING AND ECONOMICS (AMEE’17): Proceedings of the 43rd International Conference on Applications of Mathematics in Engineering and Economics
  93. // article "Numerical solution of two-dimensional nonlinear Hammerstein-Fredholm fuzzy functional integral equations based on fuzzy Haar wavelets"
  94.  
  95. var sFormElements = document.forms["EvalForm"].elements; // for accessing DOM elements of the form/page
  96. var Calculated = false; // flag for completion
  97. // predefined global forwards to be viewable outside a calculation routine
  98. var M; var N; // 2M x 2N matrices
  99. var a; var b; var c; var d; // intervals x/y
  100. var Fml; var Fmu; // iteration's
  101. var Fl; var Fu; // exact values F* calculated by net, lower/upper
  102. var m; // current iteration
  103. var s; var t;  // s, t arrays of points
  104. var lambda; // coefficient for correction
  105. var s0; var t0; // calculation point
  106. var F0ml; var F0mu; // F(s0,t0) values at the calculation point
  107.  
  108. function Sample() // preloads sample values for fast evaluation of the algorithm
  109. {
  110. // our sample
  111.     sFormElements["glfunc"].value = '(1/3)*(1+r)*s*t-(1/8)*s*t-(1/6)*(1+r)*s*t';
  112.     sFormElements["gufunc"].value = '(1/3)*(3-r)*s*t-(1/8)*s*t-(1/6)*(3-r)*s*t';
  113.     sFormElements["kfunc"].value = 's*x*t*y';
  114.     sFormElements["Hlfunc"].value = 'x*x+y*y+F';
  115.     sFormElements["Hufunc"].value = 'x*x+y*y+F';
  116.     sFormElements["flfunc"].value = '(F*2/3)-(1/8)*s*t+(1/18)*(1+r)*s*t';
  117.     sFormElements["fufunc"].value = '(F*2/3)-(1/8)*s*t+(1/18)*(3-r)*s*t';
  118.     sFormElements["Flfunc"].value = '(1+r)*s*t';
  119.     sFormElements["Fufunc"].value = '(3-r)*s*t';
  120.     sFormElements["avalue"].value = '0';
  121.     sFormElements["bvalue"].value = '1';
  122.     sFormElements["cvalue"].value = '0';
  123.     sFormElements["dvalue"].value = '1';
  124.     sFormElements["lvalue"].value = '1';
  125.     sFormElements["epsvalue"].value = '1e-10';
  126.     sFormElements["Mvalue"].value = '10';
  127.     sFormElements["Nvalue"].value = '10';
  128.     sFormElements["rvalue"].value = '0.5';
  129.     sFormElements["s0value"].value = '0.5';
  130.     sFormElements["t0value"].value = '0.5';
  131. // prepare for calculation - reset messages
  132.     document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
  133.     document.getElementById("ResultLabel1").innerHTML = '';
  134.     document.getElementById("ResultLabel2").innerHTML = '';
  135.     document.getElementById("ResultsErrors").innerHTML = '';
  136.     document.getElementById("ResultsValues").innerHTML = '';
  137. }
  138.  
  139. function myFixed(p1, p2){ // our formatting routine - input p1 - output formatted as toFixed
  140.                           // but if the number is .00 do not add .00
  141.     if (Math.trunc(p1)==p1)
  142.         { return p1; }
  143.     else
  144.         { return p1.toFixed(p2); }
  145. }
  146.  
  147. function StartCalc() // using setTimeout to refresh message before starting calculations
  148. {
  149.     document.getElementById("ErrorLabel").textContent = 'Calculating...';
  150.     document.getElementById('animated-result').style.display = 'none'; // hide result
  151.     window.setTimeout(Calc, 100);
  152. }
  153.  
  154. function Calc() // main calculation routine
  155. {try {
  156.  
  157.     Calculated = false; // flag - not yet calculated
  158.    
  159.     // Get the initial values from the user's input
  160.  
  161.     // input fields
  162.     // functions
  163.     var glx = sFormElements['glfunc'].value;
  164.     var gux = sFormElements['gufunc'].value;
  165.     var kx  = sFormElements['kfunc'].value;
  166.     var Hlx = sFormElements['Hlfunc'].value;
  167.     var Hux = sFormElements['Hufunc'].value;
  168.     var flx = sFormElements['flfunc'].value;
  169.     var fux = sFormElements['fufunc'].value;
  170.     var Flx = sFormElements['Flfunc'].value;
  171.     var Fux = sFormElements['Fufunc'].value;
  172.    
  173.     // validate for not empty
  174.     if (glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>-</sub> can not be empty!'; return; }
  175.     if (gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>+</sub> can not be empty!'; return; }
  176.     if (kx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function k can not be empty!'; return; }
  177.     if (Hlx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H<sub>-</sub> can not be empty!'; return; }
  178.     if (Hux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H<sub>+</sub> can not be empty!'; return; }
  179.     if (flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function f<sub>-</sub> can not be empty!'; return; }
  180.     if (fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function f<sub>+</sub> can not be empty!'; return; }
  181.     if (Flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>-</sub> can not be empty!'; return; }
  182.     if (Fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>+</sub> can not be empty!'; return; }
  183.     // constants validate for not empty
  184.     if (sFormElements['avalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant a can not be empty!'; return; }
  185.     if (sFormElements['bvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant b can not be empty!'; return; }
  186.     if (sFormElements['cvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant c can not be empty!'; return; }
  187.     if (sFormElements['dvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant d can not be empty!'; return; }
  188.     if (sFormElements['lvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant &#955; can not be empty!'; return; }
  189.     if (sFormElements['epsvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant &epsilon; can not be empty!'; return; }
  190.     if (sFormElements['Mvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant M can not be empty!'; return; }
  191.     if (sFormElements['Nvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant N can not be empty!'; return; }
  192.     if (sFormElements['rvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant r can not be empty!'; return; }
  193.     if (sFormElements['s0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> can not be empty!'; return; }
  194.     if (sFormElements['t0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> can not be empty!'; return; }
  195.     // validate constants for correct number
  196.     a = (sFormElements['avalue'].value != '') ? parseFloat(sFormElements['avalue'].value) : 0.0;
  197.     b = (sFormElements['bvalue'].value != '') ? parseFloat(sFormElements['bvalue'].value) : 0.0;
  198.     c = (sFormElements['cvalue'].value != '') ? parseFloat(sFormElements['cvalue'].value) : 0.0;
  199.     d = (sFormElements['dvalue'].value != '') ? parseFloat(sFormElements['dvalue'].value) : 0.0;
  200.     lambda = (sFormElements['lvalue'].value != '') ? parseFloat(sFormElements['lvalue'].value) : 0.0;
  201.     var eps = (sFormElements['epsvalue'].value != '') ? parseFloat(sFormElements['epsvalue'].value) : 0.0;
  202.     M = (sFormElements['Mvalue'].value != '') ? parseInt(sFormElements['Mvalue'].value) : 0;
  203.     N = (sFormElements['Nvalue'].value != '') ? parseInt(sFormElements['Nvalue'].value) : 0;
  204.     var r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
  205.     s0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['s0value'].value) : 0.0;
  206.     t0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['t0value'].value) : 0.0;
  207.     // validity check - ranges or NaN
  208.     if (isNaN(a)) { document.getElementById("ErrorLabel").innerHTML = 'a value error!'; return; }
  209.     if (isNaN(b)) { document.getElementById("ErrorLabel").innerHTML = 'b value error!'; return; }
  210.     if (isNaN(c)) { document.getElementById("ErrorLabel").innerHTML = 'c value error!'; return; }
  211.     if (isNaN(d)) { document.getElementById("ErrorLabel").innerHTML = 'd value error!'; return; }
  212.     if (isNaN(lambda)) { document.getElementById("ErrorLabel").innerHTML = '&#955; value error!'; return; }
  213.     if (isNaN(eps)) { document.getElementById("ErrorLabel").innerHTML = '&epsilon; value error!'; return; }
  214.     if (isNaN(M)) { document.getElementById("ErrorLabel").innerHTML = 'M value error!'; return; }
  215.     if (isNaN(N)) { document.getElementById("ErrorLabel").innerHTML = 'N value error!'; return; }
  216.     if (isNaN(r)) { document.getElementById("ErrorLabel").innerHTML = 'r value error!'; return; }
  217.     if ( a >= b) { document.getElementById("ErrorLabel").innerHTML = 'a is not less than b error!'; return; }
  218.     if ( c >= d) { document.getElementById("ErrorLabel").innerHTML = 'c is not less than d error!'; return; }
  219.     if (lambda == 0) { document.getElementById("ErrorLabel").innerHTML = '&#955; cannot be zero error!'; return; }
  220.     if ( eps <= 0) { document.getElementById("ErrorLabel").innerHTML = '&epsilon; must be greater than 0 error!'; return; }
  221.     if ( M <= 2) { document.getElementById("ErrorLabel").innerHTML = 'M must be greater than 2 error!'; return; }
  222.     if ( N <= 2) { document.getElementById("ErrorLabel").innerHTML = 'N must be greater than 2 error!'; return; }
  223.     if ( r < 0 || r > 1) { document.getElementById("ErrorLabel").innerHTML = 'r must be between 0 and 1 error!'; return; }
  224.     if (isNaN(s0)) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> value error!'; return; }
  225.     if (isNaN(t0)) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> value error!'; return; }
  226.     if ( s0 < a || s0 > b) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> must be between a and b error!'; return; }
  227.     if ( t0 < c || t0 > d) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> must be between c and d error!'; return; }   
  228.    
  229.     // flag for results output format - compact table first 1..3 and last values if checked
  230.     var SqueezeResults = sFormElements['ResultsType'].checked;
  231.          
  232.     // start calcualtions
  233.    
  234.     // Step 0 - set the variables and initial values
  235.  
  236.     var MaxIterations = 200; // max iterations - arrays
  237.  
  238.     var sigma = (b-a)/(2*M); // step for points x-axis
  239.     var sigmaprim = (d-c)/(2*N); // step for points y-axis
  240.     var D; // error (Distance between iterations and/or exact solution)
  241.  
  242.     // create arrays (matrices and vectors)
  243.  
  244.     // arrays for vaues of the points coordinates
  245.     ksi = new Array(2*M+1); // ksi(i) 1..2M
  246.     eta = new Array(2*N+1); // eta(j) 1..2N
  247.        
  248.     // calculate values of arrays of network points coordinates
  249.     for (var i = 1; i <= 2*M; i++) { ksi[i] = a + sigma*(i-1/2); }
  250.     for (var j = 1; j <= 2*N; j++) { eta[j] = c + sigmaprim*(j-1/2); }
  251.        
  252.     Fl = new Array(2*M+1); // F*- exact matrix lower 2Mx2N
  253.     for (var i = 1; i <= 2*M; i++) { Fl[i] = new Array(2*N+1); }   
  254.     Fu = new Array(2*M+1); // F*+ exact matrix upper 2Mx2N
  255.     for (var i = 1; i <= 2*M; i++) { Fu[i] = new Array(2*N+1); }   
  256.    
  257.     Fml = new Array(MaxIterations+1); // Fml[0..iter][1..2M][1..2N] - lower iterations matrix
  258.     for (var i = 0; i <= MaxIterations; i++) {
  259.         Fml[i] = new Array(2*M+1);
  260.         for (var j = 1; j <= 2*M; j++) { Fml[i][j] = new Array(2*N+1); }   
  261.     }
  262.  
  263.     Fmu = new Array(MaxIterations+1); // Fmu[0..iter][1..2M][1..2N] - upper iterations matrix
  264.     for (var i = 0; i <= MaxIterations; i++) {
  265.         Fmu[i] = new Array(2*M+1);
  266.         for (var j = 1; j <= 2*M; j++) { Fmu[i][j] = new Array(2*N+1); }   
  267.     }
  268.  
  269.     F0ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower at point (s0,t0)
  270.     F0mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper at point (s0,t0)
  271.    
  272.     var e0l; var e0u; // error between iteration and exact solution at point (s0,t0)
  273.    
  274.     var el = new Array(2*M+1); // err-  approx - exact
  275.     for (var i = 1; i <= 2*M; i++) { el[i] = new Array(2*N+1); }
  276.     var eu = new Array(2*M+1); // err+  approx - exact
  277.     for (var i = 1; i <= 2*M; i++) { eu[i] = new Array(2*N+1); }
  278.    
  279.     m = 0; // keep m < MaxIterations - m is current step number
  280.    
  281.     // parse the functions once, outside of the loops
  282.     var Pglx = Parser.parse(glx);
  283.     var Pgux = Parser.parse(gux);
  284.     var Pkx = Parser.parse(kx);
  285.     var PHlx = Parser.parse(Hlx);
  286.     var PHux = Parser.parse(Hux);
  287.     var Pflx = Parser.parse(flx);
  288.     var Pfux = Parser.parse(fux);
  289.     var PFlx = Parser.parse(Flx);
  290.     var PFux = Parser.parse(Fux);
  291.    
  292.     // Step 1 - Fm F0m m=0 initial values for network points - preliminary step
  293.     for (var i = 1; i <= 2*M; i++) {
  294.         for (var j = 1; j <= 2*N; j++) {
  295.             Fml[0][i][j] = Pglx.evaluate({s: ksi[i], t: eta[j], r: r});
  296.             Fmu[0][i][j] = Pgux.evaluate({s: ksi[i], t: eta[j], r: r});
  297.         }
  298.     }
  299.    
  300.     // initial values at (s0,t0)
  301.     F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
  302.     F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
  303.    
  304.     // Step 2 (the first iterative step)
  305.  
  306.     // preliminary step iteration 1
  307.     m = 1;
  308.     // loop through all points of the 2M x 2N matrix - see the formulaes in the article
  309.     for (var i = 1; i <= 2*M; i++) {
  310.         for (var j = 1; j <= 2*N; j++) {
  311.             var stl = 0;  var stu = 0;
  312.             for (var k = 1; k <= 2*N; k++) {
  313.                 for (var p = 1; p <= 2*M; p++) {
  314.                     stl = stl +
  315.                         Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
  316.                         *
  317.                         PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
  318.                     stu = stu +
  319.                         Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
  320.                         *
  321.                         PHlx.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
  322.                 }
  323.             }
  324.             Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: ksi[i], t: eta[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
  325.             Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: ksi[i], t: eta[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
  326.             // check for NaN - possible errors (divide by zero or over/under-flows)
  327.             if (isNaN(Fml[m][i][j])) {
  328.                 document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at point ("+i+","+j+").";
  329.                 return;
  330.             }
  331.             if (isNaN(Fmu[m][i][j])) {
  332.                 document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at point ("+i+","+j+").";
  333.                 return;
  334.             }      
  335.         }
  336.     }
  337.    
  338.     // F0m[1] // at point (s0,t0)
  339.     var st0l = 0;  var st0u = 0;
  340.     for (var k = 1; k <= 2*N; k++) {
  341.         for (var p = 1; p <= 2*M; p++) {
  342.             st0l = st0l +
  343.                 Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
  344.                 *
  345.                 PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
  346.             st0u = st0u +
  347.                 Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
  348.                 *
  349.                 PHux.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
  350.         }
  351.     }
  352.     F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
  353.     F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
  354.     // check for NaN - possible errors (divide by zero or over/under-flows)
  355.     if (isNaN(F0ml[m])) {
  356.         document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  357.         return;
  358.     }
  359.     if (isNaN(F0mu[m])) {
  360.         document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  361.         return;
  362.     }
  363.  
  364.     // Steps 3-4 (the generic iterative step)
  365.    
  366.     // loop through all points of the 2M x 2N matrix - see the formulaes in the article
  367.     do {
  368.         m = m+1; // next iteration
  369.        
  370.         if ( m > MaxIterations ) { // check for posible endless loop
  371.             document.getElementById("ErrorLabel").innerHTML = "Iterations exceeded "+MaxIterations+"! Stopped!";
  372.             alert("Iterations exceeded "+MaxIterations+"! Stopped!");
  373.             return;
  374.         }
  375.        
  376.         // loop through all points of the 2M x 2N matrix - see the formulaes in the article
  377.         for (var i = 1; i <= 2*M; i++) {
  378.             for (var j = 1; j <= 2*N; j++) {
  379.                 var stl = 0;  var stu = 0;
  380.                 for (var k = 1; k <= 2*N; k++) {
  381.                     for (var p = 1; p <= 2*M; p++) {
  382.                         stl = stl +
  383.                             Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
  384.                             *
  385.                             PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
  386.                         stu = stu +
  387.                             Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
  388.                             *
  389.                             PHlx.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
  390.                     }
  391.                 }
  392.                 Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: ksi[i], t: eta[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
  393.                 Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: ksi[i], t: eta[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
  394.                 // check for NaN - possible errors (divide by zero or over/under-flows)
  395.                 if (isNaN(Fml[m][i][j])) {
  396.                     document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at point ("+i+","+j+").";
  397.                     return;
  398.                 }
  399.                 if (isNaN(Fmu[m][i][j])) {
  400.                     document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at point ("+i+","+j+").";
  401.                     return;
  402.                 }      
  403.             }
  404.         }
  405.        
  406.         // F0m[1] // at point (s0,t0)
  407.         var st0l = 0;  var st0u = 0;
  408.         for (var k = 1; k <= 2*N; k++) {
  409.             for (var p = 1; p <= 2*M; p++) {
  410.                 st0l = st0l +
  411.                     Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
  412.                     *
  413.                     PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
  414.                 st0u = st0u +
  415.                     Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
  416.                     *
  417.                     PHux.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
  418.             }
  419.         }
  420.         F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
  421.         F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
  422.         // check for NaN - possible errors (divide by zero or over/under-flows)
  423.         if (isNaN(F0ml[m])) {
  424.             document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  425.             return;
  426.         }
  427.         if (isNaN(F0mu[m])) {
  428.             document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  429.             return;
  430.         }
  431.  
  432.         // calculate D for (s0,t0)
  433.         D = Math.max(Math.abs(F0ml[m] - F0ml[m-1]), Math.abs(F0mu[m] - F0mu[m-1]));
  434.     } while ( (D >= eps) && (m < MaxIterations) ); // stop if epsilon is reached or iterations exceeded
  435.     // possible also check m is reasonable to avoid endless looping if no convergence
  436.     if ( m >= MaxIterations )
  437.     {
  438.         document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations)!";
  439.         alert("Endless loop detected (>"+MaxIterations+" iterations)!");
  440.         return;
  441.     }
  442.        
  443.     // calculate lower-upper exact value at point (s0,t0)
  444.     var F0l = PFlx.evaluate({s: s0, t: t0, r: r});
  445.     var F0u = PFux.evaluate({s: s0, t: t0, r: r});
  446.    
  447.     Calculated = m > 1; // flag for completion
  448.    
  449.     document.getElementById("ErrorLabel").textContent = 'Done calculations, iteration '+m+'...';
  450.  
  451.     // draw a tables with results
  452.    
  453.     var FormattingErrors = sFormElements["FormattingErrors"].value;
  454.     var e1; var e2;
  455.    
  456.     // errors table string (innerHTML)
  457.     var errors ='<caption>Errors at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>e<sub>m-</sub></th><th>e<sub>m+</sub></th></tr>';
  458.     if (SqueezeResults)  
  459.     {   // compact table 1..3 and last
  460.         for (var i = 1; i <= 3; i++) {
  461.             if ( i <= m) {
  462.                 e1 = Math.abs(F0l-F0ml[i]);
  463.                 e2 = Math.abs(F0u-F0mu[i]);
  464.                 if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
  465.                     e1 = e1.toExponential(eval(FormattingErrors));
  466.                     e2 = e2.toExponential(eval(FormattingErrors));
  467.                 }
  468.                 errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td></tr>';
  469.             }
  470.         }
  471.         errors+='<tr><td>...</td><td>...</td><td>...</td></tr>';
  472.     }
  473.     else
  474.     {   // full table
  475.         for (var i = 1; i <= m; i++) {
  476.             e1 = Math.abs(F0l-F0ml[i]);
  477.             e2 = Math.abs(F0u-F0mu[i]);
  478.             if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
  479.                 e1 = e1.toExponential(eval(FormattingErrors));
  480.                 e2 = e2.toExponential(eval(FormattingErrors));
  481.             }
  482.             errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td><tr>';
  483.         }
  484.     }
  485.     errors +='<tr><td colspan="3" align="center">Errors at end</td></tr><tr><th></th><th>e<sub>m-</sub></th><th>e<sub>m+</sub></th></tr>';
  486.     errors+='<tr><td>Last</td>';
  487.     e1 = Math.abs(F0l-F0ml[m]);
  488.     e2 = Math.abs(F0u-F0mu[m]);
  489.     if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
  490.         e1 = e1.toExponential(eval(FormattingErrors));
  491.         e2 = e2.toExponential(eval(FormattingErrors));
  492.     }  
  493.     errors+='<td>'+e1+'</td></td><td>'+e2+'</td><tr>';
  494.        
  495.     // values table string (innerHTML)
  496.     var values ='<caption>Values at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>F<sub>m-</sub></th><th>F<sub>m+</sub></th></tr>';
  497.     if (SqueezeResults)
  498.     {   // compact table 1..3 and last
  499.         for (var i = 1; i <= 3; i++) {
  500.             if ( i <= m )
  501.             {values+='<tr><td>'+i+'</td><td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td><tr>';}
  502.         }
  503.         values+='<tr><td>...</td><td>...</td><td>...</td></tr>';
  504.         values +='<tr><td colspan="5" align="center">Final values (last iteration) </td></tr>';
  505.         values+='<tr><td><small>Last</small></td>';
  506.         values+='<td>'+F0ml[m]+'</td><td>'+F0mu[m]+'</td><tr>';
  507.     }
  508.     else
  509.     {   // full table
  510.         for (var i = 1; i <= m; i++) {
  511.             values+='<tr><td>'+i+'</td>'+'<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';
  512.         }
  513.     }
  514.  
  515.     // show the info and tables
  516.     document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for M='+M+', N='+N+', r='+r.toFixed(2)+' (iterations: '+m+')</center>';
  517.     document.getElementById("ResultsErrors").innerHTML = errors;
  518.     document.getElementById("ResultsValues").innerHTML = values;
  519.     //
  520.     document.getElementById("ErrorLabel").textContent = 'Done calculation...';
  521.     document.getElementById("ResultLabel2").innerHTML = '';
  522.     document.getElementById('animated-result').style.display = ''; // show the result
  523.    
  524. } // catch the error and show the eror message (debug information)
  525. catch(err) {
  526.     var vDebug = "";
  527.     var el = err.lineNumber;
  528.     for (var prop in err)
  529.     {  
  530.        vDebug += "property: "+ prop+ " ["+ err[prop]+ "], ";
  531.     }
  532.     vDebug += "[" + err.toString() + "]";
  533.     if ( !(el === undefined) ) { vDebug += ", on line " + el; }
  534.     document.getElementById('animated-result').style.display = 'none'; // hide result
  535.     document.getElementById("ErrorLabel").textContent = 'Error: ' + err.message +
  536.       ' ' + vDebug;
  537.     }  
  538. }
  539. </script>
  540. </p>
  541. </body>
  542. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement