Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Problema sulla ricorsione

    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.

  2. #2
    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 ^^

  3. #3
    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 . 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 .

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  5. #5
    Infatti : y(0)=2 e y(3)=-1 . Non mi pare che gli estremi siano di segno opposto . :master:

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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)"

  7. #7
    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:

    codice:
    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 */

  8. #8
    appurato che a me hanno dato lo stesso identico esercizio

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

    codice:
    #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*/

  9. #9
    Grazie.

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.