blujeans (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/10/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;
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
|
|
blujeans (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/10/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>
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Per la prima iterazione:
Funzione: x/Math.abs(x)
A: -1
B: 4
Codice sorgente - presumibilmente Plain Text |
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 il 10/11/2013 alle 19:41
|
|
blujeans (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/10/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
|
|
blujeans (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/10/2013
|
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
|
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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:
Codice sorgente - presumibilmente Plain Text |
limiteDx != y
limiteSx != y
// ecc.
|
Non bisognerebbe MAI fare comparazioni di questo genere tra float.
Codice sorgente - presumibilmente Javascript |
0.99999999999999999999 != 1 // <-- false
|
Ultima modifica effettuata da pierotofy il 11/11/2013 alle 23:24
|
|