Funktionsaufruf (Funktion aus cmath) über Eingabeaufforderung übernehmen.



  • Hallo zusammen,

    meine Diplomarbeit erfordert die Einarbeitung in C++. Das ist die erste Programmiersprache die ich lerne. Bisher klappt es recht gut und es macht mir auch (noch) viel Spaß. Doch nun zu meinem Problem.

    Ich hab mir einen Integrator geschrieben (Euler-Polygonzugverfahren und klassisches Runge-Kutta-Verfahren). Man geht dabei von einer Differentialgleichung der Form y'=f(x,y) aus.

    Jetzt würde ich gern den Ausdruck f(x,y) auf der rechten Seite (z.B. x*cos(x)) über eine Eingabeaufforderung, also in der Art

    #include <cmath>
    .
    .
    cout << "Bitte f(x,y) eingeben: ";
    cin >> rightSide;
    .
    .
    

    in den Integrator übernehmen. Das hätte den Vorteil, dass man den Code nicht für jedes Problem umschreiben und neu kompilieren müsste. Allerdings hab ich nicht den geringsten Schimmer, wie ich das realisieren könnte.

    Ist es denn überhaupt möglich, die Idee umzusetzen?
    Hab auch schon Google befragt, aber nichts in dieser Richtung gefunden.
    Wäre toll, wenn mir jemand einen Anstoß geben könnte, wie man das eventuell umsetzen kann.

    Gruß
    Kosmokatze



  • Phu.. Möglich ist das schon, allerdings ein Haufen arbeit, die du dir wahrscheinlich so nicht machen willst. 😉

    Wenn du eine oder ein paar vorgegeben Funktionen hast, respektive dich auf variable Konstanten beschränkst, dann geht es recht gut, aber ich nehme mal an, dass du jede beliebige Funktion haben willst, oder?

    Da würde ich dir eine Skriptsprache empfehlen, mit welcher du dann die Funktion schreibst und in deinem Programm nutzen kannst. z.B Lua:
    http://www.lua.org/

    Oder aber auch Python:
    http://www.python.org/



  • Unter http://www.bitel.net/dghm1164/downloads/FctParser-Sources.zip habe ich einen Funktionsparser abgelegt. Dieser ist zwar mit dem Borland C++ Builder (und dessen VCL-Klassen) geschrieben, aber mit wenigen Änderungen kannst du ihn einfach übernehmen:
    - std::string statt AnsiString
    - std::exception statt Exception
    Mehr müßte nicht nötig sein...

    Dann einfach mittels

    FunctionParser fp;
    std::string sFct = "x*cos(x)"; // <- variabel
    FctValue x = 3.14; // <- variabel (z.B. in einer Schleife)
    try
    {
      FctValue y = fp.Parse(sFct.c_str(), x);
    }
    catch(EFctParser e)
    {
      std::cout << e.what();
    }
    

    aufrufen.

    Falls dir noch Funktionen fehlen, so kannst du diese in dem Array 'aFct' einfach hinzufügen.

    P.S: Viel Glück bei deiner Diplom-Arbeit!



  • Das sieht interessant aus.
    Sehe ich mir auch mal bei Gelegenheit an. 😉

    thx for sharing.



  • Vielen Dank für die Antworten und den Parser.
    Hab mir den Code mal angesehen, da scheint viel Arbeit drin zu stecken. Hätt ich definitiv noch nicht bewerkstelligen können.

    Python bzw. Lua werd ich mir mal bei Gelegenheit anschauen. Konzentriere mich jetzt aber erstmal auf´s Wesentliche.

    Gruß
    Kosmokatze



  • Da ich diesen Beitrag jetzt wieder gelesen habe (Verlinkung von http://www.c-plusplus.net/forum/viewtopic.php?p=1798186):
    Es waren nur so ca. 1-2 Tage (ich hatte damals - vor ca. 10 Jahren - einfach mal auf die Schnelle einen C-Code nach C++ übertragen - der ursprüngliche C-Code war Teil eines Compilers, den ich auf dem Amiga zuerst in Assembler und danach noch mal in C programmiert hatte).



  • Und hier glaube genau dein Problem, mit flex und bison als Parser geloest mit kleiner Projektbeschreibung:

    http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/


Anmelden zum Antworten