Newsgroup: it.comp.programmare
Titolo: Derivazione

Salve a tutti. Sapreste indicarmi un algoritmo( da realizzare in c++ ) per
calcolare la derivata di una funzione ? Mi interesserebbe poter calcolare
sia la derivata in forma generale ( sotto forma di funzione ) che in forma
numerica. Grazie a tutti per l'aiuto
Mimmo
--------------------------------
Inviato via 
http://usenet.iol.it

 numerica. Grazie a tutti per l'aiuto
Il problema della derivazione numerica e` appunto solo quello di
stabilita` numerica.  La peggior operazione possibile dal punto di
vista della stabilita` numerica e` la differenza fra numeri molto
vicini fra loro, che inevitabilmente porta alla perdita della grande
maggioranza delle cifre significative con cui partivi; eppure nella
derivazione numerica dalla necessita` di calcoli simili non puoi
sfuggire, proprio per definizione di derivata.  Se puoi, usando una
libreria di arbitraria precisione, come GMP o specificamente MPFR,
e calcolando la tua funzione con parecchie centinaia di bit, qualche
decina di bit di precisione nel risultato puoi anche riuscire a
salvarli, purche` la funzione da cui parti non sia cattivella.  Come
minimo, fai i conti in due precisioni diverse, cosi` hai una indicazione
di quando, tentando di far convergere verso lo zero il delta x,
il risultante delta y finisce per essere troppo sporcato di rumore.
Auguri: e` un problema diabolico.
La derivazione simbolica invece e` una passeggiata, basta partire
da una definizione ovviamente pure simbolica della funzione da
derivare e le regole sono allora semplicissime.  L'unica parte
noiosa e` fare tutte le semplificazioni bene, se si vuole come
risultato un'espressione ben leggibile, senza tanti +0 o *1 a
rompere le scatole.  Ma se quel che ti serve e` solo calcolare il
valore della funzione derivata in uno o piu` punti la semplificazione
non importa, ti basta avere un interprete per la forma simbolica
che vieni a produrre.
Purtroppo il C++ che intendi usare non ha intrinsecamente in se`
alcun interprete, quindi devi scrivertelo (a meno che non trovi
qualcosa di gia` fatto da riusare, naturalmente).  Quindi:
a. definisci il linguaggio relativo alle funzioni di tuo interesse
b. scrivi un parser per questo linguaggio che produca (suggerisco)
    una forma ad albero
c. scrivi la derivata simbolica che consuma e produce detta forma
    ad albero (questa e` la parte piu` facile!)
d. scrivi l'interprete per calcolare una forma ad albero per valori
    dati delle variabili
e. scrivi (se ti serve) la semplificazione e il pretty-printing per
    emettere dalla forma ad albero una forma leggibile di tuo gusto.
Pare di capire che tu stia chiedendo solo di (c), ma quello, fissata
la forma ad albero, e` banale, non merita neppure il nome di
"algoritmo", e` solo una collezione di regole che si studiano alle
superiori.  Usando un linguaggio piu` adatto, come Scheme o
Lisp o Python, i punti a/b/d spariscono e quindi c risalta, ma in C++ 
vedrai se non ti dominano l'intero lavoro.  Se quel che ti serve e`
USARE questo "derivatore" entro un programma C++, e` certo
comunque meno lavoro incorporare un qualche dialetto di Lisp o
Scheme (se la relativa sintassi prefissa e` accettabile) o Python
(se vuoi la normale sintassi infissa, regole di priorita`, ecc ecc),
che non riscriverti linguaggio, parser, e interprete.
Alex