Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Algoritmo particolare

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61

    Algoritmo particolare

    Ciao ragazzi,

    ho cercato un pò in rete ma senza risultati soddisfacenti, spero qui possiate aiutarmi...

    Cercavo degli esempi di codice (possibilmente in C o C++ ma non è fondamentale il linguaggio) relativi ad algoritmi per la risoluzione di equazioni non lineari del tipo f(x)=0 sviluppati con metodi ibridi (tipo Dekker-Brent).

    Mi rendo conto della particolarità della richiesta, quindi è rivolta solo a qualcuno che eventualmente abbia già avuto a che fare con il problema specifico.

    Grazie a chiunque voglia aiutarmi...

  2. #2
    L'algoritmo che chiedi è alquanto complesso....questo è un po semplificato...

    Voglio combinare opportunamente i metodi di bisezione e secanti in modo da generare una successione di intervalli contenente la radice x*.
    L'algoritmo usa ad ogni passo tre punti :
    a= penultima approssimazione calcolata
    b= ultima approssimazione
    c=punto piu recente tale che x* cade nell intervallo (b,c)

    Parto da due valori iniziali a e b tali che f(a)f(b) <0, pongo c=a e applico il metodo delle secanti, se il punto ottenuto da una approssimazione non buona si usa il metodo di bisezione.

    Al passo successivo la nuova approssimazione è
    bnew= ottenuto con metodo secanti applicato ad a eb se bnew appartiene all intervallo (b,c) e se f(b)!=f(a)

    altrimenti

    bnew= ottenuto con bisezione applicato ad (b,c)

    Il nuovo intervallo sarà (b,bnew) o (bnew,c) a seconda di dove cade lo zero ; cosi il nuovo intervallo e il piu piccolo tra quelli calcolati contenente la radice.

    codice:
    fa=f(a);
    fb=f(b);
    nit=0;
    if (fa*(fb/|fb|)) > 0 then stop
    else
    c=a
    while (|b-c|) > TOL|b| and |fb|>TOLF and nit <NMAX
    nit = nit+1
    if (fb |= fa ) then
    d=fb(b-a)/(fb-fa)
    if(sign(d)|=sign(b-c) or |d|>|b-c) then   //b-d non appartiene(b,c)
    d=.5(b-c)
    endif
    else
    d=.5(b-c)
    endif
    a=b;
    fa=fb;
    b=b-d;
    fb=f(b);
    if (fax(fb/|fb|))<0 then
    c=a
    endif
    endif
    endwhile

    fa*fb < 0 va effettuato per evitare l underflow...se ad esempio fai che fa=10^-30 fb=-10^-30 si ha che fa*fb = underflow ed e posto a zero vanificando il test.
    Il test (Sign(d)|=sign(b-c) or |d| > |b-c|) verifica che b-d non appartiene a(b,c), qualunque sia l ordine delgi estremi ;
    infatti se b<c(b-c<0) si ha che b-d non appartiene all intervallo(b,c) se d>0 o se d<0 e|d|>c-b, se invece b>c(b-c>0) si ha che b-d non appartiene all intervallo (b,c) quando d<0 o quando d>0 e d> b-c, da cui il test.

    In matlab ti ricordo la funziona fzero, che calcola lo zero di una funzione basata proprio sull algoritmo di dekker brent
    Si usa cosi z=fzero('fun',x0,tol)


  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61
    Gentilissimo per la risposta, ma non mi spiego un paio di cose:

    if(fa*(fb/|fb|))>0 si bloccherebbe spesso e volentieri per "divisione per zero";

    sign dove è implementata?

    tol e tolf sono tolleranza sul punto e sulla funzione nel punto?

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.