Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41

    [C] zeri di una funzione

    Salve, qualcuno mi saprebbe consigliare una funzione di una qualche libreria per cercare gli zeri di una funzione con precisione alta (tipo > 1.e-50). Grazie ciao.

  2. #2
    Esiste? mmmm..

    Perchè non la realizzi tu? Non è troppo complicata e puoi darle la precisione che vuoi..
    In genere si usa il metodo di bisezione!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    ahem... ahemmmmm^2... diciamo che è uno dei campi di massima ricerca (e massima difficoltà) dell'informatica.

    dipende tutto dalla funzione; la bisezione, ad esempio, va bene per funzioni continue.
    ---
    riguardo poi alla percisione ti segnalo che quella che hai messo è talmente elevata da essere sostanzialmente irrealistica, anche sotto il profilo dell'utilizzo di numeri float "normali" e non a precisione "manualmente superestesa".
    gli errori numerici sono così grandi che, in sintesi, avresti gravissimi problema di stabilità, con eps così piccolo

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Certo che potrei...ma ne ho già una delle numerical recipies che penso sia fatta meglio di qualsiasi funzione io possa scrivere. Per lavorare con precisioni così alte penso ci sia bisogno di qualcosa tipo la BigNum library..ma magari qualcuno conosceva qualcosa di già ottimizzato. grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Toxotes
    Per lavorare con precisioni così alte penso ci sia bisogno di qualcosa tipo la BigNum library..


    Per avere un'idea (alla grossa) di cosa significhi 10^50, è circa 10.000 più grande del rapporto tra il diametro di un atomo e quello dell'intero universo.

    Forse è un livello di precisione... un pochino esagerato!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    molto semplicemente il 1.e-15 o poco più che ho con un double non basta. Almeno penso di aver idenificato questo come problema. La funzione delle nuemerical recipies è un pò strana..sembra che usi un pò bisezione e un pò il metodo di Newton, ora non c'ho dietro il libro e mi sta un pò fatica leggermi tutto il codice. Comunque se conoscete una funzione per il calcolo degli zeri che sapete essere molto precisa vi sarei grato.

    P.S.
    Per avere un'idea (alla grossa) di cosa significhi 10^50, è circa 10.000 più grande del rapporto tra il diametro di un atomo e quello dell'intero universo.
    No scusa ma per fare questi esempi del menga pretendo che tu sia uno studente di fisica
    Io li trovo simpatici, ma infatti studio fisica

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Toxotes
    molto semplicemente il 1.e-15 o poco più che ho con un double non basta. Almeno penso di aver idenificato questo come problema.
    Francamente dubito, senza sapere nulla di nulla direi "a occhio" stabilità
    ...Comunque se conoscete una funzione per il calcolo degli zeri che sapete essere molto precisa vi sarei grato...
    Non vorrei sembrare "saccente", ma... di QUALE funzione?
    "Zeri di funzione" non dice un granchè.

    P.S.
    No scusa ma per fare questi esempi del menga pretendo che tu sia uno studente di fisica
    Io li trovo simpatici, ma infatti studio fisica
    no, non è un esempio del menga, è un esempio (per quanto sia vagamente realistico) sulla base del diametro dell'atomo di elio e il (presunto) diametro dell'universo.
    E no, non sono studente di fisica, o meglio l'ho già studiata

    Per gli zeri invece ho studiato con questo signore (e col suo devastante accento)

    C.Broyden

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    azz...con Broyden in persona?

    Comunque per quanto riguarda il "menga" era solo una battuta...penso di comprendere abbastanza bene quanto è 10^50. cerco soluzioni per un equazione trascendente tipo T=ln(F(T)) e quindi cerco lo zero di T-ln(F(T)).

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Toxotes
    azz...con Broyden in persona?
    ebbene sì
    Comunque per quanto riguarda il "menga" era solo una battuta...penso di comprendere abbastanza bene quanto è 10^50. cerco soluzioni per un equazione trascendente tipo T=ln(F(T)) e quindi cerco lo zero di T-ln(F(T)).
    Ma cos'è F?
    se metti ad esempio
    la somma per i=1...30
    i* xi ^4 + gauss (0,9) la faccenda si complica.

    l'algoritmo "più adatto" dipende da "cosa" puoi fare sulla funzione. I metodi "analitici" richiedono la derivabilità (in realtà spesso differenziabilità), almeno per intervalli convessi.
    se invece hai funzioni "rumorose" i metodi a discesa di gradiente (più o meno "furbi") falliscono miseramente.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    la funzione è derivabile essendo una composizione di esponenziali...è molto lunga e non te la sto a riportare ma ci sono diversi termini che si addizionano/sottraggono con vari membri a dividere quindi potrebbe anche esplodere in qualche punto...non lo so così a occhio. Magari domattina faccio qualche conto. La funzione che sto usando per cercare lo zero comunque è questa:

    codice:
    double rtsafe(void (*funcd)(double, double *, double *), double x1, double x2,
            double xacc)
    {
            void nrerror(char error_text[]);
            int j;
            double df,dx,dxold,f,fh,fl;
            double temp,xh,xl,rts;
    
            (*funcd)(x1,&fl,&df);
            (*funcd)(x2,&fh,&df);
            if ((fl > 0.0 && fh > 0.0) || (fl < 0.0 && fh < 0.0))
                    nrerror("Root must be bracketed in rtsafe");
            if (fl == 0.0) return x1;
            if (fh == 0.0) return x2;
            if (fl < 0.0) {
                    xl=x1;
                    xh=x2;
            } else {
                    xh=x1;
                    xl=x2;
            }
            rts=0.5*(x1+x2);
            dxold=fabs(x2-x1);
            dx=dxold;
            (*funcd)(rts,&f,&df);
            for (j=1;j<=MAXIT;j++) {
                    if ((((rts-xh)*df-f)*((rts-xl)*df-f) >= 0.0)
                            || (fabs(2.0*f) > fabs(dxold*df))) {
                            dxold=dx;
                            dx=0.5*(xh-xl);
                            rts=xl+dx;
                            if (xl == rts) return rts;
                    } else {
                            dxold=dx;
                            dx=f/df;
                            temp=rts;
                            rts -= dx;
                            if (temp == rts) return rts;
                    }
                    if (fabs(dx) < xacc) return rts;
                    (*funcd)(rts,&f,&df);
                    if (f < 0.0)
                            xl=rts;
                    else
                            xh=rts;
            }
            nrerror("Maximum number of iterations exceeded in rtsafe");
            return 0.0;
    }
    dove in funcd i due puntatori puntano uno la funzione (il primo) e l'altro la sua derivata prima. Non ricordo sinceramente se è delle numerical recipies o dove l'ho pescata...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.