web-dev-qa-db-fra.com

Comment trouver la dérivée d'une fonction en utilisant c

Est-il possible de trouver un dérivé d'une fonction en utilisant le programme c. J'utilise matlab en ce qu'il a une fonction intégrée diff () qui peut être utilisée pour trouver la dérivée d'une fonction.

f(x)=x^2

Est-il possible de trouver la dérivée de la fonction ci-dessus en utilisant c. Quel est l'algorithme pour ça?

14
Eka

Oui, c'est tout à fait possible. Cependant, la solution dépend de vos besoins. Si vous avez besoin d'une solution numérique simple, ce qui suit fera (dans une certaine mesure, avec certaines contraintes - mise en œuvre naïve):

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

Pour des calculs numériques plus avancés , vous pouvez utiliser la GNU Scientific Library.

Cependant, si vous devez trouver analitiquement la formule de la dérivée d'une fonction donnée, alors vous devez:

  1. Analyser la formule d'entrée à un type de données abstrait, par exemple un AST;
  2. Dérivez-le en utilisant les identités et les règles de dérivation (il n'y en a que quelques-unes, cette partie devrait être la plus simple),
  3. Sérialisez le type de données abstrait obtenu à la suite du processus de dérivation dans une chaîne et affichez-le comme résultat.

Cependant, vous n'aurez pas besoin de faire tout cela; il existe de grandes bibliothèques mathématiques C qui offrent une telle fonctionnalité.

Edit: après quelques recherches sur Google, je n'ai pas pu en trouver un. Je peux penser à la solution la plus proche pour vous aider à démarrer le code source de GeoGebra - bien qu'il soit écrit en Java, il est assez facile à lire pour quiconque parle assez couramment un langage de type C. Sinon, allez-y et implémentez cet algorithme vous-même :)

17
user529758

Pour les fonctions simples, la différenciation numérique suivante fonctionne plutôt bien:

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

Il n'y a rien de intégré dans le langage C pour permettre cela. Vous pourrez peut-être trouver une bibliothèque numérique pour le faire si vous effectuez une recherche en ligne, bien que je doute qu'il existe quelque chose qui fournira des dérivés symboliques. Vous pourriez envisager de coder vous-même les dérivées numériques approximatives en utilisant des différences avant, arrière et/ou centrales.

2
mathematician1975

En C, vous pouvez effectuer une différenciation numérique approximative relativement facilement, mais tout type de différenciation symbolique nécessite un cadre tiers ou le vôtre.

C est un langage de programmation polyvalent et de bas niveau, contrairement à Matlab, spécialisé dans les calculs mathématiques et doté d'outils avancés pour les calculs symboliques.

0
Dmytro Sirenko

Pour les curieux qui veulent les maths derrière f '(x), nous utilisons la définition standard de la dérivée obtenue à partir des limites voir: Formule pour la dérivée.

Ici, h-> 0 (h tend vers 0) signifie que h est un très petit nombre. Vous pouvez prendre ce nombre à 10 ^ -5 pour la plupart des calculs. Bien que les deux équations fonctionnent parfaitement bien, en pratique, la seconde donne de meilleures valeurs. Cependant, on peut également noter que ces calculs sont très coûteux et doivent être évités lorsque la fonction réelle peut être dérivée à la main.

0
Farhan Khan

Je sais que je suis en retard, mais j'ai écrit une bibliothèque qui fait exactement cela.

Il permet d'analyser la fonction, générant un arbre de fonction. Ensuite, vous pouvez même le résoudre ou le dériver.

Vous pouvez le trouver sur. https://github.com/B3rn475/MathParseKit

0
B3rn475