Как да намерим производна на функция с помощта на c

Възможно ли е да се намери производна на функция с помощта на c програма. Използвам matlab, тъй като има вградена функция diff(), която може да се използва за намиране на производна на функция.

f(x)=x^2

Възможно ли е да се намери производната на горната функция с помощта на c. Какъв е алгоритъмът за това?


person Eka    schedule 16.10.2012    source източник
comment
ако искате производно на локал, можете да използвате ограничението и да получите добро приближение.   -  person elyashiv    schedule 16.10.2012
comment
Де факто стандартната препратка: nr.com   -  person alk    schedule 16.10.2012
comment
Искате ли символично или аналитично решение? Решението от @H2CO3 би ​​предоставило аналитично решение (т.е.: дискретно диференциране). Ако искате символичен отговор (т.е.: f'(x)=2x), тогава ще трябва да напишете анализатор, който е по-сложен.   -  person Cloud    schedule 16.10.2012


Отговори (5)


Да, това е напълно възможно. Решението обаче зависи от вашите нужди. Ако имате нужда от просто числено решение, следното ще свърши работа (до известна степен, с някои ограничения - наивно изпълнение):

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

За по-усъвършенствани числови изчисления можете да използвате Научната библиотека на GNU.

Ако обаче трябва да намерите аналитично формулата на производната на дадена функция, тогава трябва да:

  1. Анализирайте входната формула до някакъв абстрактен тип данни, например AST;
  2. Извлечете го, като използвате идентичностите и правилата за извличане (има само няколко от тях, тази част трябва да е най-лесната),
  3. Сериализирайте абстрактния тип данни, който сте получили като резултат от процеса на извличане, в низ и го изведете като резултат.

Въпреки това, няма да е необходимо да правите всичко това; има страхотни C математически библиотеки, които предоставят такава функционалност.

Редактиране: след известно търсене в Гугъл не можах да намеря такъв. Най-близкото решение, за което мога да се сетя, за да започнете, е да погледнете изходния код на GeoGebra - въпреки че е написан в Java е сравнително лесно за четене от всеки, който владее достатъчно свободно C-подобен език. Ако не, просто продължете и приложете този алгоритъм сами :)

person Community    schedule 16.10.2012
comment
Не можах да намеря такъв -- добре, има Matlab (stackoverflow.com/questions/1513583/) ;-) - person Steve Jessop; 16.10.2012
comment
@SteveJessop с отворен код ли е, за да проучи как постига аналитично извличане? - person ; 16.10.2012
comment
(@SteveJessop Надявам се, че не сте повярвали сериозно, че не знаех за съществуването на MatLab.) - person ; 16.10.2012
comment
Просто исках да подчертая, че Matlab може (с известно усилие) да се използва вместо тази C библиотека, която търсихте и не намерихте. В известен смисъл всичко със C обвързвания е C библиотека. ;-) беше просто защото Matlab е мястото, от което питащият е започнал и може да е мястото, където той свършва. Matlab не е с отворен код, но търсенето на алтернатива на matlab предоставя някои кандидати. - person Steve Jessop; 16.10.2012

За прости функции следното числено диференциране работи доста добре:

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.);
person coproc    schedule 16.10.2012

Няма нищо вградено в езика C, което да позволява това. Може да успеете да намерите цифрова библиотека, за да го направите, ако търсите онлайн, въпреки че се съмнявам, че има нещо налично, което да предостави символни производни. Бихте могли сами да кодирате приблизителни числени производни, като използвате разлики напред, назад и/или централни.

person mathematician1975    schedule 16.10.2012

В C можете да направите груба числена диференциация относително лесно, но всякакъв вид символна диференциация изисква рамка на трета страна или преобръщане на ваша собствена.

C е език за програмиране с общо предназначение и ниско ниво, за разлика от Matlab, който е специализиран за математически изчисления и има усъвършенствани инструменти за символни изчисления.

person Dmytro Sirenko    schedule 16.10.2012

За любопитните, които искат математиката зад f'(x), ние използваме стандартната дефиниция на производната, получена от границите, вижте:Формула за производна.

Тук h->0 (h клони към 0) означава, че h е много малко число. Можете да вземете това число за 10^-5 за повечето изчисления. Въпреки че и двете уравнения работят перфектно, на практика второто дава по-добри стойности. Въпреки това може да се отбележи, че тези изчисления са много скъпи и трябва да се избягват, когато действителната функция може да бъде извлечена на ръка.

person Farhan Khan    schedule 01.12.2019