PDA

Visualizza la versione completa : Implementare una funzione ricorsivamente


devil89
04-05-2006, 21:53
Vorrei risolvere tramite ricorsione questo problema:

Sono dati una funzione double f(double x) continua e due valori a,b tali che f(a) * f(b) < 0.
Trovare un valore z tale che a < z < b e che f(z) = 0.

Potreste darmi una mano?

Quello che sono riuscito a dedurre che:
- a e b sono di segno discordi (perch il loro prodotto < 0)
- pensando alla rappresentazione grafica su asse cartesiano, con una funzione dovremmo trovare il punto medio z di questi a e b.

La funzione che dice che abbiamo gi una funzione che non da progettare.

ReNeSiS
04-05-2006, 22:25
Sto problema esatto mi si present di frotne un anno fa,per me stiamo facendo la stessa scuola ^_^
E come un anno fa, ti riporto la mia considerazione: non saprei come risolvero attualmente ^^

king64
04-05-2006, 23:06
Se la memoria non mi inganna quello che dici tu non un problema ma un teorema sulle funzioni continue , che dice pi o meno cos : data una funzione continua f che assume valori di segno opposto in un intervallo di valori (a,b) del dominio , allora si annulla in un punto c contenuto nell'intervallo. Sono parecchi anni che non tocco un libro di analisi matematica . :D Inoltre le tue osservazioni non sono del tutto corrette in quanto :

- non detto che a e b siano di segno opposto . Ad es. la funzione y=2-x si annulla nell intervallo [0,3] .
- inoltre il punto in cui si annulla la funzione non detto che sia il punto medio dell'intervallo .

oregon
05-05-2006, 00:43
Quello che hai scritto viene garantito dal teorema di Bolzano-Weierstrass.

La tua prima affermazione e' corretta. Sulla questione del punto medio, non e' affatto detto che il punto medio intersechi l'asse x.

Per il metodo, suggerirei di operare cosi'

1) trova il punto medio dell'intervallo e calcola in quel punto la funzione
1a) se e' zero hai terminato
2) ripeti dal punto 1 prendendo l'intervallo determinato da questo punto medio e quello dei due precedenti (a oppure b) in cui il segno e' discorde

Per esempio, se

f(a)>0 e f(b)<0

e nel punto medio

f(m) >0

ripeti prendendo l'intervallo (m,b)

Se invece nel punto medio

f(m) <0

ripeti prendendo l'intervallo (a,m)

Tutto cio' in maniera ricorsiva.

@king ... la funzione che ha indicato e >0 in a e <0 in b ... Non devono essere a e b di segno opposto ma i valori della funzione nei punti estremi dell'intervallo.

king64
05-05-2006, 07:34
Infatti : y(0)=2 e y(3)=-1 . Non mi pare che gli estremi siano di segno opposto . :master:

oregon
05-05-2006, 11:46
S King, avevo letto male la prima affermazione di devil89, ovvero la

"a e b sono di segno discordi (perch il loro prodotto < 0)"

che e' evidentemente sbagliata. Quella corretta e'

"f(a) e f(b) sono di segno discordi (perch il loro prodotto < 0)"

devil89
05-05-2006, 16:06
Originariamente inviato da oregon
S King, avevo letto male la prima affermazione di devil89, ovvero la

"a e b sono di segno discordi (perch il loro prodotto < 0)"

che e' evidentemente sbagliata. Quella corretta e'

"f(a) e f(b) sono di segno discordi (perch il loro prodotto < 0)"

Si, ho sbagliato a scrivere. Comunque ho risolto il problema.
Vi posto il codice cos potete guardarlo:



double funz (double a, double b) {
double m=(a+b)/2, fm = f(m), fa;
if (isZero(fm))
return m;
else {
fa=f(a);
if ((fa<0 && fm<0) || (fa>0 && fm>0))
return ........
else
return .................
} /* if - else */
} /* funz */

ascatem2
07-05-2006, 21:04
appurato che a me hanno dato lo stesso identico esercizio :D

ecco la soluzione che proposi al tempo (il metodo usato quello della bisezione):



#define EPS 0.000000000000001

/* I x valore da valutare
R esito se zero o no */
int zero(double x){
return fabs(x)<EPS;
}/*zero*/

/* I1 a primo parametro
I2 b secondo parametro
R m valore per cui si azzera la funzione */
double bisez(double a,double b){
if(zero(f((a+b)/2)))
return (a+b)/2;
else
if(f((a+b)/2)<0)
return bisez((a+b)/2,b);
else
return bisez(a,(a+b)/2);
}/*bisez*/

devil89
07-05-2006, 21:08
Grazie.

Anch'io comunque l'ho risolto cos e fortunatamente era giusto.
Altrimenti, come saprai, Giunta non perdona con i meno (----) sul registro.

Loading