Oppure

Loading
09/11/13 23:10
blujeans
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;
aaa
10/11/13 3:30
pierotofy
Partirei dalla definizione di discontinuita' ( math.brown.edu/UTRA/… ) dopodiche' deciderei un numero arbitrario di precisione N ( 10^-6 ? en.wikipedia.org/wiki/… ), 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: piero.dev
10/11/13 15:58
blujeans
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>
aaa
10/11/13 18:40
pierotofy
Per la prima iterazione:

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

limiteDx =  (f_x( i + 10e-7 ))  ; // <-- -1 
limiteSx =  (f_x( i - 10e-7 ))  ;  // <-- -1
y = f_x(i); // <-- -1

if( limiteDx != y || limiteSx != y) // <-- sempre falso
// ....

 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 10/11/13 18:41
Il mio blog: piero.dev
11/11/13 21:31
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

purtroppo non so come risolvere il problema
aaa
11/11/13 21:35
blujeans
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
aaa
11/11/13 22:21
pierotofy
Parti dal primo caso piu' semplice:

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:

limiteDx != y
limiteSx != y
// ecc.


Non bisognerebbe MAI fare comparazioni di questo genere tra float.

0.99999999999999999999 != 1 // <-- false


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 developer.chrome.com/extensions/… .
Ultima modifica effettuata da pierotofy 11/11/13 22:24
Il mio blog: piero.dev