Oppure

Loading
17/05/10 12:13
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!
Ultima modifica effettuata da xshell32 17/05/10 12:14
aaa
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!

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ì:

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ì:

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:
...
...
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