Как найти производную функции с помощью c

можно ли найти производную функции с помощью программы на Си. Я использую matlab в том, что он имеет встроенную функцию diff (), которая может быть использована для поиска производной функции.

f(x)=x^2

можно ли найти производную от вышеуказанной функции с помощью c. Каков алгоритм для этого?

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.

однако, если вам нужно analitically найти формула производной данной функции, то вы кому:

  1. проанализируйте входную формулу для некоторого абстрактного типа данных, например AST;
  2. выведите его, используя идентификаторы и правила деривации (их всего несколько, эта часть должна быть самой простой),
  3. Сериализуйте абстрактный тип данных, полученный в результате процесса деривации, в строку и выведите его в результате.

однако вам не нужно будет делать все это; есть большие математические библиотеки C, которые обеспечить такую функциональность.

Edit: после некоторого гугления я не смог найти его. Самое близкое решение для начала работы, которое я могу придумать, - это взглянуть на исходный код GeoGebra - хотя он написан на Java, его довольно легко прочитать для любого, кто достаточно свободно владеет языком C-like. Если нет, просто продолжайте и реализуйте этот алгоритм самостоятельно:)


нет ничего встроенного в язык C, чтобы включить это. Вы могли бы найти числовую библиотеку, чтобы сделать это, хотя, если вы ищете в интернете, хотя я сомневаюсь, что есть что-нибудь доступное, что обеспечит символические производные. Вы можете сами кодировать приближенные числовые производные, используя прямые, обратные и/или центральные различия.


для простых функций хорошо работает следующее численное дифференцирование:

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.);

Я знаю, что опоздала, но я написал библиотеку, которая делает именно это.

Он позволяет анализировать функцию, генерируя дерево функций. Тогда вы даже можете решить его или вывести его.

вы можете найти его на. https://github.com/B3rn475/MathParseKit


В C вы можете сделать грубое численное дифференцирование относительно легко, но любой вид символического дифференцирования требует сторонней структуры или прокатки собственной.

C-это язык программирования общего назначения и низкого уровня, в отличие от Matlab, который специализируется на математических вычислениях и имеет передовые инструменты для символьных вычислений.