Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Javascript - Verificare continuità di una funzione con javascript
Forum - Javascript - Verificare continuità di una funzione con javascript

Avatar
blujeans (Normal User)
Rookie


Messaggi: 28
Iscritto: 05/10/2013

Segnala al moderatore
Postato alle 0:10
Domenica, 10/11/2013
mi è stato chiesto di fare programma javascript che verificasse se una funzione fosse continua dato un intervallo chiuso [a,b], altrimenti avrei dovuto rispondere se la discontinuità fosse di prima, seconda o terza specie.
Io ho strutturato la pagina html così:
textbox id="id_a" -> dove inserisco a;
textbox id="id_b" -> dove inserisco b;
textbox id="id_funzione"-> dove inserisco la funzione;
textbox id="id_disco" -> in output dovrei avere il tipo di discontinuità  se non è continua;

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 4:30
Domenica, 10/11/2013
Partirei dalla definizione di discontinuita' ( http://www.math.brown.edu/UTRA/discontinuities.html )  dopodiche' deciderei un numero arbitrario di precisione N ( 10^-6 ? http://en.wikipedia.org/wiki/Machine_epsilon ), valuterei la funzione per ogni numero incluso tra [a,b] incrementando di N ad ogni iterazione. A quel punto e' solo questione di trovare un buon modo per trovare una discontinuita' (e se non la trovi quando arrivi a b sai che e' continua).


Il mio blog: https://piero.dev
PM Quote
Avatar
blujeans (Normal User)
Rookie


Messaggi: 28
Iscritto: 05/10/2013

Segnala al moderatore
Postato alle 16:58
Domenica, 10/11/2013
Questo è il mio codice ma non riesco a capire perché non funzioni correttamente

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
    <title>Discontinuità</title>
    <script type="text/javascript">
        
        var a ;
        var b ;
        var funzione ;
        var text_disco;
        
        function inizializza()
        {
          a = document.getElementById("id_a");
          b = document.getElementById("id_b");
          funzione = document.getElementById("id_funzione");
          text_disco = document.getElementById("id_disco");
        }
        
        function f_x(x)
        {
         //alert(eval(funzione.value));
         return parseFloat(eval(funzione.value));
        }
        
        function discontinuita()
        {
            text_disco.value="";
            //intervallo [a,b]
            var  Xmin = parseFloat(a.value);//-> valore a
            var  Xmax = parseFloat(b.value);//-> valore b
            var y = 0; //->risultato della funzione  nel punti (i) -> vedi f_x(x)
            var limiteDx = 0; limiteSx = 0;//->risultato del limite Dx e Sx  nel punti (i) -> vedi f_x(x)
            var continua = true;
            var disco = "continua"; // label che indica il tipo di discontinuità
            var infinito = 5e6; // infinito stabilito da me
            i=Xmin;
                        //ciclo tutto l'intervallo se la funzione è continua altrimenti esco
            while( i<Xmax && continua == true )
            {
             limiteDx =  (f_x( i + 10e-7 ))  ;
             limiteSx =  (f_x( i - 10e-7 ))  ;
             y = f_x(i);

                //x = continua sempre
                if( limiteDx != y || limiteSx != y) // se i limiti sono diveri dalla funzione nel punto allora è discontinua
                {
                 //1a specie : limiti finiti, esistenti e diversi
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx != limiteSx  && limiteDx != y && limiteSx != y ))
                 {
                  //x/Math.abs(x) -> nel punto  0 discontinua
                  disco = "Prima specie";
                  continua = false;
                 }
                 else//uno dei due limiti è infinito o non esiste
                 if( limiteSx <= -infinito || limiteSx >= infinito || limiteDx <=  -infinito || limiteDx >= infinito   )
                 {
                  //1/Math.pow(x,2)     -> nel punto 0 discontinua
                  disco = "Seconda specie";
                  
                  continua = false;
                 }
                 else//limiti finiti e uguali e diversi da y
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx == limiteSx ) )
                 {
                  //(Math.pow(x,2)-4)/(x-2) -> nel punto 2 discontinua
                  disco = "Terza specie";
                  continua = false;
                 }
                
                 i = i + 10e-6;
                }
            }
            text_disco.value = disco;
            
        }        
    </script>
    </head>
    <body onload="inizializza()" >
        <table>
            <tr>
                <td>Funzione<input type="text" id="id_funzione"></td>
                <td>A:<input type="text" id="id_a" value="-1"></td>
                <td>B:<input type="text" id="id_b" value="4" ></td>
            </tr>
            <tr>
                <td>Discontinuità:<input type="text" id="id_disco"></td>
                <td colspan="2"><input type="button" value="verifica" onclick="discontinuita()" ></td>
            </tr>
        </table>
    </body>
