Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"**/
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html>
- <title>Web-based 2D Fredholm equations</title>
- <meta name="Description" content="Web-based 2D nonlinear Fredholm fuzzy integral equations solver" />
- <meta name="Keywords" content="two-dimmensional nonlinear fuzzy integral equation, Fredholm, solver, numerical method, approximate method, iterative method" />
- <meta name="Author" content="Svetoslav Enkov. Atanaska Georgieva, Albena Pavlova" />
- <meta charset="UTF-8" />
- <head>
- <link href="solver.css" type="text/css" rel="stylesheet">
- </head>
- <body>
- <p align="center" style="font-size: 150%">Error estimate of 2D nonlinear Fredholm fuzzy integral equations</p>
- <form name="EvalForm" id="EvalCalc" action="" method="post" novalidate="novalidate" scrolling="yes">
- <div id="Formulaes">
- <p> g<sub>-</sub>(s,t,r) = <input name="glfunc" value="" type="text" size=115></p>
- <p> g<sub>+</sub>(s,t,r) = <input name="gufunc" value="" type="text" size=115></p>
- <p> g<sub>1-</sub>(s,t,r) = <input name="g1lfunc" value="" type="text" size=115></p>
- <p> g<sub>1+</sub>(s,t,r) = <input name="g1ufunc" value="" type="text" size=115></p>
- <p> H(s,t,x,y) = <input name="Hfunc" value="" type="text" size=115></p>
- <p> G<sub>-</sub>(F,r) = <input name="Glfunc" value="" type="text" size=115></p>
- <p> G<sub>+</sub>(F,r) = <input name="Gufunc" value="" type="text" size=115></p>
- <p> F*<sub>-</sub>(s,t,r) = <input name="Flfunc" value="" type="text" size=115></p>
- <p> F*<sub>+</sub>(s,t,r) = <input name="Fufunc" value="" type="text" size=115></p>
- <p> a =<input name="avalue" value="" type="text" size=6>
- b =<input name="bvalue" value="" type="text" size=6>
- c =<input name="cvalue" value="" type="text" size=6>
- d =<input name="dvalue" value="" type="text" size=6>
- λ =<input name="lvalue" value="" type="text" size=6>
- m =<input name="mvalue" value="" type="text" size=3>
- n =<input name="nvalue" value="" type="text" size=4>
- n' =<input name="npvalue" value="" type="text" size=4>
- r =<input name="rvalue" value="" type="text" size=6>
- </p>
- <p> s<sub>0</sub> =<input name="s0value" value="" type="text" size=6>
- t<sub>0</sub> =<input name="t0value" value="" type="text" size=6>
- </p>
- </div>
- <p><span align='left'> <input name = "CalcButton" value="Calculate" type="button" title="Calculate" onclick="StartCalc();"> <span id="ErrorLabel">
- </span></p>
- <p align='right'>
- <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">
- <!-- multiple samples version (testing)
- <select name='SampleNumber'>
- <option value="Sample1">Sample 1</option>
- <option value="Sample2">Sample 2</option>
- <option value="Sample3">Sample 3</option>
- <option value="Sample4">Sample 4</option>
- </select> -->
- Error output:
- <select name='FormattingErrors'>
- <option value="-1">Normal</option>
- <option value="0">Exponential 0</option>
- <option value="1">Exponential 1</option>
- <option value="2">Exponential 2</option>
- <option value="3">Exponential 3</option>
- <option value="4">Exponential 4</option>
- <option value="5">Exponential 5</option>
- <option value="6">Exponential 6</option>
- </select>
- </p>
- <div id="animated-result" class="animated fadeInLeft" align="center" style="display:none">
- <span id="ResultLabel1"></span><br>
- <span id="ResultLabel2"></span>
- <table id="ResultsErrors" class="ResultTable"></table><br>
- <table id="ResultsValues" class="ResultTable"></table><br>
- </div>
- <div style='font-family: "Times New Roman", Times, serif;'> Note: use E instead of e, PI instead of π, ^ for power, sqrt for √, etc...</div>
- </div>
- <!-- will be enabled later with the actual article PDF
- <div><a href=
- "article.pdf" target="_blank"><img src="pdf-download-icon.png" alt="Read entire article in PDF" style="width:291px;height:92px;border:0;">
- </a>
- </div>
- -->
- </form>
- <script src="lib/parser.js" type="text/javascript"></script>
- <script type="text/javascript">
- // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
- // - please use old version, not new ECMAScript 6 version
- // Copyright (c)2017 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, Albena Pavlova, freeware, public domain
- // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg, afi2000@abv.bg
- // Techical University of Sofia, branch Plovdiv, Faculty of Mechanical Engineering. akosseva@gmail.com
- // This software is published at http://enkov.com/solver2DFErr
- // The source is available at pastebin https://pastebin.com/VscfecC8
- //
- // in print Communications in Applied Analysis - Svetoslav Nenov
- // http://www.dynamicpublishers.org/journals/index.php/CAA
- // A. Georgieva, A. Pavlova, S.Enkov: Quadrature Rules And Iterative Numerical Method For Two-Dimensional Nonlinear Fredholm Fuzzy Integral Equations
- var sFormElements = document.forms["EvalForm"].elements; // for accessing DOM elements of the form/page
- var Calculated = false; // flag for completion
- // predefined global forwards to be viewable outside a calculation routine
- var n; var np; // n x np matrices
- var mv; // m value (to not mess with m iteration counter)
- var r;
- var a; var b; var c; var d; // intervals x/y
- var Fml; var Fmu; // iteration's arrays for trapezoid
- var Fl; var Fu; // exact values F* calculated by net, lower/upper
- var m; // current iteration classic
- var s; var t; // s, t arrays of points classic
- var lambda; // coefficient for correction
- var s0; var t0; // calculation point
- var F0ml; var F0mu; // F(s0,t0) values values at the calculation point
- function Sample() // preloads sample values for fast evaluation of the algorithm
- {
- // article sample
- sFormElements["glfunc"].value = '(4+r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(4+r)';
- sFormElements["gufunc"].value = '(6-r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(6-r)';
- sFormElements["g1lfunc"].value = '(4+r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(4+r)+0.1';
- sFormElements["g1ufunc"].value = '(6-r)*E^(2*s+2*t)-2*s*s*t*t*(E-1)*sqrt(6-r)-0.1';
- sFormElements["Hfunc"].value = 's*s*t*t*(x+y)';
- sFormElements["Glfunc"].value = 'sqrt(F)';
- sFormElements["Gufunc"].value = 'sqrt(F)';
- sFormElements["Flfunc"].value = '(4+r)*E^(2*s+2*t)';
- sFormElements["Fufunc"].value = '(6-r)*E^(2*s+2*t)';
- sFormElements["avalue"].value = '0';
- sFormElements["bvalue"].value = '1';
- sFormElements["cvalue"].value = '0';
- sFormElements["dvalue"].value = '1';
- sFormElements["lvalue"].value = '1';
- sFormElements["mvalue"].value = '5';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- /* old samples
- var SampleNumber = sFormElements["SampleNumber"].value;
- switch (SampleNumber) {
- case 'Sample1':
- sFormElements["glfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t';
- sFormElements["gufunc"].value = '(4-r)*s*t-(1/16)*(4-r)*(4-r)*s*t';
- sFormElements["g1lfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t+0.1';
- sFormElements["g1ufunc"].value = '(4-r)*s*t-(1/16)*(4-r)*(4-r)*s*t-0.1';
- sFormElements["Hfunc"].value = 's*x*t*y';
- sFormElements["Glfunc"].value = 'F*F';
- sFormElements["Gufunc"].value = 'F*F';
- sFormElements["Flfunc"].value = '(2+r)*s*t';
- sFormElements["Fufunc"].value = '(4-r)*s*t';
- sFormElements["avalue"].value = '0';
- sFormElements["bvalue"].value = '1';
- sFormElements["cvalue"].value = '0';
- sFormElements["dvalue"].value = '1';
- sFormElements["lvalue"].value = '1';
- sFormElements["mvalue"].value = '5';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- break;
- case 'Sample2':
- sFormElements["glfunc"].value = 'r*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(r)*s*t';
- sFormElements["gufunc"].value = '(2-r)*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(2-r)*s*t';
- sFormElements["g1lfunc"].value = 'r*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(r)*s*t+0.01';
- sFormElements["g1ufunc"].value = '(2-r)*E^(s+t)+8*(2-3*sqrt(E)+E)*sqrt(2-r)*s*t-0.01';
- sFormElements["Hfunc"].value = 's*t*(x+y)';
- sFormElements["Glfunc"].value = 'sqrt(F)';
- sFormElements["Gufunc"].value = 'sqrt(F)';
- sFormElements["Flfunc"].value = 'r*E^(s+t)';
- sFormElements["Fufunc"].value = '(2-r)*E^(s+t)';
- sFormElements["avalue"].value = '0';
- sFormElements["bvalue"].value = '1';
- sFormElements["cvalue"].value = '0';
- sFormElements["dvalue"].value = '1';
- sFormElements["lvalue"].value = '1';
- sFormElements["mvalue"].value = '5';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- break;
- case 'Sample3':
- sFormElements["glfunc"].value = '(3+r)*s*t*t-(2/15)*s*s*t*sqrt(3+r)';
- sFormElements["gufunc"].value = '(5-r)*s*t*t-(2/15)*s*s*t*sqrt(5-r)';
- sFormElements["g1lfunc"].value = '(3+r)*s*t*t-(2/15)*s*s*t*sqrt(3+r)+0.001';
- sFormElements["g1ufunc"].value = '(5-r)*s*t*t-(2/15)*s*s*t*sqrt(5-r)+0.001';
- sFormElements["Hfunc"].value = 's*s*t*x*y';
- sFormElements["Glfunc"].value = 'sqrt(F)';
- sFormElements["Gufunc"].value = 'sqrt(F)';
- sFormElements["Flfunc"].value = '(3+r)*s*t*t';
- sFormElements["Fufunc"].value = '(5-r)*s*t*t';
- sFormElements["avalue"].value = '0';
- sFormElements["bvalue"].value = '1';
- sFormElements["cvalue"].value = '0';
- sFormElements["dvalue"].value = '1';
- sFormElements["lvalue"].value = '1';
- sFormElements["mvalue"].value = '5';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- break;
- case 'Sample4':
- 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)';
- 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)';
- 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';
- 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';
- sFormElements["Hfunc"].value = 's*t+x*y';
- sFormElements["Glfunc"].value = 'F';
- sFormElements["Gufunc"].value = 'F';
- sFormElements["Flfunc"].value = '1+2*t/3+s/2+(r-1)/2';
- sFormElements["Fufunc"].value = '1+2*t/3+s/2+(1-r)/2';
- sFormElements["avalue"].value = '0';
- sFormElements["bvalue"].value = '0.5';
- sFormElements["cvalue"].value = '0';
- sFormElements["dvalue"].value = '0.5';
- sFormElements["lvalue"].value = '1';
- sFormElements["mvalue"].value = '5';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- break;
- default: alert('Wrong Sample Number!'); return;
- }
- */
- // prepare for calculation - reset messages
- // document.getElementById("ErrorLabel").textContent = 'Loaded article sample function ('+SampleNumber+')...';
- document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
- document.getElementById('animated-result').style.display = 'none'; // hide results document.getElementById("ResultLabel1").innerHTML = '';
- document.getElementById("ResultLabel2").innerHTML = '';
- document.getElementById("ResultsErrors").innerHTML = '';
- document.getElementById("ResultsValues").innerHTML = '';
- }
- function myFixed(p1, p2){ // our formatting routine - input p1 - output formatted as toFixed
- // but if the number is .00 do not add .00
- if (Math.trunc(p1)==p1)
- { return p1; }
- else
- { return p1.toFixed(p2); }
- }
- function StartCalc() // using setTimeout to refresh message before starting calculations
- {
- document.getElementById("ErrorLabel").textContent = 'Calculating...';
- document.getElementById('animated-result').style.display = 'none'; // hide results
- window.setTimeout(Calc, 100);
- }
- function Calc() // main calculation routine
- {try {
- Calculated = false; // flag - not yet calculated
- // Get the initial values from the user's input
- var MaxIterations = 100; // 100 points at least with results
- // input fields
- // functions
- var glx = sFormElements['glfunc'].value;
- var gux = sFormElements['gufunc'].value;
- var g1lx = sFormElements['g1lfunc'].value;
- var g1ux = sFormElements['g1ufunc'].value;
- var Hx = sFormElements['Hfunc'].value;
- var Glx = sFormElements['Glfunc'].value;
- var Gux = sFormElements['Gufunc'].value;
- var Flx = sFormElements['Flfunc'].value;
- var Fux = sFormElements['Fufunc'].value;
- // validate for not empty
- if (glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>-</sub> can not be empty!'; return; }
- if (gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>+</sub> can not be empty!'; return; }
- if (g1lx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>1-</sub> can not be empty!'; return; }
- if (g1ux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function g<sub>1+</sub> can not be empty!'; return; }
- if (Hx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H can not be empty!'; return; }
- if (Glx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>-</sub> can not be empty!'; return; }
- if (Gux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function G<sub>+</sub> can not be empty!'; return; }
- if (Flx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>-</sub> can not be empty!'; return; }
- if (Fux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function F*<sub>+</sub> can not be empty!'; return; }
- // constants validate for not empty
- if (sFormElements['avalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant a can not be empty!'; return; }
- if (sFormElements['bvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant b can not be empty!'; return; }
- if (sFormElements['cvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant c can not be empty!'; return; }
- if (sFormElements['dvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant d can not be empty!'; return; }
- if (sFormElements['lvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant λ can not be empty!'; return; }
- if (sFormElements['mvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant m; can not be empty!'; return; }
- if (sFormElements['nvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n can not be empty!'; return; }
- if (sFormElements['npvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant n' can not be empty!'; return; }
- if (sFormElements['rvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant r can not be empty!'; return; }
- if (sFormElements['s0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> can not be empty!'; return; }
- if (sFormElements['t0value'].value == '') { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> can not be empty!'; return; }
- // validate constants for correct number
- a = (sFormElements['avalue'].value != '') ? parseFloat(sFormElements['avalue'].value) : 0.0;
- b = (sFormElements['bvalue'].value != '') ? parseFloat(sFormElements['bvalue'].value) : 0.0;
- c = (sFormElements['cvalue'].value != '') ? parseFloat(sFormElements['cvalue'].value) : 0.0;
- d = (sFormElements['dvalue'].value != '') ? parseFloat(sFormElements['dvalue'].value) : 0.0;
- lambda = (sFormElements['lvalue'].value != '') ? parseFloat(sFormElements['lvalue'].value) : 0.0;
- mv = (sFormElements['mvalue'].value != '') ? parseInt(sFormElements['mvalue'].value) : 0;
- n = (sFormElements['nvalue'].value != '') ? parseInt(sFormElements['nvalue'].value) : 0;
- np = (sFormElements['npvalue'].value != '') ? parseInt(sFormElements['npvalue'].value) : 0;
- r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
- s0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['s0value'].value) : 0.0;
- t0 = (sFormElements['t0value'].value != '') ? parseFloat(sFormElements['t0value'].value) : 0.0;
- // validity check - ranges or NaN
- if (isNaN(a)) { document.getElementById("ErrorLabel").innerHTML = 'a value error!'; return; }
- if (isNaN(b)) { document.getElementById("ErrorLabel").innerHTML = 'b value error!'; return; }
- if (isNaN(c)) { document.getElementById("ErrorLabel").innerHTML = 'c value error!'; return; }
- if (isNaN(d)) { document.getElementById("ErrorLabel").innerHTML = 'd value error!'; return; }
- if (isNaN(lambda)) { document.getElementById("ErrorLabel").innerHTML = 'λ value error!'; return; }
- if (isNaN(mv)) { document.getElementById("ErrorLabel").innerHTML = 'm value error!'; return; }
- if (isNaN(n)) { document.getElementById("ErrorLabel").innerHTML = 'n value error!'; return; }
- if (isNaN(np)) { document.getElementById("ErrorLabel").innerHTML = 'n' value error!'; return; } //
- if (isNaN(r)) { document.getElementById("ErrorLabel").innerHTML = 'r value error!'; return; }
- if ( a >= b) { document.getElementById("ErrorLabel").innerHTML = 'a is not less than b error!'; return; }
- if ( c >= d) { document.getElementById("ErrorLabel").innerHTML = 'c is not less than d error!'; return; }
- if (lambda == 0) { document.getElementById("ErrorLabel").innerHTML = 'λ cannot be zero error!'; return; }
- if ( mv <= 0) { document.getElementById("ErrorLabel").innerHTML = 'm must be greater than 0 error!'; return; }
- if ( mv > MaxIterations) { document.getElementById("ErrorLabel").innerHTML = 'm must be lower than '+MaxIterations+' error!'; return; }
- if ( n <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n must be greater than 2 error!'; return; }
- if ( np <= 2) { document.getElementById("ErrorLabel").innerHTML = 'n' must be greater than 2 error!'; return; }
- if ( r < 0 || r > 1) { document.getElementById("ErrorLabel").innerHTML = 'r must be between 0 and 1 error!'; return; }
- if (isNaN(s0)) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> value error!'; return; }
- if (isNaN(t0)) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> value error!'; return; }
- if ( s0 < a || s0 > b) { document.getElementById("ErrorLabel").innerHTML = 's<sub>0</sub> must be between a and b error!'; return; }
- if ( t0 < c || t0 > d) { document.getElementById("ErrorLabel").innerHTML = 't<sub>0</sub> must be between c and d error!'; return; }
- // start calcualtions
- // Step 0 - set the variables and initial values
- var sigma = (b-a)/n; // step for points x-axis
- var sigmaprim = (d-c)/np; // step for points y-axis
- var D; // error (Distance between iterations and/or exact solution)
- // create arrays (matrices and vectors)
- Fl = new Array(n+1); // F*- exact array lower
- for (var i = 0; i <= n; i++) { Fl[i] = new Array(np+1); }
- Fu = new Array(n+1); // F*+ exact array upper
- for (var i = 0; i <= n; i++) { Fu[i] = new Array(np+1); }
- Fml = new Array(MaxIterations+1); // Fml[0..iter][0..n][0..np] - lower trapezoidal array
- for (var i = 0; i <= MaxIterations; i++) {
- Fml[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { Fml[i][j] = new Array(np+1); }
- }
- Fmu = new Array(MaxIterations+1); // Fmu[0..iter][0..n][0..np] - upper trapezoidal array
- for (var i = 0; i <= MaxIterations; i++) {
- Fmu[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { Fmu[i][j] = new Array(np+1); }
- }
- F0ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower trapezioid at point (s0,t0)
- F0mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper trapezioid at point (s0,t0)
- // F1m - for g1 func
- F1ml = new Array(MaxIterations+1); // F1ml[0..iter][0..n][0..np] - lower trapezoidal array g1
- for (var i = 0; i <= MaxIterations; i++) {
- F1ml[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { F1ml[i][j] = new Array(np+1); }
- }
- F1mu = new Array(MaxIterations+1); // F1mu[0..iter][0..n][0..np] - upper trapezoidal array g1
- for (var i = 0; i <= MaxIterations; i++) {
- F1mu[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { F1mu[i][j] = new Array(np+1); }
- }
- F10ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower trapezioid at point (s0,t0) for g1
- F10mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper trapezioid at point (s0,t0) for g1
- var e0l; var e0u; // error between iteration and exact solution at point (s0,t0)
- var el = new Array(n+1); // err- approx - exact for trapez
- for (var i = 0; i <= n; i++) { el[i] = new Array(np+1); }
- var eu = new Array(n+1); // err+ approx - exact for trapez
- for (var i = 0; i <= n; i++) { eu[i] = new Array(np+1); }
- // arrays for vaues of the points coordinates - network points
- s = new Array(n+1); // s(i)
- t = new Array(np+1); // t(j)
- // calculate values of arrays of network points coordinates
- for (var i = 0; i <= n; i++) { s[i] = a + i*sigma; }
- for (var i = 0; i <= np; i++) { t[i] = c + i*sigmaprim; }
- m = 0; // keep m < MaxIterations - m is trapezoidal current step number
- // parse the functions once, outside of the loops
- var Pglx = Parser.parse(glx);
- var Pgux = Parser.parse(gux);
- var Pg1lx = Parser.parse(g1lx);
- var Pg1ux = Parser.parse(g1ux);
- var PHx = Parser.parse(Hx);
- var PGlx = Parser.parse(Glx);
- var PGux = Parser.parse(Gux);
- var PFlx = Parser.parse(Flx);
- var PFux = Parser.parse(Fux);
- // Step 1 - Fm F1m m=0 initial values for network points - preliminary step
- for (var i = 0; i <= n; i++) { // trapezoid
- for (var j = 0; j <= np; j++) {
- Fml[0][i][j] = Pglx.evaluate({s: s[i], t: t[j], r: r});
- Fmu[0][i][j] = Pgux.evaluate({s: s[i], t: t[j], r: r});
- F1ml[0][i][j] = Pg1lx.evaluate({s: s[i], t: t[j], r: r});
- F1mu[0][i][j] = Pg1ux.evaluate({s: s[i], t: t[j], r: r});
- }
- }
- // initial values at (s0,t0) trapezoid
- F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
- F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
- F10ml[0] = Pg1lx.evaluate({s: s0, t: t0, r: r});
- F10mu[0] = Pg1ux.evaluate({s: s0, t: t0, r: r});
- m = 0; // will be +1
- // Step 2 (the generic iterative step)
- // trapezoid - loop through all points of the n x np matrix - see the formulaes in the article
- do {
- m = m+1; // next iteration for trapezoidal
- if ( m > MaxIterations ) { // check for posible endless loop
- document.getElementById("ErrorLabel").innerHTML = "Iterations trapezoid exceeded "+MaxIterations+"! Stopped!";
- alert("Iterations trapezoid exceeded "+MaxIterations+"! Stopped!");
- return;
- }
- // loop through all points of the n x np matrix - see the formulaes in the article
- // for g function
- for (var i = 0; i <= n; i++) {
- for (var j = 0; j <= np; j++) {
- var sl = 0; var su = 0;
- for (var k = 0; k <= n-1; k++) {
- for (var p = 0; p <= np-1; p++) {
- sl = sl +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
- *
- PGlx.evaluate({F: Fml[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
- *
- PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
- *
- PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
- *
- PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
- su = su +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
- *
- PGux.evaluate({F: Fmu[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
- *
- PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
- *
- PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
- *
- PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});
- }
- }
- Fml[m][i][j] = Fml[0][i][j] + (sigma*sigmaprim/4)*sl*lambda;
- Fmu[m][i][j] = Fmu[0][i][j] + (sigma*sigmaprim/4)*su*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(Fml[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(Fmu[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // F0[m] // at point (s0,t0)
- var s0l = 0; var s0u = 0;
- for (var k = 0; k <= n-1; k++) {
- for (var p = 0; p <= np-1; p++) {
- s0l = s0l +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
- *
- PGlx.evaluate({F: Fml[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
- *
- PGlx.evaluate({F: Fml[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
- *
- PGlx.evaluate({F: Fml[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
- *
- PGlx.evaluate({F: Fml[m-1][k+1][p+1], r: r});
- s0u = s0u +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
- *
- PGux.evaluate({F: Fmu[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
- *
- PGux.evaluate({F: Fmu[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
- *
- PGux.evaluate({F: Fmu[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
- *
- PGux.evaluate({F: Fmu[m-1][k+1][p+1], r: r});
- }
- }
- F0ml[m] = F0ml[0] + (sigma*sigmaprim/4)*s0l*lambda;
- F0mu[m] = F0mu[0] + (sigma*sigmaprim/4)*s0u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F0ml[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- if (isNaN(F0mu[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- // for g1 function
- for (var i = 0; i <= n; i++) {
- for (var j = 0; j <= np; j++) {
- var s1l = 0; var s1u = 0;
- for (var k = 0; k <= n-1; k++) {
- for (var p = 0; p <= np-1; p++) {
- s1l = s1l +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
- *
- PGlx.evaluate({F: F1ml[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
- *
- PGlx.evaluate({F: F1ml[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
- *
- PGlx.evaluate({F: F1ml[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
- *
- PGlx.evaluate({F: F1ml[m-1][k+1][p+1], r: r});
- s1u = s1u +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p]})
- *
- PGux.evaluate({F: F1mu[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k], y: t[p+1]})
- *
- PGux.evaluate({F: F1mu[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p]})
- *
- PGux.evaluate({F: F1mu[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s[i], t: t[j], x: s[k+1], y: t[p+1]})
- *
- PGux.evaluate({F: F1mu[m-1][k+1][p+1], r: r});
- }
- }
- F1ml[m][i][j] = Fml[0][i][j] + (sigma*sigmaprim/4)*s1l*lambda;
- F1mu[m][i][j] = Fmu[0][i][j] + (sigma*sigmaprim/4)*s1u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F1ml[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error g1 in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(F1mu[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error g1 in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // F10[m] // at point (s0,t0)
- var s10l = 0; var s10u = 0;
- for (var k = 0; k <= n-1; k++) {
- for (var p = 0; p <= np-1; p++) {
- s10l = s10l +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
- *
- PGlx.evaluate({F: F1ml[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
- *
- PGlx.evaluate({F: F1ml[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
- *
- PGlx.evaluate({F: F1ml[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
- *
- PGlx.evaluate({F: F1ml[m-1][k+1][p+1], r: r});
- s10u = s10u +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p]})
- *
- PGux.evaluate({F: F1mu[m-1][k][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k], y: t[p+1]})
- *
- PGux.evaluate({F: F1mu[m-1][k][p+1], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p]})
- *
- PGux.evaluate({F: F1mu[m-1][k+1][p], r: r})
- +
- PHx.evaluate({s: s0, t: t0, x: s[k+1], y: t[p+1]})
- *
- PGux.evaluate({F: F1mu[m-1][k+1][p+1], r: r});
- }
- }
- F10ml[m] = F0ml[0] + (sigma*sigmaprim/4)*s10l*lambda;
- F10mu[m] = F0mu[0] + (sigma*sigmaprim/4)*s10u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F10ml[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Down trapezoid error g1 in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- if (isNaN(F10mu[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper trapezoid error g1 in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- } while ( (m < mv) && (m < MaxIterations) ); // stop if mv is reached or iterations exceeded
- // possible also check m is reasonable to avoid endless looping if no convergence
- if ( m >= MaxIterations )
- {
- document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!";
- alert("Endless loop detected (>"+MaxIterations+" iterations) in trapezoid!");
- return;
- }
- // calculate lower-upper exact value at point (s0,t0)
- var F0l = PFlx.evaluate({s: s0, t: t0, r: r});
- var F0u = PFux.evaluate({s: s0, t: t0, r: r});
- Calculated = m > 1; // flag for completion
- document.getElementById("ErrorLabel").textContent = 'Done calculations!';
- // draw a tables with results
- // errors table string (innerHTML)
- // toExponential(2)
- var FormattingErrors = sFormElements["FormattingErrors"].value;
- var e1; var e2; var e3; var e4;
- 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>';
- for (var i = 0; i <= m; i++) {
- e1 = Math.abs(F0l-F0ml[i]);
- e2 = Math.abs(F0u-F0mu[i]);
- e3 = Math.abs(F0ml[i]-F10ml[i]);
- e4 = Math.abs(F0mu[i]-F10mu[i]);
- if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
- e1 = e1.toExponential(eval(FormattingErrors));
- e2 = e2.toExponential(eval(FormattingErrors));
- e3 = e3.toExponential(eval(FormattingErrors));
- e4 = e4.toExponential(eval(FormattingErrors));
- }
- errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td>';
- errors+='<td>'+e3+'</td><td>'+e4+'</td></tr>';
- }
- // values table string (innerHTML)
- 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>';
- for (var i = 0; i <= m; i++) {
- values+='<tr><td>'+i+'</td><td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';
- values+='<td>'+F10ml[i]+'</td><td>'+F10mu[i]+'</td></tr>';
- }
- // show the info and tables
- document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for n='+n+', n'='+np+', r='+r.toFixed(2)+' (iterations: m='+m+' classical)</center>';
- document.getElementById("ResultsErrors").innerHTML = errors;
- document.getElementById("ResultsValues").innerHTML = values;
- //
- document.getElementById("ErrorLabel").textContent = 'Done calculation...';
- document.getElementById("ResultLabel2").innerHTML = '';
- document.getElementById('animated-result').style.display = ''; // show the result
- } // catch the error and show the eror message (debug information)
- catch(err) {
- var vDebug = "";
- var el = err.lineNumber;
- for (var prop in err)
- {
- vDebug += "property: "+ prop+ " ["+ err[prop]+ "], ";
- }
- vDebug += "[" + err.toString() + "]";
- if ( !(el === undefined) ) { vDebug += ", on line " + el; }
- document.getElementById('animated-result').style.display = 'none'; // hide result
- document.getElementById("ErrorLabel").textContent = 'Error: ' + err.message +
- ' ' + vDebug;
- }
- }
- </script>
- </p>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement