apatriarca ha scritto:Che cosa intendi dire con "far inserire una funzione qualsiasi"? Vuoi che l'utente inserisca la funzione come stringa? Se è così allora è necessario implementare un parser che legga la stringa e ne interpreti l'espressione. Potrebbe essere sufficiente un "recursive descent parser" o qualcosa come gli algoritmi "shunting yard" o "precedence climbing".
Per quanto riguarda la derivazione della funzione, avendo accesso all'espressione simbolica potresti fare di meglio rispetto a quello che stai facendo ora. Il metodo più semplice fa uso di un sistema numerico chiamato "numeri duali". Sono numeri simili ai numeri complessi, in cui la base \(\epsilon\) ha la proprietà \(\epsilon^2 = 0.\) Sono cioè numeri nella forma \( a + b\,\epsilon \) con le seguente operazioni:
\[ (a + b\,\epsilon) + (c + d\,\epsilon) = (a + c) + (b + d)\,\epsilon \quad \mathrm{e} \quad (a + b\,\epsilon)\,(c + d\,\epsilon) = a\,c + (a\,d + b\,c)\,\epsilon. \]
Se in questa espressione supponiamo che il coefficiente di \(\epsilon\) sia la derivata e l'altro sia il valore calcolati nello stesso punto, vediamo che le formule sopra corrispondono alla somma e prodotto di derivate. Estendendo la definizione delle varie funzioni che ci interessano a questo sistema numerico possiamo quindi calcolare derivata e valore di una espressione generica usando semplicemente questi numeri invece dei numeri reali. Per esempio, supponiamo di voler calcolare \(x^2 + \cos(x)\) usando questo metodo. Definiamo \(\cos(a + b\,\epsilon) = \cos(a) - \sin(a)\,b\,\epsilon\). Facendo i calcoli si vede quindi che
\[\begin{align*}
(x + \epsilon)^2 + \cos(x + \epsilon) &= x^2 + 2\,x\,\epsilon + \cos(x) - \sin(x)\,\epsilon \\ &= \bigl(x^2 + \cos(x)\bigr) + \bigl( 2\,x - \sin(x) \bigr)\,\epsilon.
\end{align*}\]
Nota che ho scelto la derivata del valore \(x\) uguale a \(1\). Nota inoltre che anche se ho svolto i calcoli per mostrarti il risultato, il calcolo delle derivate con questo metodo è automatico e numerico. L'unico aspetto importante è quello di aver definito le varie funzioni per lavorare con questo sistema numerico.
Esiste anche un altro metodo di derivazione che funziona al contrario e che fa uso della formula di derivazione delle funzioni composte. Consiste nel costruirsi una specie di grafo da cui ricavare tutte le formule. Il metodo con i numeri duali è molto più semplice per cui non aggiungo altro su questo metodo a meno che tu non sia interessato.
#include <iostream>
#include <math.h>
using namespace std;
float funzione(float x){
return 6*sin(x)+2*powf(x,2)+3*x+1;
}
int main(){
float d=0,d1,x,x1;int n;
cout << "Calcolo della derivata nel punto x="; cin >> x1;
for(n=0;n<10;n++){
d1=d;x=x1+powf(.5,n);d=(funzione(x) - funzione(x1))/(x-x1);}
cout << "La derivata nel punto x="<<x1<<" e' uguale a "<<2*d-d1<< endl;
system("pause");}
Il codice precedente l'ho scritto seguendo questo codice che abbiamo scritto in classe. Ma non ho ben capito in questo codice cosa vogliono dire queste tre stringhe nell'ambito delle derivate.
for(n=0;n<10;n++){
d1=d;x=x1+powf(.5,n);d=(funzione(x) - funzione(x1))/(x-x1);}
cout << "La derivata nel punto x="<<x1<<" e' uguale a "<<2*d-d1<< endl;
Grazie.