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 2DNHFFFIE-HW solver</title>
- <meta name="Description" content="Web-based 2D nonlinear Hammerstein-Fredholm fuzzy functional integral equations based on fuzzy Haar wavelets solver" />
- <meta name="Keywords" content="two-dimmensional nonlinear fuzzy integral equation, Hammerstein-Fredholm, solver, numerical method, approximate method, iterative method, Haar wavelets, fuzzy Haar wavelets" />
- <meta name="Author" content="Svetoslav Enkov. Atanaska Georgieva" />
- <meta charset="UTF-8" />
- <head>
- <link href="solver.css" type="text/css" rel="stylesheet">
- </head>
- <body>
- <p align="center" style="font-size: 150%">Solver for 2D nonlinear Hammerstein-Fredholm fuzzy
- functional integral equations based on fuzzy Haar wavelets</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> k(s,t,x,y) = <input name="kfunc" value="" type="text" size=115></p>
- <p>H<sub>-</sub>(x,y,F,r) = <input name="Hlfunc" value="" type="text" size=115></p>
- <p>H<sub>+</sub>(x,y,F,r) = <input name="Hufunc" 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>
- M =<input name="Mvalue" value="" type="text" size=4>
- N =<input name="Nvalue" 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();">
- 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, 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, freeware, public domain
- // University of Plovdiv, FMI, 236 Bulgaria Blvd., Plovdiv, Bulgaria. enkov@uni-plovdiv.bg
- // published at http://enkov.com/solver2DWave
- // https://pastebin.com/kCKKsmmp source
- //
- // Algorithm is based on the presentation at APPLICATIONS OF MATHEMATICS IN ENGINEERING AND ECONOMICS (AMEE’17): Proceedings of the 43rd International Conference on Applications of Mathematics in Engineering and Economics
- // article "Numerical solution of two-dimensional nonlinear Hammerstein-Fredholm fuzzy functional integral equations based on fuzzy Haar wavelets"
- 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 M; var N; // 2M x 2N matrices
- var a; var b; var c; var d; // intervals x/y
- var Fml; var Fmu; // iteration's
- var Fl; var Fu; // exact values F* calculated by net, lower/upper
- var m; // current iteration
- var s; var t; // s, t arrays of points
- var lambda; // coefficient for correction
- var s0; var t0; // calculation point
- var F0ml; var F0mu; // F(s0,t0) values at the calculation point
- function Sample() // preloads sample values for fast evaluation of the algorithm
- {
- // our sample
- sFormElements["glfunc"].value = '(1/3)*(1+r)*s*t-(1/8)*s*t-(1/6)*(1+r)*s*t';
- sFormElements["gufunc"].value = '(1/3)*(3-r)*s*t-(1/8)*s*t-(1/6)*(3-r)*s*t';
- sFormElements["kfunc"].value = 's*x*t*y';
- sFormElements["Hlfunc"].value = 'x*x+y*y+F';
- sFormElements["Hufunc"].value = 'x*x+y*y+F';
- sFormElements["flfunc"].value = '(F*2/3)-(1/8)*s*t+(1/18)*(1+r)*s*t';
- sFormElements["fufunc"].value = '(F*2/3)-(1/8)*s*t+(1/18)*(3-r)*s*t';
- sFormElements["Flfunc"].value = '(1+r)*s*t';
- sFormElements["Fufunc"].value = '(3-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["Mvalue"].value = '10';
- sFormElements["Nvalue"].value = '10';
- 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 kx = sFormElements['kfunc'].value;
- var Hlx = sFormElements['Hlfunc'].value;
- var Hux = sFormElements['Hufunc'].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 (kx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function k can not be empty!'; return; }
- if (Hlx == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H<sub>-</sub> can not be empty!'; return; }
- if (Hux == '') { document.getElementById("ErrorLabel").innerHTML = 'Function H<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['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['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;
- M = (sFormElements['Mvalue'].value != '') ? parseInt(sFormElements['Mvalue'].value) : 0;
- N = (sFormElements['Nvalue'].value != '') ? parseInt(sFormElements['Nvalue'].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(M)) { document.getElementById("ErrorLabel").innerHTML = 'M value error!'; return; }
- if (isNaN(N)) { 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 ( M <= 2) { document.getElementById("ErrorLabel").innerHTML = 'M must be greater than 2 error!'; return; }
- if ( N <= 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 = 200; // max iterations - arrays
- var sigma = (b-a)/(2*M); // step for points x-axis
- var sigmaprim = (d-c)/(2*N); // step for points y-axis
- var D; // error (Distance between iterations and/or exact solution)
- // create arrays (matrices and vectors)
- // arrays for vaues of the points coordinates
- ksi = new Array(2*M+1); // ksi(i) 1..2M
- eta = new Array(2*N+1); // eta(j) 1..2N
- // calculate values of arrays of network points coordinates
- for (var i = 1; i <= 2*M; i++) { ksi[i] = a + sigma*(i-1/2); }
- for (var j = 1; j <= 2*N; j++) { eta[j] = c + sigmaprim*(j-1/2); }
- Fl = new Array(2*M+1); // F*- exact matrix lower 2Mx2N
- for (var i = 1; i <= 2*M; i++) { Fl[i] = new Array(2*N+1); }
- Fu = new Array(2*M+1); // F*+ exact matrix upper 2Mx2N
- for (var i = 1; i <= 2*M; i++) { Fu[i] = new Array(2*N+1); }
- Fml = new Array(MaxIterations+1); // Fml[0..iter][1..2M][1..2N] - lower iterations matrix
- for (var i = 0; i <= MaxIterations; i++) {
- Fml[i] = new Array(2*M+1);
- for (var j = 1; j <= 2*M; j++) { Fml[i][j] = new Array(2*N+1); }
- }
- Fmu = new Array(MaxIterations+1); // Fmu[0..iter][1..2M][1..2N] - upper iterations matrix
- for (var i = 0; i <= MaxIterations; i++) {
- Fmu[i] = new Array(2*M+1);
- for (var j = 1; j <= 2*M; j++) { Fmu[i][j] = new Array(2*N+1); }
- }
- F0ml = new Array(MaxIterations+1); // Fc-(s0,t0) - lower at point (s0,t0)
- F0mu = new Array(MaxIterations+1); // Fc+(s0,t0) - upper at point (s0,t0)
- var e0l; var e0u; // error between iteration and exact solution at point (s0,t0)
- var el = new Array(2*M+1); // err- approx - exact
- for (var i = 1; i <= 2*M; i++) { el[i] = new Array(2*N+1); }
- var eu = new Array(2*M+1); // err+ approx - exact
- for (var i = 1; i <= 2*M; i++) { eu[i] = new Array(2*N+1); }
- m = 0; // keep m < MaxIterations - m is current step number
- // parse the functions once, outside of the loops
- var Pglx = Parser.parse(glx);
- var Pgux = Parser.parse(gux);
- var Pkx = Parser.parse(kx);
- var PHlx = Parser.parse(Hlx);
- var PHux = Parser.parse(Hux);
- var Pflx = Parser.parse(flx);
- var Pfux = Parser.parse(fux);
- var PFlx = Parser.parse(Flx);
- var PFux = Parser.parse(Fux);
- // Step 1 - Fm F0m m=0 initial values for network points - preliminary step
- for (var i = 1; i <= 2*M; i++) {
- for (var j = 1; j <= 2*N; j++) {
- Fml[0][i][j] = Pglx.evaluate({s: ksi[i], t: eta[j], r: r});
- Fmu[0][i][j] = Pgux.evaluate({s: ksi[i], t: eta[j], r: r});
- }
- }
- // initial values at (s0,t0)
- F0ml[0] = Pglx.evaluate({s: s0, t: t0, r: r});
- F0mu[0] = Pgux.evaluate({s: s0, t: t0, r: r});
- // Step 2 (the first iterative step)
- // preliminary step iteration 1
- m = 1;
- // loop through all points of the 2M x 2N matrix - see the formulaes in the article
- for (var i = 1; i <= 2*M; i++) {
- for (var j = 1; j <= 2*N; j++) {
- var stl = 0; var stu = 0;
- for (var k = 1; k <= 2*N; k++) {
- for (var p = 1; p <= 2*M; p++) {
- stl = stl +
- Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
- stu = stu +
- Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
- }
- }
- Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: ksi[i], t: eta[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
- Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: ksi[i], t: eta[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(Fml[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(Fmu[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // F0m[1] // at point (s0,t0)
- var st0l = 0; var st0u = 0;
- for (var k = 1; k <= 2*N; k++) {
- for (var p = 1; p <= 2*M; p++) {
- st0l = st0l +
- Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
- st0u = st0u +
- Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
- *
- PHux.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
- }
- }
- F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
- F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F0ml[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- if (isNaN(F0mu[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- // Steps 3-4 (the generic iterative step)
- // loop through all points of the 2M x 2N matrix - see the formulaes in the article
- do {
- m = m+1; // next iteration
- if ( m > MaxIterations ) { // check for posible endless loop
- document.getElementById("ErrorLabel").innerHTML = "Iterations exceeded "+MaxIterations+"! Stopped!";
- alert("Iterations exceeded "+MaxIterations+"! Stopped!");
- return;
- }
- // loop through all points of the 2M x 2N matrix - see the formulaes in the article
- for (var i = 1; i <= 2*M; i++) {
- for (var j = 1; j <= 2*N; j++) {
- var stl = 0; var stu = 0;
- for (var k = 1; k <= 2*N; k++) {
- for (var p = 1; p <= 2*M; p++) {
- stl = stl +
- Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
- stu = stu +
- Pkx.evaluate({s: ksi[i], t: eta[j], x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
- }
- }
- Fml[m][i][j] = Fml[0][i][j] + Pflx.evaluate({s: ksi[i], t: eta[j], F: Fml[m-1][i][j], r: r}) + (sigma*sigmaprim)*stl*lambda;
- Fmu[m][i][j] = Fmu[0][i][j] + Pfux.evaluate({s: ksi[i], t: eta[j], F: Fmu[m-1][i][j], r: r}) + (sigma*sigmaprim)*stu*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(Fml[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- if (isNaN(Fmu[m][i][j])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at point ("+i+","+j+").";
- return;
- }
- }
- }
- // F0m[1] // at point (s0,t0)
- var st0l = 0; var st0u = 0;
- for (var k = 1; k <= 2*N; k++) {
- for (var p = 1; p <= 2*M; p++) {
- st0l = st0l +
- Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
- *
- PHlx.evaluate({x: ksi[p], y: eta[k], F: Fml[m-1][p][k], r: r});
- st0u = st0u +
- Pkx.evaluate({s: s0, t: t0, x: ksi[p], y: eta[k]})
- *
- PHux.evaluate({x: ksi[p], y: eta[k], F: Fmu[m-1][p][k], r: r});
- }
- }
- F0ml[m] = F0ml[0] + Pflx.evaluate({s: s0, t: t0, F: F0ml[m-1], r: r}) + (sigma*sigmaprim)*st0l*lambda;
- F0mu[m] = F0mu[0] + Pfux.evaluate({s: s0, t: t0, F: F0mu[m-1], r: r}) + (sigma*sigmaprim)*st0u*lambda;
- // check for NaN - possible errors (divide by zero or over/under-flows)
- if (isNaN(F0ml[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Down error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- if (isNaN(F0mu[m])) {
- document.getElementById("ErrorLabel").innerHTML = "Upper error in iteration "+m+" at (s<sub>0</sub>, t<sub>0</sub>).";
- return;
- }
- // calculate D for (s0,t0)
- 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)!";
- alert("Endless loop detected (>"+MaxIterations+" iterations)!");
- 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 FormattingErrors = sFormElements["FormattingErrors"].value;
- var e1; var e2;
- // errors table string (innerHTML)
- var errors ='<caption>Errors at iter (s<sub>0</sub>,t<sub>0</sub>)</caption><tr><th>m</th><th>e<sub>m-</sub></th><th>e<sub>m+</sub></th></tr>';
- if (SqueezeResults)
- { // compact table 1..3 and last
- for (var i = 1; i <= 3; i++) {
- if ( i <= m) {
- e1 = Math.abs(F0l-F0ml[i]);
- e2 = Math.abs(F0u-F0mu[i]);
- if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
- e1 = e1.toExponential(eval(FormattingErrors));
- e2 = e2.toExponential(eval(FormattingErrors));
- }
- errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td></tr>';
- }
- }
- errors+='<tr><td>...</td><td>...</td><td>...</td></tr>';
- }
- else
- { // full table
- for (var i = 1; i <= m; i++) {
- e1 = Math.abs(F0l-F0ml[i]);
- e2 = Math.abs(F0u-F0mu[i]);
- if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
- e1 = e1.toExponential(eval(FormattingErrors));
- e2 = e2.toExponential(eval(FormattingErrors));
- }
- errors+='<tr><td>'+i+'</td><td>'+e1+'</td><td>'+e2+'</td><tr>';
- }
- }
- errors +='<tr><td colspan="3" align="center">Errors at end</td></tr><tr><th></th><th>e<sub>m-</sub></th><th>e<sub>m+</sub></th></tr>';
- errors+='<tr><td>Last</td>';
- e1 = Math.abs(F0l-F0ml[m]);
- e2 = Math.abs(F0u-F0mu[m]);
- if (FormattingErrors != '-1') { // use Scientific exponential notation with selected number of digits
- e1 = e1.toExponential(eval(FormattingErrors));
- e2 = e2.toExponential(eval(FormattingErrors));
- }
- errors+='<td>'+e1+'</td></td><td>'+e2+'</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>F<sub>m-</sub></th><th>F<sub>m+</sub></th></tr>';
- if (SqueezeResults)
- { // compact table 1..3 and last
- for (var i = 1; i <= 3; i++) {
- if ( i <= m )
- {values+='<tr><td>'+i+'</td><td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td><tr>';}
- }
- values+='<tr><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><tr>';
- }
- else
- { // full table
- for (var i = 1; i <= m; i++) {
- values+='<tr><td>'+i+'</td>'+'<td>'+F0ml[i]+'</td><td>'+F0mu[i]+'</td>';
- }
- }
- // show the info and tables
- document.getElementById("ResultLabel1").innerHTML = '<center>Numerical results for M='+M+', N='+N+', r='+r.toFixed(2)+' (iterations: '+m+')</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