</html>

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:40
Domenica, 10/11/2013
Per la prima iterazione:

Funzione: x/Math.abs(x)
A: -1
B: 4

Codice sorgente - presumibilmente Plain Text

  1. limiteDx =  (f_x( i + 10e-7 ))  ; // <-- -1
  2. limiteSx =  (f_x( i - 10e-7 ))  ;  // <-- -1
  3. y = f_x(i); // <-- -1
  4.  
  5. if( limiteDx != y || limiteSx != y) // <-- sempre falso
  6. // ....
  7.  
  8.  i = i + 10e-6; // Mai eseguito = ciclo infinito



Attento inoltre alla tua definizione di infinito.... in Javascript 0/0 == NaN.

Ultima modifica effettuata da pierotofy il 10/11/2013 alle 19:41


Il mio blog: https://piero.dev
PM Quote
Avatar
blujeans (Normal User)
Rookie


Messaggi: 28
Iscritto: 05/10/2013

Segnala al moderatore
Postato alle 22:31
Lunedì, 11/11/2013
function discontinuita()
        {
            text_disco.value="";
            //intervallo [a,b]
            var  Xmin = parseFloat(a.value);//-> valore a
            var  Xmax = parseFloat(b.value);//-> valore b
            var y = 0; //->risultato della funzione  nel punti (i) -> vedi f_x(x)
            var limiteDx = 0; limiteSx = 0;//->risultato del limite Dx e Sx  nel punti (i) -> vedi f_x(x)
            var continua = true;
            var disco = "continua"; // label che indica il tipo di discontinuità
            var infinito = 5e6; // infinito stabilito da me
            i=Xmin;
            while( i<Xmax && continua == true )
            {
             limiteDx =  (f_x( i + 10e-7 ))  ;
             limiteSx =  (f_x( i - 10e-7 ))  ;
             y = (f_x(i));
                            
                //x = continua sempre
                if( limiteDx != y || limiteSx != y) // -> non è sempre falso
                {
                 //1a specie : limiti finiti, esistenti e diversi
                
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx != limiteSx  && limiteDx != y && limiteSx != y ) && ( isNaN(limiteSx) == false && isNaN(limiteDx) == false   ) )
                 {
                  //x/Math.abs(x) -> 0
                  disco = "Prima specie";
                  continua = false;
                 }
                 else//uno dei due limiti è infinito o non esiste
                 if( limiteSx <= -infinito || limiteSx >= infinito || isNaN(limiteSx) == true || limiteDx <=  -infinito || limiteDx >= infinito || isNaN(limiteDx) == true  ;)
                 {
                  //1/Math.pow(x,2)     -> 0
                  disco = "Seconda specie";
                  
                  continua = false;
                 }
                 else//limiti finiti e uguali e diversi da y
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx == limiteSx ) && ( isNaN(limiteSx) == false && isNaN(limiteDx) == false   ))
                 {
                  //(Math.pow(x,2)-4)/(x-2) -> punto 2
                  disco = "Terza specie";
                  continua = false;
                 }
                }
                i = i + 10e-6;
            }
            text_disco.value = disco;
            
        }

se inserisco:
x -> dice che è di prima specie invece è continua
x/Math.abs(x) -> dice che è continua invece è di prima specie
1/Math.pow(x,2)-> dice che è di prima specie invece è seconda
(Math.pow(x,2)-4)/(x-2) ->  dice che è di prima specie invece è di terza

