Suche Parser für mathematische Ausdrücke



  • @Umschreibär: Weil wenn ich das durch mein Compiler jage, da 1000Warnings und Errors kommen.

    Ich hab auch mal uCalc ausprobier, das scheint aber MFC Zeugs zu sein? Ich brauch aba reine WinApi.



  • Also in den Beispielen zu boost::spirit ist auch ein kompletter Calculator dabei. Der kann imho +-*/(). Evtl. auch mehr.

    Und im Repository finden sich einige mehr:
    http://spirit.sourceforge.net/repository/applications/show_contents.php



  • Das Problem, das ich habe ist denke ich einfach nur das:

    *- Ich lade mir so eine fertige library runter bzw son Parser und werde von Millionen von .h und .cpp erschlagen so das ich nachher ganr net mehr weiß welche ich davon brauche bzw. wie ich die ueberhaupt verwenden soll

    - Ich mich mit den Initialisierungen nicht anfreunden kann. Irgendwie soll da eine Funktion definiert werden und Variablen und blabla...
    *

    ich will doch einfach nur ne Funktion wo ich nen Parameter sowas hier übergeben kann "5x^2+(3/5)x-3a" und wo ich evtl. noch methoden hab die Parameter einzustellen. Doch statt dessen bekommt man da 1000nde von Methode ...

    Es sollte schon irgendwo simpel gehalten sein.

    Gruß Tobi.



  • T0bi schrieb:

    ich will doch einfach nur ne Funktion wo ich nen Parameter sowas hier übergeben kann "5x^2+(3/5)x-3a" und wo ich evtl. noch methoden hab die Parameter einzustellen.

    Und was soll sie zurückgeben?



  • T0bi schrieb:

    Hmm, wenn ich dein C Code zu C++ umdichten soll, muss ich da jeder Funktion noch nen Typ zuweisen?

    Das ist nicht mein Code.
    Bei meinem findest du z.B. keine globalen Variablen, das ganze ist eigentlich recht C++ freundlich gestaltet.
    Kann ich dir mailen, wenn du ne Emailadresse postest.



  • @Bashar eine Zahl?

    Gruß Tobi.



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


Anmelden zum Antworten