Sì, è abbastanza possibile. Tuttavia, la soluzione dipende dalle tue esigenze. Se avete bisogno di una semplice soluzione numerica, quanto segue farà (in una certa misura, con alcuni vincoli - implementazione ingenuo):
double derive(double (*f)(double), double x0)
{
const double delta = 1.0e-6; // or similar
double x1 = x0 - delta;
double x2 = x0 + delta;
double y1 = f(x1);
double y2 = f(x2);
return (y2 - y1)/(x2 - x1);
}
// call it as follows:
#include <math.h>
double der = derive(sin, 0.0);
printf("%lf\n", der); // should be around 1.0
Per più avanzate numerici calcoli, è possibile utilizzare il GNU Scientific Library.
Tuttavia, se hai bisogno di trovare analiticamente il formula della derivata di una data funzione, allora dovete:
- analizzare la formula di ingresso alcuni tipi di dati astratti, ad esempio un AST;
- Derivale usando le identità e le regole di derivazione (ce ne sono solo alcune, questa parte dovrebbe essere la più semplice),
- Serializzare il tipo di dati astratto ottenuto come risultato del processo di derivazione in una stringa e in uscita come risultato.
Tuttavia, non è necessario eseguire tutto ciò; ci sono grandi librerie matematiche C che forniscono tale funzionalità.
Modifica: dopo un po 'su Google, non sono riuscito a trovarne uno. La soluzione più vicina per iniziare è che posso dare un'occhiata a GeoGebra's source code - sebbene sia scritto in Java, è abbastanza facile da leggere per chiunque abbia una buona conoscenza di un linguaggio simile a C. In caso contrario, basta andare avanti e attuare tale algoritmo di te stesso :)
fonte
2012-10-16 13:11:44
se si desidera una derivata locale è possibile utilizzare il limite e ottenere una buona approssimazione. – elyashiv
Il riferimento standard di fatto: http://www.nr.com/ – alk
Vuoi una soluzione simbolica o analitica? La soluzione di @ H2CO3 fornirebbe una soluzione analitica (es .: differenziazione discreta). Se vuoi una risposta simbolica (es .: f '(x) = 2x) allora dovresti scrivere un parser, che è più complicato. – DevNull