[C] calcolo derivata

tonno16
salve a tutti. Volevo una mano per quanto riguarda un problema di gestibilità a livello di codice nel seguente problema:

devo scrivere un programma che risolva le derivate prime di una funzione presa in input. Quando scrivo risolva intendo a livello algebrico. Non una derivata calcolata in un punto.

quindi x^4 diventerà 4*x^(4-1)

specifico che in input non abbiamo la classica funzioncina x^3+cos(x)-45x.
ho invece il tutto con notazione prefissa del tipo: plus(pow(x,3), times(4,minus(3,1)

quindi per esempio: pow(base,exp) deve diventae times(exp, pow(base,exp-1)

Il tutto viene gestito con array,e fin qui non ci piove. Ma non so più dove sbattere la testa, non mi vengono in mente idee.
come gestire il tutto? forse chiedo troppo?

Risposte
claudio862
Mi sembra un esercizio classico sulle strutture ricorsive. Devi rappresentare una generica espressione come un albero, le cui foglie sono costanti o variabili, e i nodi interni delle sottoespressioni. Un'espressione può o meno avere sottoespressioni.

x³ + 4×(3-1)

plus(pow(x,3), times(4,minus(3,1)


             plus
    pow                  times
  x     3             4         minus
                              3       1


A questo punto puoi definire le regole di derivazione per ogni tipo di espressione:

Derivata(e1 + e2) = Derivata(e1) + Derivata(e2)
Derivata(plus(e1, e2)) = plus(Derivata(e1), Derivata(e2))

Derivata(e1 ^ a) = a * e1 ^ (a-1) * Derivata(e1)
Derivata(pow(e1, a)) = times(times(a, pow(e1, minus(a,1))), Derivata(e1))
(dovrebbe essere questa la formula più generica per un'espressione esponenziale, la tua assume che e1 sia una variabile)

Derivata(costante) = 0

Derivata(variabile) = 1 (se è la stessa variabile di derivazione)

...


In un linguaggio che supporta l'ereditarietà potresti definire una classe base astratta Expression da cui derivino le varie classi concrete Plus, Minus, Pow, Constant, Variable… che implementano diversamente il metodo Derivata().

In C, dove il polimorfismo è ben poco supportato, potrebbe essere un po' più complicato. Potresti avere tante struct Plus, Minus, Pow, Constant, Variable… e rappresentare un'espressione come una struct {int, void*}. L'intero definisce il tipo di espressione (ancora, Plus, Minus, Pow, Constant, Variable…), mentre il puntatore a void contiene l'espressione vera e propria. Nella funzione Derivata() controlli quale sia l'espressione e casti il puntatore a void al puntatore alla giusta struct.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.