17/05/10 15:44
Xaratroom
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!
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
aaa
19/05/10 9:37
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ì:
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é?
double derivative(double (*f)(double), double x) { double v=x+macheps(); return (f(v)-f(x))/(v-x); }
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é?
aaa
21/05/10 16:48
Xaratroom
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ì:
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é?
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ì:
double derivative(double (*f)(double), double x) { double v=x+macheps(); return (f(v)-f(x))/(v-x); }
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 22/05/10 12:57
aaa
22/05/10 8:33
Premoli
ciao se il tuo intento è calcolare la derivata in punto potresti fare una cosa del genere:
prova un po'
... ... for(i=0; i<10; i++) { der_1=der; v=x+pow(.5, i); der=(f(v)-f(x))/(v-x); } printf("La derivata %f\n", x, 2*der-der_1);
prova un po'
aaa