Question

Je suis intéressé par la construction d'une calculatrice dérivée. J'ai creusais mon cerveau sur la résolution du problème, mais je ne l'ai pas trouvé une bonne solution à tout. Puissiez-vous avoir un soupçon comment commencer? Merci

Je suis désolé! Je veux bien faire la différenciation symbolique.

Disons que vous avez la fonction f (x) = x ^ 3 + 2x ^ 2 + x

Je veux afficher le dérivé, dans ce cas, f '(x) = 3x ^ 2 + 4x + 1

Je voudrais mettre en œuvre en c objectif pour l'iPhone.

Était-ce utile?

La solution

Je suppose que vous essayez de trouver la dérivée d'une fonction exacte. (Différenciation symbolique)

Vous devez analyser l'expression mathématique et stocker les opérations individuelles dans la fonction dans une structure arborescente.

Par exemple, x + sin²(x) serait stockée sous la forme d'une opération de +, appliquée à l'expression x et une opération ^ (exponentiation) de sin(x) et 2.

Vous pouvez ensuite différencier récursive l'arbre en appliquant les règles de différenciation à chaque nœud. Par exemple, un nœud de + deviendrait le u' + v', et un noeud de * deviendrait uv' + vu'.

Autres conseils

vous devez vous souvenir de votre calcul. En gros, vous avez besoin de deux choses: table des dérivés de fonctions de base et les règles de la façon de dériver des expressions composées (comme d(f + g)/dx = df/dx + dg/dx). Ensuite, prendre l'analyseur d'expressions et récursive aller autre l'arbre. ( http://www.sosmath.com/tables/derivative/derivative.html)

Parse votre chaîne en un S-expression (même si cela est généralement pris dans le contexte Lisp, vous pouvez faire une chose équivalente à peu près toutes les langues), plus facile avec lex / yacc ou équivalent, puis écrire un récursive « tirer » fonction. En dialecte OCaml-ish, quelque chose comme ceci:

let rec derive var = function
    | Const(_) -> Const(0)
    | Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var))
    | Add(x, y) -> Add(derive var x, derive var y)
    | Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b))
    ...

(Si vous ne connaissez pas la syntaxe OCaml - derive est fonction récursive à deux paramètres, avec le premier paramètre le nom de la variable, et le second étant mathched en lignes successives, par exemple, si ce paramètre est une structure de forme Add(x, y), retourner la structure Add construit à partir de deux champs, avec des valeurs de dérivées x et y dérivés, et de même pour d'autres cas de ce derive pourrait recevoir comme paramètre, _ dans le premier moyen de motif « quoi que ce soit de correspondance »)

Après cela, vous pourriez avoir une fonction de nettoyage pour ranger l'expression résultante (réduction des fractions, etc.), mais cela se complique, et n'est pas nécessaire pour la dérivation elle-même (à savoir ce que vous obtenez sans elle est toujours une bonne réponse) .

Lorsque votre transformation de la s-exp est fait, reconvertir le s-exp résultant en forme de chaîne, encore une fois avec une fonction récursive

SLaks déjà décrit la procédure de différenciation symbolique. Je voudrais simplement ajouter quelques petites choses:

  • les mathématiques symbolique est l'analyse et la plupart du temps des transformations d'arbres. ANTLR est un excellent outil pour les deux. Je vous suggère de commencer par ce grand livre modèles de mise en œuvre Langue
  • Il existe des programmes open source qui font ce que vous voulez (par exemple Maxima). Disséquant un tel programme pourrait être intéressant aussi (mais il est probablement plus facile de comprendre ce qui se passe si vous avez essayé de l'écrire vous-même, d'abord)
  • Probablement, vous aussi voulez une sorte de simplification pour la sortie. Par exemple, juste application des règles de base dérivés à l'expression 2 * x donnerait 2 + 0*x. Cela peut aussi être fait par le traitement des arbres (par exemple en transformant 0 * [...] à 0 et [...] + 0 à [...] et ainsi de suite)

Pour quels types d'opérations sont vous manque pour calculer un dérivé? Si vous autorisez les fonctions trigonométriques comme sinus, cosinus et la tangente, ce sont probablement mieux stockées dans une table tandis que d'autres comme polynômes peuvent être beaucoup plus facile à faire. Est-ce que vous permettant des fonctions d'avoir plusieurs entrées, par exemple. f (x, y) plutôt que juste f (x)?

dans Polynomials une seule variable serait ma suggestion et envisager d'ajouter dans des fonctions trigonométriques, logarithmiques, exponentielles et d'autres avancées de dérivés qui peuvent être compute plus difficile à faire.

différenciation symbolique sur des fonctions communes (+, -, *, /, ^, sin, cos, etc.) sans tenir compte des régions où la fonction ou son dérivé est non défini est facile. Ce qui est difficile, peut-être contre-intuitivement, est le résultat après simplifie.

Pour faire la différenciation, stocker les opérations dans un arbre (ou même simplement en notation polonaise) et faire une table du dérivé de chacune des opérations élémentaires. Appliquez ensuite à plusieurs reprises la règle de la chaîne et les dérivés élémentaires, ainsi que le réglage de la dérivée d'une constante à 0. Ceci est rapide et facile à mettre en œuvre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top