PDA

Visualizza la versione completa : [C] Ricerca zeri con bisezione: loop infinito


Gnugnu
21-02-2012, 14:05
Sono sempre io :D
Ho un piccolo problemino... ho scritto una funzione per la ricerca degli zeri di una funzione data per mezzo del metodo di bisezione; facendo il tutto con un ciclo while che continuasse finché l'intervallo dx=b-x fosse stato maggiore o uguale di una precisione da me fissata, non ho avuto problemi.
Ma in teoria l'algoritmo non dovrebbe funzionare anche se come unica condizione nel ciclo while indico che la funzione calcolata nel punto x sia diversa da zero? Cioè continua a ciclare finché f(x)!=0, e si ferma solo quando f(x)=0, cioè quando x è la radice cercata.
Il codice è questo:

/* SUBROUTINE BISEZIONE */
float *bisezione(float *bisez, float a, float b, float dx, float radice, float precisione)
{
/* PER FAR RITORNARE ALLA FUNZIONE DUE VALORI FLOAT ALLOCO DINAMICAMENTE UN ARRAY DI DUE FLOAT */
bisez=(float*) malloc(2*sizeof(float));
radice=(a+b)/2;
while (((fabs(funzione(radice)))!=0))
{
printf("\nf(radice)= %1.1f; x= %1.1f; funzione(a)=%1.1f; funzione(x)=%1.1f;",fabs(funzione(radice)),radice,funzione(a),funzion e(radice));
if ((funzione(a)*funzione(radice))<=0)
{
printf("\nfunzione(a)*funzione(x)<=0\n");
/*a=a;*/
b=radice;
} else {
printf("\nfunzione(x)*funzione(b)>0\n");
a=radice;
/*b=b;*/
}
dx=b-a;
radice=(a+b)/2; /*dopo n interazioni si considera questa come radice*/
}
bisez[0]=dx;
bisez[1]=radice;
return bisez;
}
E la funzione di cui trovare gli zeri in questo caso è:

/* FUNZIONE DA STUDIARE */
float funzione(float x)
{
return (-1-pow(x,2)+4*sqrt(x));
}
Dov'è che sbaglio? :-(
Continua a ciclare all'infinito scrivendo sempre:

funzione(x)*funzione(b)>0

f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
funzione(x)*funzione(b)>0

f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
funzione(x)*funzione(b)>0

f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
funzione(x)*funzione(b)>0
...

Gnugnu
21-02-2012, 19:55
Ok mi sono risposta da sola :D
Grazie lo stesso :P

alka
22-02-2012, 10:24
Originariamente inviato da Gnugnu
Ok mi sono risposta da sola :D
Grazie lo stesso :P

In genere, lo spirito del forum suggerisce di riportare la soluzione trovata, in modo che possa essere utile a chiunque dovesse trovarsi ad affrontare il medesimo problema. :stordita:

Loading