Tak, jest całkiem możliwe. Jednak rozwiązanie zależy od Twoich potrzeb. Jeśli potrzebujesz prostego rozwiązania numerycznego, co następuje zrobi (do pewnego stopnia, z pewnymi ograniczeniami - naiwny wdrożenia):
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
Dla bardziej zaawansowanych liczbowych obliczeń, można użyć GNU Scientific Library.
Jednakże, jeśli trzeba analitycznie znaleźć formułę pochodnej danej funkcji, wtedy musisz:
- Przetwarza wejściowy do formuły niektóre abstrakcyjne typy danych, na przykład AST;
- Pochodnię za pomocą tożsamości i reguł wyprowadzania (jest ich tylko kilka, ta część powinna być najłatwiejsza),
- Serializuj typ danych abstrakcyjnych, otrzymany w wyniku procesu wyprowadzenia, na ciąg znaków i wynik w wyniku tego.
Jednak nie trzeba tego robić; istnieją wspaniałe matematyczne biblioteki C, które zapewniają taką funkcjonalność.
Edytowanie: po niektórych Googling, nie mogłem znaleźć. Najbliższe rozwiązanie, od którego możesz zacząć, mogę sobie wyobrazić, że patrzę na GeoGebra's source code - chociaż jest napisane na Jawie, jest dość łatwe do odczytania dla każdego wystarczająco biegle w języku C-podobnym. Jeśli nie, po prostu śmiało zaimplementuj ten algorytm samemu :)
Jeśli chcesz pochodnej locale, możesz użyć limitu i uzyskać dobre przybliżenie. – elyashiv
Standardowe referencje de facto: http://www.nr.com/ – alk
Czy chcesz rozwiązania symbolicznego lub analitycznego? Roztwór @ H2CO3 zapewniłby roztwór analityczny (tj. Dyskretne różnicowanie). Jeśli chcesz uzyskać odpowiedź symboliczną (np .: f '(x) = 2x), musisz napisać parser, co jest bardziej skomplikowane. – DevNull