Suche Parser für mathematische Ausdrücke
-
Das Installieren der Bibliotheken kann dir leider keiner abnehmen. Aber danach ist es inder Regel mit dem Lesen der Dokumentation schon fast getan. Beispiel GiNaC:
#include <ginac/ginac.h> using namespace GiNaC; double foo(double x_value, double a_value) { symbol x("x"); symbol a("a"); ex term("5x^2+(3/5)x-3a", lst(x, a) ); double value = ex_to<numeric>(term.subs(lst(x == x_value, a == a_value).evalf()).to_double(); return value; }
-
Das sagt mein Compiler:
1>------ Build started: Project: MAthe, Configuration: Debug Win32 ------ 1>Compiling... 1>stdafx.cpp 1>c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\ptr.h(58) : warning C4099: 'std::less<GiNaC::ptr<T>>' : type name first seen using 'struct' now seen using 'class' 1> c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\ptr.h(150) : see reference to class template instantiation 'GiNaC::ptr<T>' being compiled 1>c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\print.h(266) : warning C4800: 'GiNaC::print_functor_impl *' : forcing value to bool 'true' or 'false' (performance warning) 1>c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\ptr.h(58) : warning C4099: 'std::less<_Ty>' : type name first seen using 'struct' now seen using 'class' 1> with 1> [ 1> _Ty=GiNaC::ptr<GiNaC::basic> 1> ] 1> c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\ex.h(245) : see reference to class template instantiation 'GiNaC::ptr<T>' being compiled 1> with 1> [ 1> T=GiNaC::basic 1> ] 1>c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\ex.h(672) : warning C4099: 'GiNaC::ex_is_less' : type name first seen using 'class' now seen using 'struct' 1> c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\basic.h(41) : see declaration of 'GiNaC::ex_is_less' 1>c:\dokumente und einstellungen\steiner\eigene dateien\visual studio 2008\projects\mathe\mathe\ginac\numeric.h(32) : fatal error C1083: Cannot open include file: 'cln/complex.h': No such file or directory 1>MAthe - 1 error(s), 4 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
-
Hm,
Also nach langem "Hin und Her", denke ich bleib ich beim muParser. Ich find es zwar etwas umständlich alle Header zum Projekt zu includen und die ganzen .cpp Datein. aber wnigstens komme ich so zum Ziel.Danke für eure Hilfe.
Gruß Tobi.
-
T0bi schrieb:
@Bashar eine Zahl?
Dann ist jetzt auch klar, wieso du sowas nicht findest. Weil es eine spezielle Spielzeuganwendung ist, die eigentlich niemand braucht. Sowas macht man als einführende Übung, wenn man sich mit Parsergeneratoren beschäftigt. Parser(-frameworks), die du irgendwo im Netz finden kannst, sind natürlich wesentlich flexibler und haben entsprechend kompliziertere Schnittstellen.
-
Ich hätte da mal noch iene Frage, ich wollte dafür jetzt nich extra einen neuen Thread auf machen. Und zwar bräuchte ich noch ne Library die Ableitungen von Funktionen ala' "f(x) = 4x³ + 3x² + 2x + 1" bewerkstelligen kann. Ich denke nicht das, dass eine einführende Aufgabe ist, oder?
Gibts sowas auch? Wüsste jetzt nicht unter was ich da googln sollte?!Gruß Tobi.
-
T0bi schrieb:
Ich denke nicht das, dass eine einführende Aufgabe ist, oder?
Polynome ableiten? Das ist ne sehr schöne Übungsaufgabe. Kann man in ein paar Minuten erledigen. Wie würdest Du denn so ein Polynom abspeichern?
-
Gespeichert wird das zuerst bei der Eingabe des Benutzers in einen String, bzw. in ein Char-Array.
-
T0bi: Für GiNaC musst du wohl noch CLN installieren: http://www.ginac.de/CLN/ . Der Grund warum ich dir zu einem kompletten, möglicherweise schwierig zu konfigurierenden Paket rate, ist dass du anscheinend mehr willst als nur einen Parser. Wenn du ableiten willst dann ist ein Parser nicht genug, du brauchst ein System für symbolisches Rechnen. Polynome abzuleiten ist allerdings recht einfach, keine Kettenregel, keine Schachtelungen, nur eine einfach anzuwendende Regel. Das könntest du also auch von Hand machen. Soweit ich die Doku von muParser verstanden habe ist der nicht dazu geeignet.
-
Es soll aber nicht nur einfach gehalten werden. Es sollte darauf Zielen, Ableitungen via' Produkt-, Quotienten-, Kettenregel ect. zu machen auch von sin und cos...
Ihr sagt das ist einfach? Hmm stell mir das irgendwie nicht so leicht vor.
-
Doch, Ableitungen sind wirklich leicht. Du musst nur deinen Ausdruck von außen nach innen betrachten und die jeweils zutreffende Regel anwenden.
Das ganze danach hübsch zusammenzufassen ist schon schwerer. Integration ist auch schwerer.
-
Produktregel, Kettenregel etc. gibts bei Polynomen nicht, also ist Ableiten in diesem Fall einfach. Aber abgesehen davon sehe ich gerade, dass CLN und damit GiNaC nur mit dem gcc läuft

