Nur ein Hinweis, dass die Sprache, darauf hinzuweisen Unterschied machen kann. Lisp ist besonders gut für dieses Problem.
(defun d (f x)
(etypecase f
(number 0)
(symbol (if (eq f x) 1 0))
(list (df (first f) (rest f) x))))
(defun df (op args x)
(let ((a (first args))
(b (second args)))
(case op
((+ -) `(,op ,(d a x) ,(d b x)))
(* `(+ (* ,a ,(d b x)) (* ,(d a x) ,b)))
(/ `(/ (- (* ,(d a x) ,b) (* ,a ,(d b x))) (^ ,b 2)))
(^ `(* (* ,b (^ ,a ,(1- b))) ,(d a x)))
(sin `(* (cos ,a) ,(d a x)))
(cos `(* (- (sin ,a)) ,(d a x))))))
Lisp mag Prefix-Notation. Dies entspricht einem abstrakten Syntaxbaum für Ausdrücke. Binäre Operationen sehen wie (op lhs rhs)
aus. So zu unterscheiden (3 sin(x^2))^2
,
> (d '(^ (* (sin (^ x 2)) 3) 2) 'x)
(* (* 2 (^ (* (SIN (^ X 2)) 3) 1))
(+ (* (SIN (^ X 2)) 0) (* (* (COS (^ X 2)) (* (* 2 (^ X 1)) 1)) 3)))
Dies ist eine richtige Antwort, aber klar, es ist alles andere als einfach Form. Der nächste Schritt besteht darin, einen Ausdruckvereinfacher hinzuzufügen. Mit einem sehr rudimentär ein,
> (simplify (d '(^ (* (sin (^ x 2)) 3) 2) 'x))
(* (* 2 (* (SIN (^ X 2)) 3)) (* (* (COS (^ X 2)) (* 2 X)) 3))
mit Infixschreibweise ist dies 2(3 sin(x^2)) (3 cos(x^2) (2x))
. Offensichtlich ist mehr Vereinfachung möglich, aber durch eine nützliche Definition zu "am einfachsten" zu kommen, ist ein kompliziertes Thema.
Ich bin nicht klar, in welcher Datenstruktur Sie den Ausdruck speichern. 'mult (var x, mult (var x, var x))' sieht für mich mehr wie eine Funktion aus als eine Datenstruktur –
* "wie" *: Wenn Sie einen Ausdruck differenzieren möchten, ist diese Frage zu weit gefasst. Wenn nicht, sei bitte spezifisch, worum es bei der Frage geht (Potenzen von * x *? Irgendein polynomischer Ausdruck? Spaltungen? ...), und deine Versuche und wo du ein Problem hast. – trincot
Das ist ein sehr schönes Problem, aber es ist nicht trivial. Ein Standardweg ist die "Vereinigung". Die Ausdrücke werden als Syntaxbäume dargestellt. Die Differenzierungsregeln werden als L-> R-Paare dargestellt, wobei L und R Syntaxbäume sind, die freie Variablen enthalten. Z.B. 'd (A * B, x) -> d (A, x) * B + A * d (B, x)' wobei 'A',' B' und 'x' frei sind. Bei der Vereinheitlichung wird ein Eingabeausdruck mit der linken Seite einer Regel verknüpft. Wenn es erfolgreich ist, erzeugt es eine "Ersatz" -Karte, die Variablen zu Teilbäumen nimmt. Wenn Sie die Karte auf die rechte Seite der Regel anwenden, erhalten Sie einen neuen Ausdruck. Stoppen Sie, wenn keine Regeln übereinstimmen. – Gene