purtroppo non so come risolvere il problema

PM Quote
Avatar
blujeans (Normal User)
Rookie


Messaggi: 28
Iscritto: 05/10/2013

Segnala al moderatore
Postato alle 22:35
Lunedì, 11/11/2013
Testo quotato

Postato originariamente da blujeans:

function discontinuita()
        {
            text_disco.value="";
            //intervallo [a,b]
            var  Xmin = parseFloat(a.value);//-> valore a
            var  Xmax = parseFloat(b.value);//-> valore b
            var y = 0; //->risultato della funzione  nel punti (i) -> vedi f_x(x)
            var limiteDx = 0; limiteSx = 0;//->risultato del limite Dx e Sx  nel punti (i) -> vedi f_x(x)
            var continua = true;
            var disco = "continua"; // label che indica il tipo di discontinuità
            var infinito = 5e6; // infinito stabilito da me
            i=Xmin;
            while( i<Xmax && continua == true )
            {
             limiteDx =  (f_x( i + 10e-7 ))  ;
             limiteSx =  (f_x( i - 10e-7 ))  ;
             y = (f_x(i));
                            
                //x = continua sempre
                if( limiteDx != y || limiteSx != y) // -> non è sempre falso
                {
                 //1a specie : limiti finiti, esistenti e diversi
                
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx != limiteSx  && limiteDx != y && limiteSx != y ) && ( isNaN(limiteSx) == false && isNaN(limiteDx) == false   ) )
                 {
                  //x/Math.abs(x) -> 0
                  disco = "Prima specie";
                  continua = false;
                 }
                 else//uno dei due limiti è infinito o non esiste
                 if( limiteSx <= -infinito || limiteSx >= infinito || isNaN(limiteSx) == true || limiteDx <=  -infinito || limiteDx >= infinito || isNaN(limiteDx) == true  ;)
                 {
                  //1/Math.pow(x,2)     -> 0
                  disco = "Seconda specie";
                  
                  continua = false;
                 }
                 else//limiti finiti e uguali e diversi da y
                 if( (limiteSx <= infinito && limiteSx >= - infinito) && (limiteDx <= infinito && limiteDx >= - infinito) && (limiteDx == limiteSx ) && ( isNaN(limiteSx) == false && isNaN(limiteDx) == false   ))
                 {
                  //(Math.pow(x,2)-4)/(x-2) -> punto 2
                  disco = "Terza specie";
                  continua = false;
                 }
                }
                i = i + 10e-6;
            }
            text_disco.value = disco;
            
        }

se inserisco:
x -> dice che è di prima specie invece è continua
x/Math.abs(x) -> dice che è continua invece è di prima specie
1/Math.pow(x,2)-> dice che è di prima specie invece è seconda
(Math.pow(x,2)-4)/(x-2) ->  dice che è di prima specie invece è di terza

perché i limitedx e limitesx forse sono sempre diversi

purtroppo non so come risolvere il problema


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:21
Lunedì, 11/11/2013
Parti dal primo caso piu' semplice:

Testo quotato


x -> dice che è di prima specie invece è continua



E cerca di capire perche' stai ottenendo il risultato sbagliato.

Stai attento inoltre a quando fai queste comparazioni:

Codice sorgente - presumibilmente Plain Text

  1. limiteDx != y
  2. limiteSx != y
  3. // ecc.



Non bisognerebbe MAI fare comparazioni di questo genere tra float.

Codice sorgente - presumibilmente Javascript

  1. 0.99999999999999999999 != 1 // <-- false



http://floating-point-gui.de/errors/comparison/

Se posso dare un consiglio, riscrivi il codice da zero, dividi il problema in sotto funzioni e testa ogni singola funzione... quando sei sicuro che una parte funziona, prosegui con quella successiva. Consiglierei anche di imparare ad usare un debugger http://developer.chrome.com/extensions/tut_debugging.html .

Ultima modifica effettuata da pierotofy il 11/11/2013 alle 23:24


Il mio blog: https://piero.dev
PM Quote