Sono sempre io
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:
E la funzione di cui trovare gli zeri in questo caso è:codice:/* 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),funzione(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; }
Dov'è che sbaglio? :-(codice:/* FUNZIONE DA STUDIARE */ float funzione(float x) { return (-1-pow(x,2)+4*sqrt(x)); }
Continua a ciclare all'infinito scrivendo sempre:
codice: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 ...


Rispondi quotando
