Как найти производную функции с помощью 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, которые предоставляют такую ​​функциональность.

Изменить: после некоторого поиска в Google я не смог его найти. Самое близкое решение для начала, которое я могу придумать, это взглянуть на исходный код 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