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 solver example</title>
- <meta name="Description" content="Web-based 2D nonlinear Fredholm fuzzy functional 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" />
- <head>
- <link href="solver.css" type="text/css" rel="stylesheet">
- </head>
- <body>
- <p align="center" style="font-size: 150%">Solver for 2D nonlinear Fredholm fuzzy
- functional 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> 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,F,r) = <input name="flfunc" value="" type="text" size=115></p>
- <p>f<sub>+</sub>(s,t,F,r) = <input name="fufunc" 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>
- ε =<input name="epsvalue" value="" type="text" size=6>
- 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 align='right'>
- <input type="checkbox" name="ResultsType" value="Squeeze">Squeeze results
- <input name = "SampleButton" value="Load sample" type="button" title="Loads Sample!" onclick="Sample();">
- </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, 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 src="lib/parallel.js"></script>
- -->
- <script type="text/javascript">
- // Copyright (c)2015 Matthew Crumley, Math Parser library, https://silentmatt.com/javascript-expression-evaluator/
- // Copyright (c)2015 Adam Savitzky, Parallel JS library, http://adambom.github.io/parallel.js/
- // -- parallel calculations will be added later for a bigger arrays and more steps support
- //
- // Copyright (c)2016 Algorithm realisation by Svetoslav Enkov, Atanaska Georgieva, freeware, public domain
- // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg
- // published at http://enkov.com/solver2D
- //
- // Algorithm is based on the presentation at BMC-XII 5-10.09.2016, Minsk
- 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 a; var b; var c; var d; // intervals x/y
- var Fml; var Fmu; var Ftoml; var Ftomu; // iteration's arrays for trapezoid and optimal
- var Fl; var Fu; // exact values F* calculated by net, lower/upper
- var m; var mo; // current iteration classic/optimal
- var s; var so; var t; var to; // s, t arrays of points classic/optimal
- 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
- {
- // our sample
- sFormElements["glfunc"].value = '(3/4)*(2+r)*s*t-(1/8)*(2+r)*(2+r)*s*t';
- sFormElements["gufunc"].value = '(3/4)*(4-r)*s*t-(1/8)*(4-r)*(4-r)*s*t';
- sFormElements["Hfunc"].value = 's*x*t*y';
- sFormElements["Glfunc"].value = 'F*F';
- sFormElements["Gufunc"].value = 'F*F';
- sFormElements["flfunc"].value = '(F/4)+(1/16)*(2+r)*(2+r)*s*t';
- sFormElements["fufunc"].value = '(F/4)+(1/16)*(4-r)*(4-r)*s*t';
- 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["epsvalue"].value = '1e-10';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- /* // sample 2 - sample 2 and 3 are removed from the form, leaving it for internal evaluation
- sFormElements["glfunc"].value = '(2+r)*s*t-(1/16)*(2+r)*(2+r)*s*t';
- sFormElements["gufunc"].value = '(4-r)*s*t-(1/16)*(r-4)*(r-4)*s*t';
- sFormElements["Hfunc"].value = 's*x*t*y';
- sFormElements["Glfunc"].value = 'F*F';
- sFormElements["Gufunc"].value = 'F*F';
- sFormElements["flfunc"].value = '0';
- sFormElements["fufunc"].value = '0';
- 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["epsvalue"].value = '1e-10';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '10';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- // sample 3
- sFormElements["glfunc"].value = 'r*E^(s+t)+8*(2-3*E^0.5+E)*r^0.5*s*t';
- sFormElements["gufunc"].value = '(2-r)*E^(s+t)+8*(2-3*E^0.5+E)*(2-r)^0.5*s*t';
- sFormElements["Hfunc"].value = 's*t*(x+y)';
- sFormElements["Glfunc"].value = 'F^0.5';
- sFormElements["Gufunc"].value = 'F^0.5';
- sFormElements["flfunc"].value = '0';
- sFormElements["fufunc"].value = '0';
- 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["epsvalue"].value = '1e-10';
- sFormElements["nvalue"].value = '10';
- sFormElements["npvalue"].value = '5';
- sFormElements["rvalue"].value = '0.5';
- sFormElements["s0value"].value = '0.5';
- sFormElements["t0value"].value = '0.5';
- */
- // prepare for calculation - reset messages
- document.getElementById("ErrorLabel").textContent = 'Loaded article sample function...';
- 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 result
- 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
- // input fields
- // functions
- var glx = sFormElements['glfunc'].value;
- var gux = sFormElements['gufunc'].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;
- 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 (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; }
- 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['epsvalue'].value == '') { document.getElementById("ErrorLabel").innerHTML = 'Constant ε 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;
- var eps = (sFormElements['epsvalue'].value != '') ? parseFloat(sFormElements['epsvalue'].value) : 0.0;
- n = (sFormElements['nvalue'].value != '') ? parseInt(sFormElements['nvalue'].value) : 0;
- np = (sFormElements['npvalue'].value != '') ? parseInt(sFormElements['npvalue'].value) : 0;
- var r = (sFormElements['rvalue'].value != '') ? parseFloat(sFormElements['rvalue'].value) : 0.0;
- s0 = (sFormElements['s0value'].value != '') ? parseFloat(sFormElements['s0value'].value) : 0.0;
- t0 = (sFormElements['s0value'].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(eps)) { document.getElementById("ErrorLabel").innerHTML = 'ε 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 ( eps <= 0) { document.getElementById("ErrorLabel").innerHTML = 'ε must be greater than 0 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; }
- // flag for results output format - compact table first 1..3 and last values if checked
- var SqueezeResults = sFormElements['ResultsType'].checked;
- // start calcualtions
- // Step 0 - set the variables and initial values
- var MaxIterations = 250; // 250 points at least with results
- 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); }
- }
- Ftoml = new Array(MaxIterations+1); // Ftoml[0..iter][0..n][0..np] - lower optimal middle point array
- for (var i = 0; i <= MaxIterations; i++) {
- Ftoml[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { Ftoml[i][j] = new Array(np+1); }
- }
- Ftomu = new Array(MaxIterations+1); // Ftomu[0..iter][0..n][0..np] - upper optimal middle point array
- for (var i = 0; i <= MaxIterations; i++) {
- Ftomu[i] = new Array(n+1);
- for (var j = 0; j <= n; j++) { Ftomu[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)
- F0oml = new Array(MaxIterations+1); // Fo-(s0,t0) - lower optimal at point (s0,t0)
- F0omu = new Array(MaxIterations+1); // Fo+(s0,t0) - upper optimal at point (s0,t0)
- 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); }
- var eol = new Array(n+1); // err- approx - exact for optimal
- for (var i = 0; i <= n; i++) { eol[i] = new Array(np+1); }
- var eou = new Array(n+1); // err+ approx - exact for optimal
- for (var i = 0; i <= n; i++) { eou[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)
- so = new Array(n+1); // so(i)
- to = new Array(np+1); // to(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; }
- for (var i = 1; i <= n; i++) { so[i] = a + (2*i-1)*(sigma/2); }
- for (var i = 1; i <= np; i++) { to[i] = c + (2*i-1)*(sigmaprim/2); }
- m = 0; // keep m < MaxIterations - m is trapezoidal current step number
- mo = 0; // keep mo < MaxIterations - mo is optimal current step number
- // parse the functions once, outside of the loops
- var Pglx = Parser.parse(glx);
- var Pgux = Parser.parse(gux);
- 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);
- var PFlx = Parser.parse(Flx);
- var PFux = Parser.parse(Fux);
- // Step 1 - Fm Fom 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});
- }
- }
- // initial values at (s0,t0) trap/opt
- F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
- F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
- F0oml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
- F0omu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
- for (var i=1; i <= n; i++) { // optimal (middle finger) values for network points
- for (var j = 1; j <= np; j++) {
- Ftoml[0][i][j] = Pglx.evaluate({s: so[i], t: to[j], r: r});
- Ftomu[0][i][j] = Pgux.evaluate({s: so[i], t: to[j], r: r});
- }
- }
- // Step 2 (the first iterative step)
- // trapezoid loop preliminary step
- m = 1;
- // loop through all points of the n x np matrix - see the formulaes in the article
- 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] + Pflx.evaluate({s: s[i], t: t[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*sl*lambda;
- Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: s[i], t: t[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*su*lambda;
- // 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[1] // 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] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim/4)*s0l*lambda;
- F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (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;
- }
- // optimal formula loop preliminary step
- mo = 1;
- // loop through all points of the n x np matrix - see the formulaes in the article
- for (var i = 1; i <= n; i++) {
- for (var j = 1; j <= np; j++) {
- var stl = 0; var stu = 0;
- for (var k = 1; k <= n; k++) {
- for (var p = 1; p <= np; p++) {
- stl = stl +
- PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
- *
- PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
- stu = stu +
- PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
- *
- PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
- }
- }
- Ftoml[mo][i][j] = Ftoml[0][i][j] + Pflx.evaluate({s: so[i], t: to[j], F: Ftoml[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
- Ftomu[mo][i][j] = Ftomu[0][i][j] + Pfux.evaluate({s: so[i], t: to[j], F: Ftomu[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(Ftoml[mo][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(Ftomu[mo][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // Ft0[1] // at point (s0,t0)
- var st0l = 0; var st0u = 0;
- for (var k = 1; k <= n; k++) {
- for (var p = 1; p <= np; p++) {
- st0l = st0l +
- PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
- *
- PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
- st0u = st0u +
- PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
- *
- PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
- }
- }
- F0oml[mo] = F0oml[0] + Pflx.evaluate({s: s0, t: t0, F: F0oml[mo-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
- F0omu[mo] = F0omu[0] + Pfux.evaluate({s: s0, t: t0, F: F0omu[mo-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F0oml[mo])) {
- document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- if (isNaN(F0omu[mo])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- // Steps 3-4 (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 (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] + Pflx.evaluate({s: s[i], t: t[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*sl*lambda;
- Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: s[i], t: t[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim/4)*su*lambda;
- 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;
- }
- }
- }
- // point(s0,t0)
- s0l=0; s0u=0;
- // see the formulaes in the article
- 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] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim/4)*s0l*lambda;
- F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim/4)*s0u*lambda;
- 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;
- }
- // calculate D for (s0,t0) trapezoidal
- D = Math.max(Math.abs(F0ml[m] - F0ml[m-1]), Math.abs(F0mu[m] - F0mu[m-1]));
- } while ( (D >= eps) && (m < MaxIterations) ); // stop if epsilon 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;
- }
- // optimal - step3-4 main iteration
- do {
- mo = mo+1; // next iteration for optimal formula
- if ( mo > MaxIterations ) { // check for posible endless loop
- document.getElementById("ErrorLabel").innerHTML = "Iterations optimal exceeded "+MaxIterations+"! Stopped!";
- alert("Iterations optimal exceeded "+MaxIterations+"! Stopped!");
- return;
- }
- // loop through all points of the n x np matrix - see the formulaes in the article
- for (var i = 1; i <= n; i++) {
- for (var j = 1; j <= np; j++) {
- var stl = 0; var stu = 0;
- for (var k = 1; k <= n; k++) {
- for (var p = 1; p <= np; p++) {
- stl = stl +
- PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
- *
- PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
- stu = stu +
- PHx.evaluate({s: so[i], t: to[j], x: so[k], y: to[p]})
- *
- PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
- }
- }
- Ftoml[mo][i][j] = Ftoml[0][i][j] + Pflx.evaluate({s: so[i], t: to[j], F: Ftoml[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
- Ftomu[mo][i][j] = Ftomu[0][i][j] + Pfux.evaluate({s: so[i], t: to[j], F: Ftomu[mo-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(Ftoml[mo][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(Ftomu[mo][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // Ft0[1]
- var st0l = 0; var st0u = 0;
- for (var k = 1; k <= n; k++) {
- for (var p = 1; p <= np; p++) {
- st0l = st0l +
- PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
- *
- PGlx.evaluate({F: Ftoml[mo-1][k][p], r: r});
- st0u = st0u +
- PHx.evaluate({s: s0, t: t0, x: so[k], y: to[p]})
- *
- PGux.evaluate({F: Ftomu[mo-1][k][p], r: r});
- }
- }
- F0oml[mo] = F0oml[0] + Pflx.evaluate({s: s0, t: t0, F: F0oml[mo-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
- F0omu[mo] = F0omu[0] + Pfux.evaluate({s: s0, t: t0, F: F0omu[mo-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F0oml[mo])) {
- document.getElementById("ErrorLabel").innerHTML = "Down optimal error in iteration "+mo+" at (s<sub>0</sub>, ts<sub>0</sub>).";
- return;
- }
- if (isNaN(F0omu[mo])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper optimal error in iteration "+mo+" at (s<sub>0</sub>, ts<sub>0</sub>).";
- return;
- }
- // calculate D for (s0,t0) optimal
- D = Math.max(Math.abs(F0oml[mo] - F0oml[mo-1]), Math.abs(F0omu[mo] - F0omu[mo-1]));
- } while ( (D >= eps) && (mo < MaxIterations) ); // stop if epsilon is reached or iterations exceeded
- // possible also check mo is reasonable to avoid endless looping if no convergence
- if ( mo >= MaxIterations ) // error
- {
- document.getElementById("ErrorLabel").innerHTML = "Endless loop detected (>"+MaxIterations+" iterations) in optimal!";
- alert("Endless loop optimal detected (>"+MaxIterations+" iterations) in optimal!");
- 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, iteration '+m+'...';
- // draw a tables with results
- var mx = Math.max(m, mo); // take a bigger count of iterations for table size (rows)
- // errors table string (innerHTML)
- var errors ='<caption>Errors at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>ec<sub>m-</sub></th><th>ec<sub>m+</sub></th><th>eo<sub>m-</sub></th><th>eo<sub>m+</sub></th></tr>';
- if (SqueezeResults)
- { // compact table 1..3 and last
- for (var i = 1; i <= 3; i++) {
- errors+='<tr><td>'+i+'</td>';
- if ( i <= m )
- {errors+='<td>'+Math.abs(F0l-F0ml[i])+'</td><td>'+Math.abs(F0u-F0mu[i])+'</td>';}
- else {errors+='<td>-</td><td>-</td>'}
- if ( i <= mo )
- {errors+='<td>'+Math.abs(F0l-F0oml[i])+'</td><td>'+Math.abs(F0u-F0omu[i])+'</td>';}
- else {errors+='<td>-</td><td>-</td>'}
- errors+='</tr>';
- }
- errors+='<tr><td>...</td><td>...</td><td>...</td><td>....</td><td>...</td></tr>';
- }
- else
- { // full table
- for (var i = 1; i <= mx; i++) {
- errors+='<tr><td>'+i+'</td>';
- if ( i <= m )
- {errors+='<td>'+Math.abs(F0l-F0ml[i])+'</td><td>'+Math.abs(F0u-F0mu[i])+'</td>';}
- else {errors+='<td>-</td><td>-</td>'}
- if ( i <= mo )
- {errors+='<td>'+Math.abs(F0l-F0oml[i])+'</td><td>'+Math.abs(F0u-F0omu[i])+'</td>';}
- else {errors+='<td>-</td><td>-</td>'}
- errors+='</tr>';
- }
- }
- errors +='<tr><td colspan="5" align="center">Errors comparable optimal to classic </td></tr><tr><th></th><th>eo<sub>m-</sub></th><th>ec<sub>m-</sub></th><th>eo<sub>m+</sub></th><th>ec<sub>m+</sub></th></tr>';
- errors+='<tr><td>Last</td>';
- errors+='<td>'+Math.abs(F0l-F0oml[mo])+'</td><td>'+Math.abs(F0l-F0ml[m])+'</td>';
- errors+='<td>'+Math.abs(F0u-F0omu[mo])+'</td><td>'+Math.abs(F0u-F0mu[m])+'</td>';
- errors+='</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>Fo<sub>m-</sub></th><th>Fo<sub>m+</sub></th></tr>';
- if (SqueezeResults)
- { // compact table 1..3 and last
- for (var i = 1; i <= 3; i++) {
- values+='<tr><td>'+i+'</td>';
- if ( i <= m )
- {values+='<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';}
- else {values+='<td>-</td><td>-</td>'}
- if ( i <= mo )
- {values+='<td>'+F0oml[i]+'</td><td>'+F0omu[i]+'</td>';}
- else {values+='<td>-</td><td>-</td>'}
- values+='</tr>';
- }
- values+='<tr><td>...</td><td>...</td><td>...</td><td>....</td><td>...</td></tr>';
- values +='<tr><td colspan="5" align="center">Final values (last iteration) </td></tr>';
- values+='<tr><td><small>Last</small></td>';
- values+='<td>'+F0ml[m]+'</td><td>'+F0mu[m]+'</td>';
- values+='<td>'+F0oml[mo]+'</td><td>'+F0omu[mo]+'</td>';
- values+='</tr>';
- }
- else
- { // full table
- for (var i = 1; i <= mx; i++) {
- values+='<tr><td>'+i+'</td>';
- if ( i <= m )
- {values+='<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';}
- else {values+='<td>-</td><td>-</td>'}
- if ( i <= mo )
- {values+='<td>'+F0oml[i]+'</td><td>'+F0omu[i]+'</td>';}
- else {values+='<td>-</td><td>-</td>'}
- values+='</tr>';
- }
- }
- // show the info and tables
- document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for n='+n+', n'='+np+', r='+r.toFixed(2)+' (iterations: '+m+' classical, '+mo+' optimal)</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