Newsgroup: it.comp.lang.c
Titolo: Problemi con le derivate in c

Salve a tutti...
Sto facendo un'applicazione in c che elabori dei segnali..
Questi segnali li vado a memorizzare in due array (in uno metto la x, e
nell'altro il rispettivo valore delle y)..
Adesso ho la necessità di calcolare la derivata di questo segnale...
Ho cercato del materiale su internet, ma non ne ho trovato che fa al
caso mio..
Potreste aiutarmi..
Grazie..

 ha scritto nel messaggio
news:1148075557.9...@j33g2000cwa.googlegroups.com...

Grazie..
In math.h non c'è niente?
L'alternativa è scriverti una funzioncina che ti calcoli la derivata
puntuale in modo numerico..


netlib
oppure
numerical recipes
oppure cerca per
numerical differentiation
il primo link e'
http://mathworld.wolfram.com/NumericalDifferentiation.html
chiaramente se hai una funzione 'tabellata' potrai solo ottenere una 
approssimazione del valore della derivata

Grazie..
prova così:
#include <stdio.h>
#include <math.h>
double func(double);
double derivate(double (*)(double),double,double);
int main(){
    double epsilon=1.;
    printf ("epsilon   derivata \n\n");
    while (epsilon > 1.e-18){
    derivate(func, 1., epsilon);
    epsilon/=10;
    }
double func (double x) {
scrivi qui la tua funzione
}
double derivate (double (*f)(double), double x, double epsilon){
return (f(x+epsilon)-f(x)/epsilon;
}
}
Ciao 

Grazie per l'interessamento, ma non posso utilizzare questo sistema
perche non ho l'espressione della funzione...
La mia funzione è semplicemente formata da due array, uno contiene i
valori delle x e l'altro i rispettiva valori delle y..
Avresti qualche altra soluzione..
Grazie..

Potresti indicarmi a grandi linee un'algoritmo
Grazie


determini un polinomio interpolatore di ordine adeguato che passa per  N 
punti intorno al punto in cui sei interessato al calcolo della derivata 
ed usi la sua derivata ( che puoi calcolare analiticamente ) come una 
stima della derivata nel punto .

io sai come sto provando a fare..
prendo un punto successivo a quello di interesse nell'array delle y, e
lo sottraggo con il punto di interesse.
Faccio la stessa cosa per quanto riguarda le x, e poi divido i due
risultati..
A me serva fare questo perchè sto facendo un software che elabore
segnali medici, e ho la necessità di trovare i massimi..
Il problema di questo sistema è che se ho variazioni piccole, non
riesco a rilevarle..
La tua soluzione mi sembra un po troppo macchinosa, considerando il
fatto che io devo analizzare tutto il segnale, e trovari tutti i punti
in cui la derivata si annulla..


il problema di fondo e' che tu non hai a disposizione 'funzioni' ma 
sequenze di dati e questo limita un po' le possibilita' di elaborazione, 
come te ne sarai accorto
sarebbe d'uopo che consultassi qualche testo di calcolo numerico e di 
analisi dei segnali
comunque non si puo' avere la moglie ubriaca e la botte piena
la formula che stai usando: dy(x0) = (y1-y0)/(x1-x0)
e' l'approssimazione di ordine piu' basso dell'algoritmo che ti ho 
descritto , nno c'e' bisogno che il polinomio interpolatore sia di 
ordine elevato puo' bastare anche 4-6, esistono algoritmi molto 
efficienti per la determinazione dei coefficienti di questo polinomio.
attento che il punto di massimo ti puo' capitare a cavallo di ascisse 
che hai.
se i massimi ( minimi ) li che coincidano nelle ascisse a tua 
disposizione allora l'algoritmo e' ancora piu' banale e non richiede 
l'uso delle derivate
ultima cosa: potrebbe essere interessante derivare la 'funzione' ( piu' 
precisamente la sequenza di punti ) tramite unpassaggio nel dominio di 
Fourier

 Potresti indicarmi a grandi linee un'algoritmo
La risposta datati da mmm è molto più esauriente di quanto avesse potuto
esserlo la mia.
Cmq io avevo esattamente l'idea di applicare la definizione di
derivata,proprio come hai fatto tu..
Ottimo il metodo del polinomio di Taylor propostoti,non ci avevo pensato.

Senti un'altra cosa..
Potrei usare un'approssimazione di ordine più alto (Mi indichi la
formula)..
Mi spieghi meglio il fatto che i massimi possono coincidere con i punti
a disposizione..
Questo fatto potrebbe interessarmi soprattutto se posso eliminare l'uso
delle derivate, e
riuscire a trovare tutti i massimi (minimi)..
Scusami se ti faccio domande stupide, ma sono un ragazzo e non ho tanta
esperienza


secondo me non si può scrivere un programma di analisi dei segnali senza
conoscere un minimo di calcolo numerico.. il mio consiglio è di sfogliare
qualche libro, su internet trovi la versione libera di numerical recipes
(in c, fortran e forse qualche altro), se no vai nella biblioteca del
dipartimento di fisica o di matematica della tua città e ti cerchi un
libro di analisi numerica o di fisica computazionale (io ti consiglio
questo perchè analizza più casi pratici e specula meno sulle basi
matematiche, magari il landau o il gould)..
comunque per fare le derivate numeriche la funzione non ti serve perchè
invece di "valutare la funzione" nei punti che ti interessano hai già la
funzione valutata.. al massimo puoi interpolare al primo o al
second'ordine tra i punti.. 
ti consiglio cmq di continuare come stavi facendo: per ogni coppia di punti
ti calcoli dx e dy, dividi e ti salvi il risultato, vai alla coppia
successiva fai lo stesso e poi fai il prodotto dei due risultati se questo
è minore di zero evidentemente la "derivata" ha cambiato il segno e hai un
massimo o un minimo..
non puoi semplicemente cercare punti a derivata nulla perchè raramente i
rapporti incrementali tra dati discreti si annullano, probabilmente
infatti il massimo o il minimo sta tra due dei tuoi punti e per trovarlo
dovrai usare il metodo di prima e magari interpolare linearmente per avere
una stima del valore del segnale/funzione in quel punto..
-- 
[Filippo...........................]
[Linux User #342745................]
        ==[...penguin powered...]==

ciao ..
Sto provando a fare un'altra cosa..
Cioè mi calcolo per ogni coppia di punti il dx e dy, e memorizzo
questi rislutati in un array..
Dopo analizzo il vettore, e considero le variazioni..
Nel punto di variazione ho un minimo (se ho una variazione - +) o un
massimo se succede il caso inverso..
Solo che così non riesco a trovare tutti i punti..
Forse sbaglio qualcosa...
Hai ragione che dovrei studiare qualcosa di calcolo numerico...
Ma purtroppo non ho molto tempo, e credevo che su internet si poteva
reperire facilmente qualche
libreria che potesse fare al caso mio..
Purtroppo non ne ho trovata..
Tu ne conosci qualcuna....

Ho capito e ho provato una soluzione che per adesso sembra
funzionare...
Faccio la differenza tra (y - y0) e la divido per (x - x0), memorizzo i
valori in un'array ,
e studio i segni...
In effetti, il mio segnale deriva da un processo di campionamento
precedente,
per cui io ho tutti i valori distanti 1/fc..
L'argomento lo sto sviluppando per una tesi...
Anzi ti ringrazio tanto per l'aiuto..
Se vuoi appena la termino te ne invio una copia..

 Tu ne conosci qualcuna....
ti assicuro che non serve.. quello che vuoi fare se il tuo segnale non ha
grosse discontinuità è di una banalità pazzesca rileggiti quello che ti ho
scritto:
per ogni coppia di punti calcoli il rapporto incrementale (x1-x0/y1-y0) e
te lo salvi, al passaggio successivo lo confronti con il precedente
esattamente come hai fatto tu (- + max, + - min), una volta trovati una
coppia di punti candidata a contenere un max/min fai una semplice
interpolazione lineare tra i due per avere una stima del punto effettivo..
è una formuletta semplice semplice la trovi pure su wikipedia..


 
in bocca al lupo
giusto per curiosita' , dove ?

Al politecnico di milano..

 funzione assegnata
Sì,in effetti è così,hai ragione.. sono andato "a naso" pensando fosse una
generalizzazione di esso..