Die durch differentiate erstellte Ableitung besitzt die gleichen Parameter-Objekte wie der ursprüngliche Term (d.h. get/setParameter() beziehen sich auf die selben Objekte).
Die render()-Methode benötigt die oben verlinkte Library.
Es können neue Konstanten, Operatore und Funktionen hinzugefügt werden (ExpressionParser bietet dafür addConstant(), addFunction() und addOperator()). Dabei gilt:
Konstante sind Objekte von Constant, Funktionen leiten von FunctionNode oder DefaultFunctionNode (bei nur einem Parameter) ab und Operatore von OperatorNode. Bei beiden müssen einige abstrakte Methoden implementiert werden.
DefaultFunctionNode:
getName():String -> Bezeichnung (wie cos, sin, ...)
calculate():double -> berechnen, den berechneten Parameter gibt es über getParameter().calculate()
isConstant():boolean -> true, wenn konstant, d.h. kein Parameter
cloneTree():Node -> klonen
cloneTreeForDerivative():Node -> selbiges
differentiateOuter(variable:Parameter):Node -> äußere Funktion ableiten; beim Ableiten muss der Parameter mit cloneTreeForDerivative() geklont werden.
FunctionNode hat zusätzlich:
differentiate(variable:Parameter):Node -> Ableiten
getMinParameterCount():int -> min. Parameter
getMaxParameterCount():int -> max. Parameter
... dafür kein differentiateOuter().
OperatorNode hat neben cloneTree, cloneTreeForDerivative, differentiate und calculate:
getPriority():int -> Priorität zu anderen Operatoren; +/- hat PRIORITY_LOWER, *// PRIORITY_NORMAL, ^ PRIORITY_HIGHER
getSymbol():String -> Das Symbol
Komplettes Beispiel:
Code:
ExpressionParser parser = new ExpressionParser();
Expression exp = parser.parse("x^2");
// Gibt aus: exp(ln(x) * 2.0) * (1.0 / x * 1.0 * 2.0 + ln(x) * 0.0)
System.out.println(exp.differentiate("x").toTermString());
JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(exp.differentiate("x").render(32))));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
Der generierten, abgeleiteten Terme werden noch nicht vereinfacht.
Hast du für das Parsen einen eigenen Algorithmus entwickelt oder nutzt du einen bestehenden?
Ich hätte hier noch nen Taschenrechner, der Ausdrücke lösen kann, is aber in ner Mengenbasierten Skriptsprache geschrieben, den kann ich bei Interesse gerne hochladen.
ich habe mich nicht nach bestehenden Algorithmen umgeschaut, meinen Lösungsweg in diesem Sinne also selbst entwickelt. Ich finde ihn aber ziemlich intuitiv und denke, dass auch andere das gleichermaßen lösen.
(Ich arbeite mit einer Methode, die immer in einem Abschnitt nach dem letzten Operator mit der niedrigsten Priorität sucht. Wenn einer gefunden wird, wird die Methode rekursiv für den Teil vor- und nach dem Operator aufgerufen; wird keiner gefunden, wird der Teil sonstig ausgewertet.)
Ich vermute, dass dein Algorithmus ähnlich oder gleich funktioniert (insbesondere wenn nicht, wäre es toll, wenn du deinen Code hochladen könntest - ich wäre interessiert).
ich habe mich nicht nach bestehenden Algorithmen umgeschaut, meinen Lösungsweg in diesem Sinne also selbst entwickelt. Ich finde ihn aber ziemlich intuitiv und denke, dass auch andere das gleichermaßen lösen.
(Ich arbeite mit einer Methode, die immer in einem Abschnitt nach dem letzten Operator mit der niedrigsten Priorität sucht. Wenn einer gefunden wird, wird die Methode rekursiv für den Teil vor- und nach dem Operator aufgerufen; wird keiner gefunden, wird der Teil sonstig ausgewertet.)
Ich vermute, dass dein Algorithmus ähnlich oder gleich funktioniert (insbesondere wenn nicht, wäre es toll, wenn du deinen Code hochladen könntest - ich wäre interessiert).
(Was ist eine mengenbasierte Skriptsprache?)
Wie sieht es mit solchen termen aus?
10*(4+4)^(2^(2-1))
Und sind auch Ableitungen von komplizierteren termen möglich z.B.
(10x^2+3x^(4x))/(2x^x)
wir haben das ganze mal in einer Vorlesung behandelt. Dort haben wir den Shunting-Yard-Algorithmus verwendet, im Prinzip wird jedes Argument, das als solches erkannt wird (Operator, Zahl etc.) auf einen Stack-Datentypen gehauen und dann wird mit der Auswertung begonnen, indem der Stack abgebaut wird und Operatoren auf den Operator-Stack und Zahlen auf den Zahlen-Stack kommen usw., dabei wird dann auch immer die Priorität verglichen und danach wird das halt ausgewertet.
Wir haben das ganze in ner Vorlesung behandelt, ich schick dir mal nen Link zu dem Skript.
Die Sprache ist halt von unserem Dozenten entworfen worden, damit er da die ganzen Zusammenhänge mit der Mengenlehre anwenden kann, automatische Sortierung in ner Menge, Relationen und der ganze Kram halt. Da du Java kannst, sollte das aber recht einfach zu lesen sein.
Die Ableitung sollte zumindest stimmen (ich habe sie nur getestet, indem ich ein paar zufällige Werte für x eingesetzt und das Ergebnis mit andere Online-Tools verglichen habe).
Die Lib generiert folgende Ableitung:
Quote:
((0.0 * x ^ 2.0 + 10.0 * exp(ln(x) * 2.0) * (1.0 / x * 1.0 * 2.0 + ln(x) * 0.0) + 0.0 * x ^ (4.0 * x) + 3.0 * exp(ln(x) * 4.0 * x) * (1.0 / x * 1.0 * 4.0 * x + ln(x) * (0.0 * x + 4.0 * 1.0))) * 2.0 * x ^ x - (10.0 * x ^ 2.0 + 3.0 * x ^ (4.0 * x)) * (0.0 * x ^ x + 2.0 * exp(ln(x) * x) * (1.0 / x * 1.0 * x + ln(x) * 1.0))) / 2.0 * x ^ x * 2.0 * x ^ x
Quote:
Wir haben das ganze in ner Vorlesung behandelt, ich schick dir mal nen Link zu dem Skript.
Die Sprache ist halt von unserem Dozenten entworfen worden, damit er da die ganzen Zusammenhänge mit der Mengenlehre anwenden kann, automatische Sortierung in ner Menge, Relationen und der ganze Kram halt. Da du Java kannst, sollte das aber recht einfach zu lesen sein.
wir haben das ganze mal in einer Vorlesung behandelt. Dort haben wir den Shunting-Yard-Algorithmus verwendet, im Prinzip wird jedes Argument, das als solches erkannt wird (Operator, Zahl etc.) auf einen Stack-Datentypen gehauen und dann wird mit der Auswertung begonnen, indem der Stack abgebaut wird und Operatoren auf den Operator-Stack und Zahlen auf den Zahlen-Stack kommen usw., dabei wird dann auch immer die Priorität verglichen und danach wird das halt ausgewertet.
Wir haben das ganze in ner Vorlesung behandelt, ich schick dir mal nen Link zu dem Skript.
Die Sprache ist halt von unserem Dozenten entworfen worden, damit er da die ganzen Zusammenhänge mit der Mengenlehre anwenden kann, automatische Sortierung in ner Menge, Relationen und der ganze Kram halt. Da du Java kannst, sollte das aber recht einfach zu lesen sein.
Shunting Yard ist standard was das angeht.
Eigentlich verwendet man den im Normalfall (wenn man nicht zwingend einen optimierten Algorhitmus braucht) auch für Compiler, Parser usw.
Das Prinzip ist auf etliches anwendbar und einfach und doch mächtig zugleich.
Für all diejenigen, die sich auch für diesen Algo interessieren und über Google auf den Thread gestoßen sind:
HP MP berechnen 01/07/2012 - Florensia - 5 Replies Hallo Jungs,
hat jemand eine Idee wie man HP und MP pro Level berechnen kann? Und wieviel HP/MP bringen die Attribute je Level?
Vielleicht lässt sich das auch dem Client oder den Server Paketen lesen?
so long.
// Does anyone have any idea how to calculate HP and MP per level? And how much HP / MP add the attributes at each level?
Perhaps this can be read from the client or server packages?
C++ - "Terme-Parser" in C - "Terme-Parser" umwandeln 12/13/2010 - C/C++ - 11 Replies Ich hab mir einen Parser gebastelt, der mir einfach Terme löst und das Ergebniss zurückgibt. Das ganze habe ich mit C / C++ gemacht, ich bin aber gezwungen das ganze in reinen C - Code umzuwandeln.
Ich habe mich auch schon versucht, aber da ich wirklich extrem wenig und ungern Elemente aus C verwende bin ich gescheitert.
Hier mein C/C++ Code:
#include <iostream>
#include <string.h>
#include <stdio.h>
Wahrscheinlichkeit berechnen 08/06/2010 - Off Topic - 15 Replies Eine kleine Aufgabe für die Mathematiker unter euch:
wie hoch ist die wahrscheinlichkeit bei 5 möglichen Ereignissen 5gewünschte aus 32 vorhanden zu erreichen?
lg
Pixelverschiebung berechnen 04/20/2009 - General Coding - 5 Replies Gibt es eine Möglichkeit Pixel-Positionen von einer Auflösung zu einer anderen umzurechnen? Bsp Pixel x109 y212 von 800x600 auf 1024x768?
Hex berechnen 05/22/2008 - World of Warcraft - 0 Replies hi leute, ich habe da mal eine frage. wenn ich mit wpe arbeite, muss ich ja id´s in hex umwandeln um sie dann einzutragen. Da ich WPE oft nutze weiß ich ja wie das alles geht. mein prob liegt aber bei hex unter dem wert 4000. diese haben fasst immer nur 3 hex ziffern.
bsp. Fluch der Torheit - Information - World of Warcraft - WoW Guru
------------------------------------------------- -------------
dez: 1292
hex: 50C
------------------------------------------------- -------------
weil ich...