Advertisement
enkov

Error estimate of 2D nonlinear Fredholm fuzzy integral eqs.

May 2nd, 2017
710
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 Fredholm equations</title>
  5.     <meta name="Description" content="Web-based 2D nonlinear Fredholm fuzzy 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, Albena Pavlova" />
  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%">Error estimate of 2D nonlinear Fredholm fuzzy 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;&nbsp;g<sub>-</sub>(s,t,r) = <input name="glfunc" value="" type="text" size=115></p>
  19. <p>&nbsp;&nbsp;&nbsp;g<sub>+</sub>(s,t,r) = <input name="gufunc" value="" type="text" size=115></p>
  20. <p>&nbsp;&nbsp;g<sub>1-</sub>(s,t,r) = <input name="g1lfunc" value="" type="text" size=115></p>
  21. <p>&nbsp;&nbsp;g<sub>1+</sub>(s,t,r) = <input name="g1ufunc" value="" type="text" size=115></p>
  22. <p>&nbsp;&nbsp;H(s,t,x,y) = <input name="Hfunc" value="" type="text" size=115></p>
  23. <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G<sub>-</sub>(F,r) = <input name="Glfunc" value="" type="text" size=115></p>
  24. <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G<sub>+</sub>(F,r) = <input name="Gufunc" value="" type="text" size=115></p>
  25. <p>&nbsp;&nbsp;F*<sub>-</sub>(s,t,r) = <input name="Flfunc" value="" type="text" size=115></p>
  26. <p>&nbsp;&nbsp;F*<sub>+</sub>(s,t,r) = <input name="Fufunc" value="" type="text" size=115></p>
  27. <p>&nbsp;&nbsp;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.  m =<input name="mvalue" value="" type="text" size=3>
  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>&nbsp;&nbsp;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. </div>
  41.  
  42. <p><span align='left'>&nbsp;&nbsp;&nbsp;&nbsp;<input name = "CalcButton" value="Calculate" type="button" title="Calculate" onclick="StartCalc();">&nbsp;&nbsp;&nbsp;<span id="ErrorLabel">
  43. </span></p>
  44. <p align='right'>
  45. <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">&nbsp;
  46. <!-- multiple samples version (testing)
  47. <select name='SampleNumber'>
  48.   <option value="Sample1">Sample 1</option>
  49.   <option value="Sample2">Sample 2</option>
  50.   <option value="Sample3">Sample 3</option>
  51.   <option value="Sample4">Sample 4</option>
  52. </select>&nbsp; -->
  53. Error output:
  54. <select name='FormattingErrors'>
  55.   <option value="-1">Normal</option>
  56.   <option value="0">Exponential 0</option>
  57.   <option value="1">Exponential 1</option>
  58.   <option value="2">Exponential 2</option>
  59.   <option value="3">Exponential 3</option>
  60.   <option value="4">Exponential 4</option>
  61.   <option value="5">Exponential 5</option>
  62.   <option value="6">Exponential 6</option>
  63. </select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  64. </p>
  65.  
  66. <div  id="animated-result" class="animated fadeInLeft" align="center" style="display:none">
  67. <span id="ResultLabel1"></span><br>
  68. <span id="ResultLabel2"></span>
  69. <table id="ResultsErrors" class="ResultTable"></table><br>
  70. <table id="ResultsValues" class="ResultTable"></table><br>
  71. </div>
  72.  
  73. <div style='font-family: "Times New Roman", Times, serif;'>&nbsp;&nbsp;Note: use E instead of e, PI instead of &pi;, ^ for power, sqrt for &radic;, etc...</div>
  74.  
  75. </div>
  76.  
  77. <!-- will be enabled later with the actual article PDF
  78. <div><a href=
  79. "article.pdf" target="_blank"><img src="pdf-download-icon.png" alt="Read entire article in PDF" style="width:291px;height:92px;border:0;">
  80. </a>
  81. </div>
  82. -->
  83. </form>
  84.  
  85. <script src="lib/parser.js" type="text/javascript"></script>
  86.  
  87. <script type="text/javascript">
  88. // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
  89. //  - please use old version, not new ECMAScript 6 version
  90. // Copyright (c)2017 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, Albena Pavlova, freeware, public domain
  91. // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg, afi2000@abv.bg
  92. // Techical University of Sofia, branch Plovdiv, Faculty of Mechanical Engineering. akosseva@gmail.com
  93. // This software is published at http://enkov.com/solver2DFErr
  94. // The source is available at pastebin https://pastebin.com/VscfecC8
  95. //
  96. // in print Communications in Applied Analysis - Svetoslav Nenov
  97. // http://www.dynamicpublishers.org/journals/index.php/CAA
  98. // A. Georgieva, A. Pavlova, S.Enkov: Quadrature Rules And Iterative Numerical Method For Two-Dimensional Nonlinear Fredholm Fuzzy Integral Equations
  99.  
  100. var sFormElements = document.forms["EvalForm"].elements; // for accessing DOM elements of the form/page
  101. var Calculated = false; // flag for completion
  102. // predefined global forwards to be viewable outside a calculation routine
  103. var n; var np; // n x np matrices
  104. var mv; // m value (to not mess with m iteration counter)
  105. var r;
  106. var a; var b; var c; var d; // intervals x/y
  107. var Fml; var Fmu;  // iteration's arrays for trapezoid
  108. var Fl; var Fu; // exact values F* calculated by net, lower/upper
  109. var m;  // current iteration classic
  110. var s; var t; // s, t arrays of points classic
  111. var lambda; // coefficient for correction
  112. var s0; var t0; // calculation point
  113. var F0ml; var F0mu; // F(s0,t0) values values at the calculation point
  114.  
  115. function Sample() // preloads sample values for fast evaluation of the algorithm
  116. {
  117.     // article sample
  118.     sFormElements["glfunc"].value = '(4+r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(4+r)';
  119.     sFormElements["gufunc"].value = '(6-r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(6-r)';
  120.     sFormElements["g1lfunc"].value = '(4+r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(4+r)+0.1';
  121.     sFormElements["g1ufunc"].value = '(6-r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(6-r)-0.1';
  122.     sFormElements["Hfunc"].value = 's*s*t*t*(x+y)';
  123.     sFormElements["Glfunc"].value = 'sqrt(F)';
  124.     sFormElements["Gufunc"].value = 'sqrt(F)';
  125.     sFormElements["Flfunc"].value = '(4+r)*E^(2*s+2*t)';
  126.     sFormElements["Fufunc"].value = '(6-r)*E^(2*s+2*t)';
  127.     sFormElements["avalue"].value = '0';
  128.     sFormElements["bvalue"].value = '1';
  129.     sFormElements["cvalue"].value = '0';
  130.     sFormElements["dvalue"].value = '1';
  131.     sFormElements["lvalue"].value = '1';
  132.     sFormElements["mvalue"].value = '5';
  133.     sFormElements["nvalue"].value = '10';
  134.     sFormElements["npvalue"].value = '10';
  135.     sFormElements["rvalue"].value = '0.5';
  136.     sFormElements["s0value"].value = '0.5';
  137.     sFormElements["t0value"].value = '0.5';
  138. /* old samples 
  139.     var SampleNumber = sFormElements["SampleNumber"].value;
  140.     switch (SampleNumber) {
  141.     case 'Sample1':
  142.     sFormElements["glfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t';
  143.     sFormElements["gufunc"].value = '(4-r)*s*t-(1/16)*(4-r)*(4-r)*s*t';
  144.     sFormElements["g1lfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t+0.1';
  145.     sFormElements["g1ufunc"].value = '(4-r)*s*t-(1/16)*(4-r)*(4-r)*s*t-0.1';
  146.     sFormElements["Hfunc"].value = 's*x*t*y';
  147.     sFormElements["Glfunc"].value = 'F*F';
  148.     sFormElements["Gufunc"].value = 'F*F';
  149.     sFormElements["Flfunc"].value = '(2+r)*s*t';
  150.     sFormElements["Fufunc"].value = '(4-r)*s*t';
  151.     sFormElements["avalue"].value = '0';
  152.     sFormElements["bvalue"].value = '1';
  153.     sFormElements["cvalue"].value = '0';
  154.     sFormElements["dvalue"].value = '1';
  155.     sFormElements["lvalue"].value = '1';
  156.     sFormElements["mvalue"].value = '5';
  157.     sFormElements["nvalue"].value = '10';
  158.     sFormElements["npvalue"].value = '10';
  159.     sFormElements["rvalue"].value = '0.5';
  160.     sFormElements["s0value"].value = '0.5';
  161.     sFormElements["t0value"].value = '0.5';
  162.     break;
  163.     case 'Sample2':
  164.     sFormElements["glfunc"].value = 'r*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(r)*s*t';
  165.     sFormElements["gufunc"].value = '(2-r)*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(2-r)*s*t';
  166.     sFormElements["g1lfunc"].value = 'r*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(r)*s*t+0.01';
  167.     sFormElements["g1ufunc"].value = '(2-r)*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(2-r)*s*t-0.01';
  168.     sFormElements["Hfunc"].value = 's*t*(x+y)';
  169.     sFormElements["Glfunc"].value = 'sqrt(F)';
  170.     sFormElements["Gufunc"].value = 'sqrt(F)';
  171.     sFormElements["Flfunc"].value = 'r*E^(s+t)';
  172.     sFormElements["Fufunc"].value = '(2-r)*E^(s+t)';
  173.     sFormElements["avalue"].value = '0';
  174.     sFormElements["bvalue"].value = '1';
  175.     sFormElements["cvalue"].value = '0';
  176.     sFormElements["dvalue"].value = '1';
  177.     sFormElements["lvalue"].value = '1';
  178.     sFormElements["mvalue"].value = '5';
  179.     sFormElements["nvalue"].value = '10';
  180.     sFormElements["npvalue"].value = '10';
  181.     sFormElements["rvalue"].value = '0.5';
  182.     sFormElements["s0value"].value = '0.5';
  183.     sFormElements["t0value"].value = '0.5';
  184.     break;
  185.     case 'Sample3':
  186.     sFormElements["glfunc"].value = '(3+r)*s*t*t-(2/15)*s*s*t*sqrt(3+r)';
  187.     sFormElements["gufunc"].value = '(5-r)*s*t*t-(2/15)*s*s*t*sqrt(5-r)';
  188.     sFormElements["g1lfunc"].value = '(3+r)*s*t*t-(2/15)*s*s*t*sqrt(3+r)+0.001';
  189.     sFormElements["g1ufunc"].value = '(5-r)*s*t*t-(2/15)*s*s*t*sqrt(5-r)+0.001';
  190.     sFormElements["Hfunc"].value = 's*s*t*x*y';
  191.     sFormElements["Glfunc"].value = 'sqrt(F)';
  192.     sFormElements["Gufunc"].value = 'sqrt(F)';
  193.     sFormElements["Flfunc"].value = '(3+r)*s*t*t';
  194.     sFormElements["Fufunc"].value = '(5-r)*s*t*t';
  195.     sFormElements["avalue"].value = '0';
  196.     sFormElements["bvalue"].value = '1';
  197.     sFormElements["cvalue"].value = '0';
  198.     sFormElements["dvalue"].value = '1';
  199.     sFormElements["lvalue"].value = '1';
  200.     sFormElements["mvalue"].value = '5';
  201.     sFormElements["nvalue"].value = '10';
  202.     sFormElements["npvalue"].value = '10';
  203.     sFormElements["rvalue"].value = '0.5';
  204.     sFormElements["s0value"].value = '0.5';
  205.     sFormElements["t0value"].value = '0.5';
  206.     break;
  207.     case 'Sample4':
  208.     sFormElements["glfunc"].value = '1+2*t/3+s/2+(r-1)/2-(s*t*103/96+s*t*(r-1)/8+(r-1)/128+17/576)';
  209.     sFormElements["gufunc"].value = '1+2*t/3+s/2+(1-r)/2-(s*t*103/96+s*t*(1-r)/8+(1-r)/128+17/576)';
  210.     sFormElements["g1lfunc"].value = '1+2*t/3+s/2+(r-1)/2-(s*t*103/96+s*t*(r-1)/8+(r-1)/128+17/576)+0.5';
  211.     sFormElements["g1ufunc"].value = '1+2*t/3+s/2+(1-r)/2-(s*t*103/96+s*t*(1-r)/8+(1-r)/128+17/576)-0.5';
  212.     sFormElements["Hfunc"].value = 's*t+x*y';
  213.     sFormElements["Glfunc"].value = 'F';
  214.     sFormElements["Gufunc"].value = 'F';
  215.     sFormElements["Flfunc"].value = '1+2*t/3+s/2+(r-1)/2';
  216.     sFormElements["Fufunc"].value = '1+2*t/3+s/2+(1-r)/2';
  217.     sFormElements["avalue"].value = '0';
  218.     sFormElements["bvalue"].value = '0.5';
  219.     sFormElements["cvalue"].value = '0';
  220.     sFormElements["dvalue"].value = '0.5';
  221.     sFormElements["lvalue"].value = '1';
  222.     sFormElements["mvalue"].value = '5';
  223.     sFormElements["nvalue"].value = '10';
  224.     sFormElements["npvalue"].value = '10';
  225.     sFormElements["rvalue"].value = '0.5';
  226.     sFormElements["s0value"].value = '0.5';
  227.     sFormElements["t0value"].value = '0.5';
  228.     break;
  229.     default: alert('Wrong Sample Number!'); return;
  230.     }
  231. */ 
  232. // prepare for calculation - reset messages
  233.     // document.getElementById("ErrorLabel").textContent = 'Loaded article sample function ('+SampleNumber+')...';
  234.     document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
  235.     document.getElementById('animated-result').style.display = 'none'; // hide results  document.getElementById("ResultLabel1").innerHTML = '';
  236.     document.getElementById("ResultLabel2").innerHTML = '';
  237.     document.getElementById("ResultsErrors").innerHTML = '';
  238.     document.getElementById("ResultsValues").innerHTML = '';
  239. }
  240.  
  241. function myFixed(p1, p2){ // our formatting routine - input p1 - output formatted as toFixed
  242.                           // but if the number is .00 do not add .00
  243.     if (Math.trunc(p1)==p1)
  244.         { return p1; }
  245.     else
  246.         { return p1.toFixed(p2); }
  247. }
  248.  
  249. function StartCalc() // using setTimeout to refresh message before starting calculations
  250. {
  251.     document.getElementById("ErrorLabel").textContent = 'Calculating...';
  252.     document.getElementById('animated-result').style.display = 'none'; // hide results
  253.     window.setTimeout(Calc, 100);
  254. }
  255.  
  256. function Calc() // main calculation routine
  257. {try {
  258.  
  259.     Calculated = false; // flag - not yet calculated
  260.    
  261.     // Get the initial values from the user's input
  262.  
  263.     var MaxIterations = 100; // 100 points at least with results
  264.        
  265.     // input fields
  266.     // functions
  267.     var glx = sFormElements['glfunc'].value;
  268.     var gux = sFormElements['gufunc'].value;
  269.     var g1lx = sFormElements['g1lfunc'].value;
  270.     var g1ux = sFormElements['g1ufunc'].value;
  271.     var Hx  = sFormElements['Hfunc'].value;
  272.     var Glx = sFormElements['Glfunc'].value;
  273.     var Gux = sFormElements['Gufunc'].value;
  274.     var Flx = sFormElements['Flfunc'].value;
  275.     var Fux = sFormElements['Fufunc'].value;
  276.        
  277.     // validate for not empty
  278.     if (glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>-</sub> can not be empty!'; return; }
  279.     if (gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>+</sub> can not be empty!'; return; }
  280.     if (g1lx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>1-</sub> can not be empty!'; return; }
  281.     if (g1ux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>1+</sub> can not be empty!'; return; }
  282.     if (Hx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H can not be empty!'; return; }
  283.     if (Glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>-</sub> can not be empty!'; return; }
  284.     if (Gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>+</sub> can not be empty!'; return; }
  285.     if (Flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>-</sub> can not be empty!'; return; }
  286.     if (Fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>+</sub> can not be empty!'; return; }
  287.     // constants validate for not empty
  288.     if (sFormElements['avalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant a can not be empty!'; return; }
  289.     if (sFormElements['bvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant b can not be empty!'; return; }
  290.     if (sFormElements['cvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant c can not be empty!'; return; }
  291.     if (sFormElements['dvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant d can not be empty!'; return; }
  292.     if (sFormElements['lvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant &#955; can not be empty!'; return; }
  293.     if (sFormElements['mvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant m; can not be empty!'; return; }
  294.     if (sFormElements['nvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n can not be empty!'; return; }
  295.     if (sFormElements['npvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n&#39; can not be empty!'; return; }
  296.     if (sFormElements['rvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant r can not be empty!'; return; }
  297.     if (sFormElements['s0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> can not be empty!'; return; }
  298.     if (sFormElements['t0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> can not be empty!'; return; }
  299.     // validate constants for correct number
  300.     a = (sFormElements['avalue'].value != '') ? parseFloat(sFormElements['avalue'].value) : 0.0;
  301.     b = (sFormElements['bvalue'].value != '') ? parseFloat(sFormElements['bvalue'].value) : 0.0;
  302.     c = (sFormElements['cvalue'].value != '') ? parseFloat(sFormElements['cvalue'].value) : 0.0;
  303.     d = (sFormElements['dvalue'].value != '') ? parseFloat(sFormElements['dvalue'].value) : 0.0;
  304.     lambda = (sFormElements['lvalue'].value != '') ? parseFloat(sFormElements['lvalue'].value) : 0.0;
  305.     mv = (sFormElements['mvalue'].value != '') ? parseInt(sFormElements['mvalue'].value) : 0;
  306.     n = (sFormElements['nvalue'].value != '') ? parseInt(sFormElements['nvalue'].value) : 0;
  307.     np = (sFormElements['npvalue'].value != '') ? parseInt(sFormElements['npvalue'].value) : 0;
  308.     r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
  309.     s0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['s0value'].value) : 0.0;
  310.     t0 = (sFormElements['t0value'].value != '') ? parseFloat(sFormElements['t0value'].value) : 0.0;
  311.     // validity check - ranges or NaN
  312.     if (isNaN(a)) { document.getElementById("ErrorLabel").innerHTML = 'a value error!'; return; }
  313.     if (isNaN(b)) { document.getElementById("ErrorLabel").innerHTML = 'b value error!'; return; }
  314.     if (isNaN(c)) { document.getElementById("ErrorLabel").innerHTML = 'c value error!'; return; }
  315.     if (isNaN(d)) { document.getElementById("ErrorLabel").innerHTML = 'd value error!'; return; }
  316.     if (isNaN(lambda)) { document.getElementById("ErrorLabel").innerHTML = '&#955; value error!'; return; }
  317.     if (isNaN(mv)) { document.getElementById("ErrorLabel").innerHTML = 'm value error!'; return; }
  318.     if (isNaN(n)) { document.getElementById("ErrorLabel").innerHTML = 'n value error!'; return; }
  319.     if (isNaN(np)) { document.getElementById("ErrorLabel").innerHTML = 'n&#39; value error!'; return; } //
  320.     if (isNaN(r)) { document.getElementById("ErrorLabel").innerHTML = 'r value error!'; return; }
  321.     if ( a >= b) { document.getElementById("ErrorLabel").innerHTML = 'a is not less than b error!'; return; }
  322.     if ( c >= d) { document.getElementById("ErrorLabel").innerHTML = 'c is not less than d error!'; return; }
  323.     if (lambda == 0) { document.getElementById("ErrorLabel").innerHTML = '&#955; cannot be zero error!'; return; }
  324.     if ( mv <= 0) { document.getElementById("ErrorLabel").innerHTML = 'm must be greater than 0 error!'; return; }
  325.     if ( mv > MaxIterations) { document.getElementById("ErrorLabel").innerHTML = 'm must be lower than '+MaxIterations+' error!'; return; }
  326.     if ( n <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n must be greater than 2 error!'; return; }
  327.     if ( np <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n&#39; must be greater than 2 error!'; return; }
  328.     if ( r < 0 || r > 1) { document.getElementById("ErrorLabel").innerHTML = 'r must be between 0 and 1 error!'; return; }
  329.     if (isNaN(s0)) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> value error!'; return; }
  330.     if (isNaN(t0)) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> value error!'; return; }
  331.     if ( s0 < a || s0 > b) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> must be between a and b error!'; return; }
  332.     if ( t0 < c || t0 > d) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> must be between c and d error!'; return; }   
  333.                  
  334.     // start calcualtions
  335.    
  336.     // Step 0 - set the variables and initial values
  337.  
  338.     var sigma = (b-a)/n; // step for points x-axis
  339.     var sigmaprim = (d-c)/np; // step for points y-axis
  340.     var D; // error (Distance between iterations and/or exact solution)
  341.    
  342.     // create arrays (matrices and vectors)
  343.  
  344.     Fl = new Array(n+1); // F*- exact array lower
  345.     for (var i = 0; i <= n; i++) { Fl[i] = new Array(np+1); }  
  346.     Fu = new Array(n+1); // F*+ exact array upper
  347.     for (var i = 0; i <= n; i++) { Fu[i] = new Array(np+1); }  
  348.    
  349.     Fml = new Array(MaxIterations+1); // Fml[0..iter][0..n][0..np] - lower trapezoidal array
  350.     for (var i = 0; i <= MaxIterations; i++) {
  351.         Fml[i] = new Array(n+1);
  352.         for (var j = 0; j <= n; j++) { Fml[i][j] = new Array(np+1); }  
  353.     }
  354.  
  355.     Fmu = new Array(MaxIterations+1); // Fmu[0..iter][0..n][0..np] - upper trapezoidal array
  356.     for (var i = 0; i <= MaxIterations; i++) {
  357.         Fmu[i] = new Array(n+1);
  358.         for (var j = 0; j <= n; j++) { Fmu[i][j] = new Array(np+1); }
  359.     }  
  360.    
  361.     F0ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower trapezioid at point (s0,t0)
  362.     F0mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper trapezioid at point (s0,t0)
  363.    
  364.     // F1m - for g1 func
  365.     F1ml = new Array(MaxIterations+1); // F1ml[0..iter][0..n][0..np] - lower trapezoidal array g1
  366.     for (var i = 0; i <= MaxIterations; i++) {
  367.         F1ml[i] = new Array(n+1);
  368.         for (var j = 0; j <= n; j++) { F1ml[i][j] = new Array(np+1); } 
  369.     }
  370.  
  371.     F1mu = new Array(MaxIterations+1); // F1mu[0..iter][0..n][0..np] - upper trapezoidal array g1
  372.     for (var i = 0; i <= MaxIterations; i++) {
  373.         F1mu[i] = new Array(n+1);
  374.         for (var j = 0; j <= n; j++) { F1mu[i][j] = new Array(np+1); }
  375.     }  
  376.    
  377.     F10ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower trapezioid at point (s0,t0) for g1
  378.     F10mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper trapezioid at point (s0,t0) for g1
  379.    
  380.     var e0l; var e0u; // error between iteration and exact solution at point (s0,t0)
  381.    
  382.     var el = new Array(n+1); // err-  approx - exact for trapez
  383.     for (var i = 0; i <= n; i++) { el[i] = new Array(np+1); }
  384.     var eu = new Array(n+1); // err+  approx - exact for trapez
  385.     for (var i = 0; i <= n; i++) { eu[i] = new Array(np+1); }
  386.  
  387.     // arrays for vaues of the points coordinates - network points
  388.     s = new Array(n+1); // s(i)
  389.     t = new Array(np+1); // t(j)
  390.  
  391.     // calculate values of arrays of network points coordinates
  392.     for (var i = 0; i <= n; i++) { s[i] = a + i*sigma; }
  393.     for (var i = 0; i <= np; i++) { t[i] = c + i*sigmaprim; }
  394.        
  395.     m = 0; // keep m < MaxIterations - m is trapezoidal current step number
  396.        
  397.     // parse the functions once, outside of the loops
  398.     var Pglx = Parser.parse(glx);
  399.     var Pgux = Parser.parse(gux);
  400.     var Pg1lx = Parser.parse(g1lx);
  401.     var Pg1ux = Parser.parse(g1ux);
  402.     var PHx = Parser.parse(Hx);
  403.     var PGlx = Parser.parse(Glx);
  404.     var PGux = Parser.parse(Gux);
  405.     var PFlx = Parser.parse(Flx);
  406.     var PFux = Parser.parse(Fux);
  407.  
  408.     // Step 1 - Fm F1m m=0 initial values for network points - preliminary step
  409.     for (var i = 0; i <= n; i++) {  // trapezoid
  410.         for (var j = 0; j <= np; j++) {
  411.             Fml[0][i][j] = Pglx.evaluate({s: s[i], t: t[j], r: r});
  412.             Fmu[0][i][j] = Pgux.evaluate({s: s[i], t: t[j], r: r});
  413.             F1ml[0][i][j] = Pg1lx.evaluate({s: s[i], t: t[j], r: r});
  414.             F1mu[0][i][j] = Pg1ux.evaluate({s: s[i], t: t[j], r: r});
  415.         }
  416.     }
  417.    
  418.     // initial values at (s0,t0) trapezoid
  419.     F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
  420.     F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
  421.     F10ml[0] = Pg1lx.evaluate({s: s0, t: t0, r: r});
  422.     F10mu[0] = Pg1ux.evaluate({s: s0, t: t0, r: r});
  423.    
  424.     m = 0; // will be +1
  425.    
  426.     // Step 2 (the generic iterative step)
  427.    
  428.     // trapezoid - loop through all points of the n x np matrix - see the formulaes in the article
  429.     do {
  430.         m = m+1; // next iteration for trapezoidal
  431.         if ( m > MaxIterations ) { // check for posible endless loop
  432.             document.getElementById("ErrorLabel").innerHTML = "Iterations trapezoid exceeded "+MaxIterations+"! Stopped!";
  433.             alert("Iterations trapezoid exceeded "+MaxIterations+"! Stopped!");
  434.             return;
  435.         }
  436.        
  437.         // loop through all points of the n x np matrix - see the formulaes in the article
  438.        
  439.         // for g function
  440.         for (var i = 0; i <= n; i++) {
  441.             for (var j = 0; j <= np; j++) {
  442.                 var sl = 0;  var su = 0;
  443.                 for (var k = 0; k <= n-1; k++) {
  444.                     for (var p = 0; p <= np-1; p++) {
  445.                         sl = sl +
  446.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  447.                             *
  448.                             PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  449.                         +
  450.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  451.                             *
  452.                             PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  453.    
  454.                     +  
  455.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  456.                             *
  457.                             PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  458.                         +
  459.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  460.                             *
  461.                             PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  462.                         su = su +
  463.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  464.                             *
  465.                             PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  466.                         +
  467.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  468.                             *
  469.                             PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  470.                         +  
  471.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  472.                             *
  473.                             PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  474.                         +
  475.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  476.                             *
  477.                             PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  478.                     }
  479.                 }
  480.                 Fml[m][i][j] = Fml[0][i][j] + (sigma*sigmaprim/4)*sl*lambda;
  481.                 Fmu[m][i][j] = Fmu[0][i][j] + (sigma*sigmaprim/4)*su*lambda;
  482.                 // check for NaN - possible errors (divide by zero or over/under-flows)
  483.                 if (isNaN(Fml[m][i][j])) {
  484.                     document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  485.                     return;
  486.                 }
  487.                 if (isNaN(Fmu[m][i][j])) {
  488.                     document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at point ("+i+","+j+").";
  489.                     return;
  490.                 }
  491.             }
  492.         }
  493.         // F0[m] // at point (s0,t0)
  494.         var s0l = 0; var s0u = 0;
  495.         for (var k = 0; k <= n-1; k++) {
  496.             for (var p = 0; p <= np-1; p++) {
  497.                 s0l = s0l +
  498.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  499.                     *
  500.                     PGlx.evaluate({F: Fml[m-1][k][p], r: r})
  501.                 +
  502.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  503.                     *
  504.                     PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
  505.                 +  
  506.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  507.                     *
  508.                     PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
  509.                 +
  510.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  511.                     *
  512.                     PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
  513.                 s0u = s0u +
  514.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  515.                     *
  516.                     PGux.evaluate({F: Fmu[m-1][k][p], r: r})
  517.                 +
  518.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  519.                     *
  520.                     PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
  521.                 +  
  522.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  523.                     *
  524.                     PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
  525.                 +
  526.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  527.                     *
  528.                     PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});                      
  529.             }
  530.         }
  531.         F0ml[m] = F0ml[0] + (sigma*sigmaprim/4)*s0l*lambda;
  532.         F0mu[m] = F0mu[0] + (sigma*sigmaprim/4)*s0u*lambda;
  533.         // check for NaN - possible errors (divide by zero or over/under-flows)
  534.         if (isNaN(F0ml[m])) {
  535.             document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  536.             return;
  537.         }
  538.         if (isNaN(F0mu[m])) {
  539.             document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  540.             return;
  541.         }
  542.    
  543.         // for g1 function
  544.         for (var i = 0; i <= n; i++) {
  545.             for (var j = 0; j <= np; j++) {
  546.                 var s1l = 0;  var s1u = 0;
  547.                 for (var k = 0; k <= n-1; k++) {
  548.                     for (var p = 0; p <= np-1; p++) {
  549.                         s1l = s1l +
  550.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  551.                             *
  552.                             PGlx.evaluate({F: F1ml[m-1][k][p], r: r})
  553.                         +
  554.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  555.                             *
  556.                             PGlx.evaluate({F: F1ml[m-1][k][p+1], r: r})
  557.                         +  
  558.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  559.                             *
  560.                             PGlx.evaluate({F: F1ml[m-1][k+1][p], r: r})
  561.                         +
  562.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  563.                             *
  564.                             PGlx.evaluate({F: F1ml[m-1][k+1][p+1], r: r});
  565.                         s1u = s1u +
  566.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
  567.                             *
  568.                             PGux.evaluate({F: F1mu[m-1][k][p], r: r})
  569.                         +
  570.                             PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
  571.                             *
  572.                             PGux.evaluate({F: F1mu[m-1][k][p+1], r: r})
  573.                         +  
  574.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
  575.                             *
  576.                             PGux.evaluate({F: F1mu[m-1][k+1][p], r: r})
  577.                         +
  578.                             PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
  579.                             *
  580.                             PGux.evaluate({F: F1mu[m-1][k+1][p+1], r: r});                     
  581.                     }
  582.                 }
  583.                 F1ml[m][i][j] = Fml[0][i][j] + (sigma*sigmaprim/4)*s1l*lambda;
  584.                 F1mu[m][i][j] = Fmu[0][i][j] + (sigma*sigmaprim/4)*s1u*lambda;
  585.                 // check for NaN - possible errors (divide by zero or over/under-flows)
  586.                 if (isNaN(F1ml[m][i][j])) {
  587.                     document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error g1 in iteration "+m+" at point ("+i+","+j+").";
  588.                     return;
  589.                 }
  590.                 if (isNaN(F1mu[m][i][j])) {
  591.                     document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error g1 in iteration "+m+" at point ("+i+","+j+").";
  592.                     return;
  593.                 }
  594.             }
  595.         }
  596.         // F10[m] // at point (s0,t0)
  597.         var s10l = 0; var s10u = 0;
  598.         for (var k = 0; k <= n-1; k++) {
  599.             for (var p = 0; p <= np-1; p++) {
  600.                 s10l = s10l +
  601.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  602.                     *
  603.                     PGlx.evaluate({F: F1ml[m-1][k][p], r: r})
  604.                 +
  605.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  606.                     *
  607.                     PGlx.evaluate({F: F1ml[m-1][k][p+1], r: r})
  608.                 +  
  609.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  610.                     *
  611.                     PGlx.evaluate({F: F1ml[m-1][k+1][p], r: r})
  612.                 +
  613.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  614.                     *
  615.                     PGlx.evaluate({F: F1ml[m-1][k+1][p+1], r: r});
  616.                 s10u = s10u +
  617.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
  618.                     *
  619.                     PGux.evaluate({F: F1mu[m-1][k][p], r: r})
  620.                 +
  621.                     PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
  622.                     *
  623.                     PGux.evaluate({F: F1mu[m-1][k][p+1], r: r})
  624.                 +  
  625.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
  626.                     *
  627.                     PGux.evaluate({F: F1mu[m-1][k+1][p], r: r})
  628.                 +
  629.                     PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
  630.                     *
  631.                     PGux.evaluate({F: F1mu[m-1][k+1][p+1], r: r});                     
  632.             }
  633.         }
  634.         F10ml[m] = F0ml[0] + (sigma*sigmaprim/4)*s10l*lambda;
  635.         F10mu[m] = F0mu[0] + (sigma*sigmaprim/4)*s10u*lambda;
  636.         // check for NaN - possible errors (divide by zero or over/under-flows)
  637.         if (isNaN(F10ml[m])) {
  638.             document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error g1 in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  639.             return;
  640.         }
  641.         if (isNaN(F10mu[m])) {
  642.             document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error g1 in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
  643.             return;
  644.         }
  645.    
  646.     } while ( (m < mv) && (m < MaxIterations) ); // stop if mv is reached or iterations exceeded
  647.     // possible also check m is reasonable to avoid endless looping if no convergence
  648.     if ( m >= MaxIterations )
  649.     {
  650.         document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!";
  651.         alert("Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!");
  652.         return;
  653.     }
  654.  
  655.     // calculate lower-upper exact value at point (s0,t0)
  656.     var F0l = PFlx.evaluate({s: s0, t: t0, r: r});
  657.     var F0u = PFux.evaluate({s: s0, t: t0, r: r});
  658.    
  659.     Calculated = m > 1; // flag for completion
  660.    
  661.     document.getElementById("ErrorLabel").textContent = 'Done calculations!';
  662.  
  663.     // draw a tables with results
  664.  
  665.     // errors table string (innerHTML)
  666.     // toExponential(2)
  667.     var FormattingErrors = sFormElements["FormattingErrors"].value;
  668.     var e1; var e2; var e3; var e4;
  669.     var errors ='<caption>Errors at iterations for (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><th>dg1<sub>m-</sub></th><th>dg1<sub>m+</sub></th></th></tr>';
  670.     for (var i = 0; i <= m; i++) {
  671.         e1 = Math.abs(F0l-F0ml[i]);
  672.         e2 = Math.abs(F0u-F0mu[i]);
  673.         e3 = Math.abs(F0ml[i]-F10ml[i]);
  674.         e4 = Math.abs(F0mu[i]-F10mu[i]);
  675.         if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
  676.             e1 = e1.toExponential(eval(FormattingErrors));
  677.             e2 = e2.toExponential(eval(FormattingErrors));
  678.             e3 = e3.toExponential(eval(FormattingErrors));
  679.             e4 = e4.toExponential(eval(FormattingErrors));
  680.         }
  681.         errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td>';
  682.         errors+='<td>'+e3+'</td><td>'+e4+'</td></tr>';
  683.     }
  684.    
  685.     // values table string (innerHTML)
  686.     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>F1c<sub>m-</sub></th><th>F1c<sub>m+</sub></th></tr>';
  687.     for (var i = 0; i <= m; i++) {
  688.         values+='<tr><td>'+i+'</td><td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';
  689.         values+='<td>'+F10ml[i]+'</td><td>'+F10mu[i]+'</td></tr>';
  690.     }
  691.  
  692.     // show the info and tables
  693.     document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for n='+n+', n&#39;='+np+', r='+r.toFixed(2)+' (iterations: m='+m+' classical)</center>';
  694.     document.getElementById("ResultsErrors").innerHTML = errors;
  695.     document.getElementById("ResultsValues").innerHTML = values;
  696.     //
  697.     document.getElementById("ErrorLabel").textContent = 'Done calculation...';
  698.     document.getElementById("ResultLabel2").innerHTML = '';
  699.     document.getElementById('animated-result').style.display = ''; // show the result
  700.    
  701. } // catch the error and show the eror message (debug information)
  702. catch(err) {
  703.     var vDebug = "";
  704.     var el = err.lineNumber;
  705.     for (var prop in err)
  706.     {  
  707.        vDebug += "property: "+ prop+ " ["+ err[prop]+ "], ";
  708.     }
  709.     vDebug += "[" + err.toString() + "]";
  710.     if ( !(el === undefined) ) { vDebug += ", on line " + el; }
  711.     document.getElementById('animated-result').style.display = 'none'; // hide result
  712.     document.getElementById("ErrorLabel").textContent = 'Error: ' + err.message +
  713.       ' ' + vDebug;
  714.     }  
  715. }
  716. </script>
  717. </p>
  718. </body>
  719. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement