Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Calcolo derivate funzioni
Forum - C/C++ - Calcolo derivate funzioni

Avatar
xshell32 (Normal User)
Rookie


Messaggi: 34
Iscritto: 08/02/2008

Segnala al moderatore
Postato alle 14:13
Lunedì, 17/05/2010
Buongiorno a tutti. Sto creando un programma che calcoli gli zeri di una funzione matematica con i diversi metodi a disposizione (Bisezione, Regula Falsi, Newton-Raphson, ecc...). Passo l'espressione attraverso un puntatore a funzione... ma in uno dei metodi per calcolare gli zeri (Newton-Raphson) ho bisogno della derivata della funzione. Quindi ho semplicemente calcolato a mano la derivata e ho passato anche quest'ultima attraverso un puntatore a funzione. Mi piacerebbe però che il mio programma riuscisse a calcolare autonomamente le derivate delle funzioni passate... Ho pensato di utilizzare la definizione di rapporto incrementale... però non saprei come scriverla in linguaggio C (i limiti di una funzione)... Qualcuno mi potrebbe gentilmente aiutare?

Rapporto incrementale: lim h-->0 [(f(x0+h)-f(x0))/h] (valore della derivata nel punto x0).

Grazie in anticipo!

Ultima modifica effettuata da xshell32 il 17/05/2010 alle 14:14
PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 17:44
Lunedì, 17/05/2010
Testo quotato

Postato originariamente da xshell32:

Buongiorno a tutti. Sto creando un programma che calcoli gli zeri di una funzione matematica con i diversi metodi a disposizione (Bisezione, Regula Falsi, Newton-Raphson, ecc...). Passo l'espressione attraverso un puntatore a funzione... ma in uno dei metodi per calcolare gli zeri (Newton-Raphson) ho bisogno della derivata della funzione. Quindi ho semplicemente calcolato a mano la derivata e ho passato anche quest'ultima attraverso un puntatore a funzione. Mi piacerebbe però che il mio programma riuscisse a calcolare autonomamente le derivate delle funzioni passate... Ho pensato di utilizzare la definizione di rapporto incrementale... però non saprei come scriverla in linguaggio C (i limiti di una funzione)... Qualcuno mi potrebbe gentilmente aiutare?

Rapporto incrementale: lim h-->0 [(f(x0+h)-f(x0))/h] (valore della derivata nel punto x0).

Grazie in anticipo!


No il rapporto incrementale non va bene (a meno che il tuo programma non riesca a risolvere limiti in forma indeterminata): devi procedere con delle sostituzioni.
Ad esempio:
x^n --> nx^(n-1)
P(x)*Q(x) --> P'(x)*Q(x) +P(x)*Q'(x)
etc


bool Woman::makeYourselfBetter() {
       goto bathroom;

bathroom:
       while (1);

       return this->_isGoodResult();
}
PM Quote
Avatar
xshell32 (Normal User)
Rookie


Messaggi: 34
Iscritto: 08/02/2008

Segnala al moderatore
Postato alle 11:37
Mercoledì, 19/05/2010
Grazie per la risposta. Io dovrei calcolare la derivata della funzione in un determinato punto X. Non basterebbe inserire l'epsilon macchina al posto della H del rapporto incrementale? E' necessario che il mio programma riesca a risolvere i limiti in forma inderminata? Perché calcolarla tramite sostituzioni sarebbe un procedimento quasi "manuale"... Non esiste altro modo? In effetti, ho provato a calcolare la derivata nel punto 0, 1 e 2 della funzione x^2+0,1x-1 così:

Codice sorgente - presumibilmente C#

  1. double derivative(double (*f)(double), double x)
  2. {
  3.         double v=x+macheps();
  4.         return (f(v)-f(x))/(v-x);
  5. }



Dove macheps() è la precisione macchina. I risultati corretti dovrebbero essere rispettivamente 0,1 - 2,1 - 4,1... invece il programma restituisce i seguenti valori: 3432480,1 - 3432482,1 - 3432484,1 Come se al risultato corretto fosse sommato 3432480... Perché?

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 18:48
Venerdì, 21/05/2010
Testo quotato

Postato originariamente da xshell32:

Grazie per la risposta. Io dovrei calcolare la derivata della funzione in un determinato punto X. Non basterebbe inserire l'epsilon macchina al posto della H del rapporto incrementale? E' necessario che il mio programma riesca a risolvere i limiti in forma inderminata? Perché calcolarla tramite sostituzioni sarebbe un procedimento quasi "manuale"... Non esiste altro modo? In effetti, ho provato a calcolare la derivata nel punto 0, 1 e 2 della funzione x^2+0,1x-1 così:

Codice sorgente - presumibilmente C#

  1. double derivative(double (*f)(double), double x)
  2. {
  3.         double v=x+macheps();
  4.         return (f(v)-f(x))/(v-x);
  5. }


Dove macheps() è la precisione macchina. I risultati corretti dovrebbero essere rispettivamente 0,1 - 2,1 - 4,1... invece il programma restituisce i seguenti valori: 3432480,1 - 3432482,1 - 3432484,1 Come se al risultato corretto fosse sommato 3432480... Perché?


Scusa per il ritardo.
No, non va bene.
"L'h" del rapporto incrementale deve necessariamente tendere a zero (altrimenti non è un rapporto incrementale).

Ultima modifica effettuata da Xaratroom il 22/05/2010 alle 14:57


bool Woman::makeYourselfBetter() {
       goto bathroom;

bathroom:
       while (1);

       return this->_isGoodResult();
}
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 10:33
Sabato, 22/05/2010
ciao se il tuo intento è calcolare la derivata in punto potresti fare una cosa del genere:
Codice sorgente - presumibilmente Plain Text

  1. ...
  2. ...
  3. for(i=0; i<10; i++)
  4. {
  5.    der_1=der;
  6.    v=x+pow(.5, i);
  7.    der=(f(v)-f(x))/(v-x);      
  8. }
  9. printf("La derivata %f\n", x, 2*der-der_1);



prova un po'

PM Quote