Wenn du aus deiner Formel einen Baum bauen kannst sollte es tatsächlich nicht zu schwierig sein, eine Ableitung zu bilden. Aber eine Bibliothek, die einen Baum aus einer Formel mit Symbolen erstellen kann sollte in der Regel auch fähig sein diese nach einem Symbol abzuleiten.
-
T0bi schrieb:
Es soll aber nicht nur einfach gehalten werden. Es sollte darauf Zielen, Ableitungen via' Produkt-, Quotienten-, Kettenregel ect. zu machen auch von sin und cos...
Ihr sagt das ist einfach? Hmm stell mir das irgendwie nicht so leicht vor.Du musst die Terme einfach immer schön isoliert anschauen. Ich stelle mir da so was vor, wie verschachtelte Funktionen. Mit der Kettenregel lässt sich das ja relativ schnell als Programm darstellen. Schlussendlich sind das ja alles Funktionen, die du ableiten musst. und wie das so geht, ist (meist) relativ einfach.
-
Ja sicher, ich persönlich habe auch keine Probleme Ableitungen zu bilden, aber wie soll ich denn meinem Progrmm beibringen, welche Regel es verwenden soll? Das kommt ja auf die Benutzereingabe an.
( (3/4)x^3 + 5ax^2 - 3.4x + 2a ) / ( ax^2 - 2x + 12a ))
So einen Ausdruck wie sollte ich den bitte Ableiten?
( Wies schriftl. geht weiß ich
)Gruß Tobi.
-
T0bi schrieb:
( (3/4)x^3 + 5ax^2 - 3.4x + 2a ) / ( ax^2 - 2x + 12a ))
So einen Ausdruck wie sollte ich den bitte Ableiten?Parsen und Baum bauen:
1. division 1.1. sum 1.1.1. multiplication 1.1.1.1. constant: 3/4 1.1.1.2. power: base symbol x, exponent constant 3 1.1.2. multiplication 1.1.2.1. constant 5 1.1.2.2. symbol a 1.1.2.3. power: base symbol x, exponent constant 2 usw.Dann kannst du den Baum durchgehen von der Wurzel 1. (Bruch ableiten) bist zu Konstanten wie 12a (die Ableitung ist 0). Das Ganze ist schön mit virtuellen Methoden machbar. Jeder Knoten kriegt ne Methode differentiate(symbol x), die einen Knoten des neuen Baums konstruiert und zurückliefert. D.h. die Methode sum::differentiate() führt für jeden Summanden wiederum differentiate() aus und gibt eine sum der Ergebnisse zurück.
-
Das ist doch ein Quotient, also wendest du die Quotientenregel an. Ich hoffe du erwartest jetzt nicht, dass das irgendwer mal eben hier hinpostet, ein wenig Aufwand ist es dann doch noch, aber es ist nicht prinzipiell schwer und braucht auch keine besonderen Tricks oder Kenntnisse (bis auf das Parsen selber, also den Teil, der irgendeine hingeworfene Zeichenkette hin eine sinnvolle Struktur gliedern kann).
-
Hmm das mit dem Baumprinzip ist mir neu.
-
Vielleicht solltest du dich einfach mal eine halbe Stunde damit auseinandersetzen, was Parser eigentlich machen

Stichworte: (kontextfreie) Grammatik, Ableitung, Syntaxbaum