E' da un bel po che devo scrivere un programma che mi calcoli la radice cubica di un qualsiasi float inserito dall'utente a tempo di esecuzione.
Allora sono partito dall'idea di usare il metodo dicotomico,in questo modo:
x e' la radice cubica del numero y ( x = y^(1/3) )
Elevo entrambi i membri al cubo: x^3 = y
e quindi arrivo all'equazione x^3 -y = 0
con y come parametro e parto da qui.
Definisco una costante ERR:
#define ERR 0.00001
e dichiaro:
float a,b,m,y;
float fa,fb,fm;
Una bozza di codice potrebbe essere questa:
codice:
printf("Inserire y: ");
scanf("%f",&y);
/* validita a e b */
do {
printf("Inserire a: ");
scanf("%f",&a);
printf("Inserire b: ");
scanf("%f",&b);
fa=a*a*a-y; /* calcolo di f per x=a */
fb=b*b*b-y; /* calcolo di f per x=b */
} while (fa*fb>0);
/* calcolo zero f */
do {
m=(a+b)/2;
fm=m*m*m-y; /* calcolo di f per x=m */
if (fm!=0) {
fa=a*a*a-y; /* calcolo di f per x=a */
fb=b*b*b-y; /* calcolo di f per x=b */
if (fa*fb<0) b=m; else a=m;
}
} while (fabs(fm)>ERR);
nel modello da cui ho tratto spunto e che serviva a trovare lo zero di una funzione, nel blocco che fa riferimento
a if (fm!=0) come ultima istruzione c'era un secondo fm=m*m*m-y; /* calcolo di f per x=m */
che ho eliminato perche' secondo me non aveva senso.
Avevo fatto anche un disegno a mano libera, per capire come doveva essere impostato il programma.
Il mio dubbio riguarda principalmente la parte sulla validita' di a e b:
cioe' l'utente come fa a capire come mettere gli a e b giusti in modo da ottenere gli fa e fb discordi, per poi cosi cominciare con il metodo dicotomico?
C'e' un modo carino per risolvere questa cosa anche dal punto del dialogo del programma con l'utente?
Vi ringrazio se vorrete rispondere.