Frage

Ich Programm in Python zu schreiben und ich brauche die Ableitung einer Funktion (eine Funktion als String ausgedrückt) zu finden.

  • Zum Beispiel: x^2+3*x
  • Ihre Ableitung ist: 2*x+3

Gibt es Skripte zur Verfügung, oder gibt es etwas Hilfreiches Sie mir sagen können?

War es hilfreich?

Lösung

sympy tut es auch.

Andere Tipps

Wenn Sie Polynome begrenzt sind (was der Fall zu sein scheint), gibt im Grunde drei Schritte wären:

  1. Parse die Eingabezeichenfolge in eine Liste von Koeffizienten x ^ n
  2. Nehmen Sie die Liste der Koeffizienten und wandelt sie in eine neue Liste der Koeffizienten nach den Regeln für ein Polynom abgeleitet werden.
  3. Nehmen Sie die Liste der Koeffizienten für die Ableitung und einen schönen String erstellen die Ableitung Polynom-Funktion beschreibt.

Wenn Sie Polynome wie a*x^15125 + x^2 + c zu handhaben, eine dict für die Liste der Koeffizienten Sinn machen können, aber ein wenig mehr Aufmerksamkeit erfordern, wenn die Iterationen durch diese Liste zu tun.

Sie können feststellen, was Sie in den Antworten suchen bereits zur Verfügung gestellt. Ich aber möchte eine kurze Erklärung geben, wie symbolische Derivate zu berechnen.

Das Geschäft basiert auf Überladen von Operatoren und der Kettenregel von Derivaten. Zum Beispiel ist die Ableitung von v^n n*v^(n-1)dv/dx, nicht wahr? Also, wenn Sie v=3*x und n=3 haben, was wäre das Derivat? Die Antwort: Wenn f(x)=(3*x)^3, dann das Derivat:

f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2

Die Kettenregel können Sie „Kette“ der Operation: jedes einzelne Derivat einfach ist und Sie nur „Kette“ die Komplexität. Ein weiteres Beispiel ist die Ableitung von u*v v*du/dx+u*dv/dx, nicht wahr? Wenn Sie eine komplizierte Funktion bekommen, die Ketten Sie es einfach, sagen:

d/dx(x^3*sin(x))
u=x^3; v=sin(x)
du/dx=3*x^2; dv/dx=cos(x)
d/dx=v*du+u*dv

Wie Sie sehen können, Differenzierung ist nur eine Kette von einfachen Operationen.

Nun Betreiber Überlastung.

Wenn Sie einen Parser schreiben kann (versuchen Pyparsing), dann können Sie es fordern sowohl die Funktion und die Ableitung zu bewerten! Ich habe dies getan (Flex / Bison verwenden) nur zum Spaß, und es ist sehr mächtig. Für Sie auf die Idee zu bekommen, wird das Derivat rekursiv berechnet, indem die entsprechenden Betreiber Überlastung und rekursiv die Kettenregel anwenden, so die Bewertung von "*" zu u * v für Funktionswert und u*der(v)+v*der(u) für Ableitungswert (versuchen Sie es in C entsprechen würde ++, es ist auch Spaß).

Also los geht, weiß ich nicht Mittel, um Ihre eigenen Parser zu schreiben - mit allen Mitteln vorhandenen Code (Besuch www.autodiff.org zur automatischen Unterscheidung von Fortran und C / C ++ Code). Aber es ist immer interessant zu wissen, wie das Zeug funktioniert.

Cheers,

Juan

Symbolische Differenzierung ist eine beeindruckende Einführung in das Thema, zumindest für nicht-Spezialisten wie ich :) Der Code ist in C ++ geschrieben btw.

Besser spät als nie?

Ich habe immer symbolische Differenzierung in welcher Sprache auch immer gemacht, indem sie mit einem Parse-Baum zu arbeiten. Aber ich wurde auch vor kurzem bewusst eine andere Methode verwenden komplexe Zahlen .

Der Parsing-Baum Ansatz besteht darin, den folgenden kleinen Lisp-Code zu übersetzen, in welcher Sprache auch immer Sie mögen:

(defun diff (s x)(cond
  ((eq s x) 1)
  ((atom s) 0)
  ((or (eq (car s) '+)(eq (car s) '-))(list (car s)
    (diff (cadr s) x)
    (diff (caddr s) x)
    ))
  ; ... and so on for multiplication, division, and basic functions
  ))

und im Anschluss mit einem geeigneten Vereinfacher, so dass Sie von Zugaben von 0 loszuwerden, um 1 multipliziert, etc.

Aber die komplexe Methode, während vollständig numerisch, hat eine gewisse magische Qualität. Statt der Programmierung Ihre Berechnung F in doppelter Genauigkeit, tun Sie es in doppelter Genauigkeit komplex. Dann, wenn Sie die Ableitung der Berechnung in Bezug auf die Variable X benötigen, setzen Sie den imaginären Teil von X auf eine sehr kleine Zahl h, wie 1e-100. Dann die Berechnung tun und das Ergebnis R. bekommen Jetzt real (R) ist das Ergebnis, das Sie normalerweise erhalten, und imag (R) / h = dF / dX sehr hohe Genauigkeit!

Wie funktioniert es? Nehmen wir den Fall der Multiplikation komplexer Zahlen:

(a+bi)(c+di) = ac + i(ad+bc) - bd

Nehmen wir nun an die imaginären Teile sind alle gleich Null, außer wir die Ableitung in Bezug auf a wollen. Wir setzen b auf eine sehr kleine Zahl h. Nun, was bekommen wir?

(a+hi)(c) = ac + hci

Der eigentliche Teil davon ist ac, wie man erwarten würde, und der imaginäre Teil durch h geteilt ist c, die die Ableitung von ac in Bezug auf a ist.

Die gleiche Art der Argumentation scheint auf alle die Differenzierung Regeln anzuwenden.

Wenn Sie denken, das Differenzierungsprogramm von Grund auf neu zu schreiben, ohne dass andere Bibliotheken als Hilfe verwendet wird, dann wird der Algorithmus / Ansatz des Derivats jeder algebraischen Gleichung Berechnung I in wird mein Blog hilfreich sein.

Sie können versuchen, eine Klasse zu erstellen, die eine Grenze rigoros darstellen und bewerten sie dann (f (x) -f (a)) / (x-a), wenn x gegen a. Das sollte einen ziemlich genauen Wert der Grenze geben.

Sofern keine bereits Bibliothek abzuleiten, es ist recht kompliziert, da Sie brauchen, um zu analysieren und Griff Funktionen und Ausdrücke.

für sich ableiten, es ist eine einfache Aufgabe, da es mechanisch ist und kann algorithmisch getan werden, aber Sie müssen eine Grundstruktur, eine Funktion zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top