2012-10-16 18 views
7

Czy można znaleźć pochodną funkcji za pomocą programu c. Używam Matlaba w tym, że ma wbudowaną funkcję diff(), która może być użyta do znalezienia pochodnej funkcji.Jak znaleźć pochodną funkcji za pomocą c

f(x)=x^2 

Czy można znaleźć pochodną powyższej funkcji za pomocą c.? Jaki jest algorytm?

+0

Jeśli chcesz pochodnej locale, możesz użyć limitu i uzyskać dobre przybliżenie. – elyashiv

+0

Standardowe referencje de facto: http://www.nr.com/ – alk

+0

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

Odpowiedz

13

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:

  1. Przetwarza wejściowy do formuły niektóre abstrakcyjne typy danych, na przykład AST;
  2. Pochodnię za pomocą tożsamości i reguł wyprowadzania (jest ich tylko kilka, ta część powinna być najłatwiejsza),
  3. 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 :)

+0

"Nie mogłem znaleźć" - cóż, jest Matlab (http://stackoverflow.com/questions/1513583/how-to-call-matlab-code-from-c) ;-) –

+0

@SteveJessop to jest opensource, aby zbadać, w jaki sposób osiąga analityczne wyprowadzenie? –

+0

(@SteveJessop Mam nadzieję, że nie uwierzyłeś poważnie, że nie wiedziałem o istnieniu MatLab.) –

2

Nie ma nic wbudowanego w języku C, aby to umożliwić. Możesz jednak znaleźć bibliotekę numeryczną, aby to zrobić, jeśli będziesz wyszukiwać w Internecie, chociaż wątpię, czy jest coś, co dostarczy symboliczne pochodne. Można rozważyć samodzielne kodowanie przybliżonych pochodnych numerycznych przy użyciu różnic wewnętrznych, wstecznych i/lub centralnych.

0

W języku C można stosunkowo łatwo zgrubne różnicowanie numeryczne, ale wszelkiego rodzaju symboliczne zróżnicowanie wymaga frameworku innej firmy lub przetaczania własnego.

C jest językiem programowania ogólnego i niskiego poziomu, w przeciwieństwie do Matlaba, który specjalizuje się w obliczeniach matematycznych i ma zaawansowane narzędzia do obliczeń symbolicznych.

2

Dla prostych funkcji następujące rozróżnienie numeryczna działa całkiem dobrze:

typedef double (*TFunc)(double); 

// general approximation of derivative using central difference 
double diff(TFunc f, double x, double dx=1e-10) 
{ 
    double dy = f(x+dx)-f(x-dx); 
    return dy/(2.*dx); 
} 

// more or less arbitrary function from double to double: 
double f(double x) 
{ 
    return x*x; 
} 

// and here is how you get the derivative of f at specified location 
double fp = diff(f, 5.); 
1

Wiem, że późno, ale ja pisałem bibliotekę, która robi dokładnie to.

Umożliwia analizowanie funkcji, generowanie drzewa funkcji. Następnie możesz go rozwiązać lub wyprowadzić.

Można go znaleźć pod adresem. https://github.com/B3rn475/MathParseKit

Powiązane problemy