Frage

Ich bin in den Aufbau einer Ableitung Rechner interessiert. Ich habe ich den Kopf zerbrochen über das Problem zu lösen, aber ich habe nicht eine richtige Lösung überhaupt gefunden. Können Sie einen Tipp, wie Sie anfangen sollen? Dank

Es tut mir leid! Ich möchte deutlich symbolische Differenzierung machen.

Angenommen, Sie haben die Funktion f (x) haben = x ^ 3 + 2x ^ 2 + x

Ich mag die Ableitung angezeigt werden, in diesem Fall f '(x) = 3x ^ 2 + 4x + 1

Ich mag es für das iPhone in Objective-c implementieren.

War es hilfreich?

Lösung

Ich gehe davon aus, dass Sie versuchen, die genaue Ableitung einer Funktion zu finden. (Symbolische Differenzierung)

Sie müssen den mathematischen Ausdruck und speichern Sie die einzelnen Vorgänge in der Funktion in einer Baumstruktur analysieren.

Zum Beispiel würde x + sin²(x) als + Operation gespeichert werden, angewandt auf die Expression x und eine ^ (Potenzierung) Betrieb von sin(x) und 2.

Sie können dann unterscheiden rekursiv den Baum von jedem Knoten die Regeln der Differenzierung anzuwenden. Zum Beispiel würde ein + Knoten der u' + v' wird, und ein * Knoten würde uv' + vu' werden.

Andere Tipps

Sie müssen Ihr Kalkül erinnern. im Grunde müssen Sie zwei Dinge: Tabelle von Derivaten von Grundfunktionen und Regeln, wie zusammengesetzte Ausdrücke derivatisieren (wie d(f + g)/dx = df/dx + dg/dx). Dann nehmen Sie Ausdrücke Parser und rekursiv andere gehen, um den Baum. ( http://www.sosmath.com/tables/derivative/derivative.html)

Parse Zeichenfolge in eine S-Ausdruck (obwohl dies in der Regel genommen wird in Lisp Kontext, können Sie eine gleichwertige Sache in so ziemlich jede Sprache) tun, am einfachsten mit lex / yacc oder gleichwertig, dann schreiben Sie eine rekursive „ableiten“ -Funktion. In OCaml-ish Dialekt, so etwas wie folgt aus:

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

(Wenn Sie nicht wissen, OCaml Syntax - derive ist zweiparametrige rekursive Funktion, mit ersten Parameter der Variablennamen und das zweite Wesen mathched in aufeinanderfolgenden Zeilen, zum Beispiel, wenn dieser Parameter eine Struktur der Form Add(x, y) ist, die Struktur Add Rückkehr aus zwei Feldern gebaut, mit Werten von abgeleiteten x und abgeleitet y, und in ähnlicher Weise für andere Fälle, was derive als Parameter erhalten könnte; _ in den ersten Mustern bedeuten „Spiel etwas“)

Danach können Sie einige clean-up-Funktion haben, um den resultierenden Ausdruck aufzuräumen (Reduktions Fraktionen usw.), aber das wird kompliziert, und ist nicht notwendig für die Ableitung selbst (also das, was man, ohne es zu bekommen ist immer noch eine richtige Antwort) .

Wenn Sie Ihre Transformation des s-exp durchgeführt wird, zurückzuverwandeln die resultierende s-exp in String-Form, wieder mit einer rekursiven Funktion

SLaks beschrieben bereits das Verfahren für die symbolische Differenzierung. Ich würde wie ein paar Dinge hinzufügen:

  • Symbolische Mathematik ist vor allem das Parsen und Baum-Transformationen. ANTLR ist ein großes Werkzeug für beide. Ich würde vorschlagen, mit diesem großen Buch beginnen Sprache Implementierung Muster
  • Es gibt Open-Source-Programme, die das tun, was Sie wollen (zum Beispiel Maxima). ein solches Programm Sezieren könnte interessant sein, auch (aber es ist wahrscheinlich einfacher zu verstehen, was los ist, wenn man versucht, es selbst zu schreiben, zuerst)
  • Wahrscheinlich wollen Sie auch eine Art Vereinfachung für die Ausgabe. Zum Beispiel der Anwendung nur die grundlegenden Regeln Derivat zum Ausdruck 2 * x würde 2 + 0*x ergeben. Dies kann auch durch Baumverarbeitung durchgeführt werden (zum Beispiel durch 0 * [...] zu 0 und [...] + 0 zu [...] Transformation und so weiter)

Für welche Arten von Operationen sind Sie wollen ein Derivat berechnen? Wenn Sie trigonometrische Funktionen wie Sinus, Cosinus und Tangens ermöglichen, ist diese wahrscheinlich am besten in einer Tabelle gespeichert, während andere wie Polynome können viel leichter sein, zu tun. Erlauben Sie für Funktionen mehrere Eingänge zu haben, z. f (x, y) und nicht nur f (x)?

Polynomials in einer einzigen Variablen mein Vorschlag wäre, und dann erwägen, in trigonometrischer Zugabe, logarithmisch, exponentiell und andere erweiterte Funktionen zu berechnen Derivate, das härter sein kann, zu tun.

Symbolic Differenzierung über gemeinsame Funktionen (+, -, *, /, ^, sin, cos, etc.) zu ignorieren Regionen, in denen die Funktion oder deren Derivat ist nicht definiert ist einfach. Was ist schwierig, vielleicht counterintuitively, wird danach das Ergebnis vereinfacht wird.

, um die Differenzierung zu tun, speichern Sie die Vorgänge in einem Baum (oder auch nur in der polnischen Notation) und eine Tabelle des Derivats jeder der elementaren Operationen machen. Dann wiederholt die Kettenregel anwenden und die elementaren Derivate, zusammen mit der Ableitung einer Konstante auf 0. Das ist schnell und einfach zu implementieren.

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