Wer will eine mathematiklibrary testen?



  • Hallo!
    Ich schreibe schon seit ein paar Wochen an einer Library, die mathematische Ausdrücke vereinfachen und Ableitungen bilden soll. Bis jetzt klappt das auch ganz gut. Das Parsen der Ausdrücke klappt wunderbar und Vereinfachungen sind teilweise drinne. Ableitungen gehen im Moment noch nicht, bzw. sind gerade in der Entwicklung. Ich habe auf einem Server mal ein Script gestellt, dass die Library benutzt:

    http://crock.servequake.com/~hackbert/cwmp-test/cwmp.php

    Ich würde mich freuen, wenn ein paar Leute das testen könnten. Die Library ist komplett in C und C++ geschrieben und portabel (getestet unter Linux und Windows).

    Wer mehr erfahren möchte kann auch die Projekthomepage besuchen:
    http://www.sourceforge.net/projects/cwmp

    Es wäre auch toll, wenn mir jemand noch ein paar Tipps geben könnte:
    - Welche mathematischen Konstanten gibt es?
    - Welche mathematischen Funktionen kennt ihr?

    Derzeit werden folgende Funktionen unterstützt:
    acos, asin, atan, cos, max, min, sin, sqrt, tan

    Rechenoperationen:
    *, +, -, /, Fakultät

    Logarithmen:
    ln, log, log2



  • eingabe:

    2*x +3*x +a^2 +2*a*b +b^2

    ausgabe:

    ((x*2)+(x*3)+(a2)+(2*a*b)+(b2))

    mmh...
    erwartet hätte ich:

    5*x + (a+b)^2



  • - uneinheitliche sprache ("fehler: missing .....")
    - (x-3)(x+3) wird nicht vereinfacht
    - (x-3)(x+3) funzt gar nicht (gewohnheitsmäßig hab ich * weggelassen, das schluckt deine kosntruktion dann aber nicht)
    - je nachdem, was du unter vereinfachen verstehst, hab ich erwartet, daß entweder x
    (x+1) zu x^2 + x vereinfacht wird oder umgekehrt- beides geschieht aber nicht



  • Leider sind die Algorithmen nicht sehr ausgereift. Manchmal wird tatsächlich sogar verkompliziert. wichtig wäre nur, dass nichts rauskommt, was wirklich grob falsch ist. Ich werde natürlich an den Vereinfachungen weiterarbeiten.

    Mal ein paar Beispiele für Vereinfachungen, die im Moment gehen:

    (x-x)/b -> 0
    y*(x+3)*(x+3)*y -> (x+3)2*y3
    .
    .
    .

    Das mit der Sprache liegt daran, dass das Script auf Deutsch ist und das Programm, das im Hintergrund arbeitet englisch spricht.



  • x / 0 + x / 0 --> ((x/0)*2)

    durch null könnte er doch aber wenigstens bemerken.



  • Weitere Vereinfachungen:

    (sin(x))^2 + (cos(x))^2 : da sollte 1 rauskommen
    x^0 : da sollte auch 1 rauskommen
    sqrt(x^2) : da sollte |x| rauskommen (OK, mit Betrag ist etwas schwer)
    log(ê^x) : da sollte x rauskommen



  • Vielen Dank erstmal für die vielen Antworten.

    Um einige Probleme habe ich mich bereits gekümmert:
    - Divisionen durch Null werden nun gemeldet
    - (x-3)*(x+3) wird nun auch zu x²-3² vereinfacht

    Um Beträge werde ich mich morgen kümmern. Die derzeitige Version im Internet ist noch nicht auf dem neuesten Stand. Ihr werdet also im Moment leider noch nichts neues finden (alte Fehler bleiben also erstmal bis morgen).



  • also zumindest aus "3*x + 2*x" sollte er "5*x" machen und nicht "((x*3)+(x*2))"



  • Hi.

    Ein paar Sachen

    1*x+x -> ((x*1)+x) statt 2x
    x/1 -> (x/1) statt x

    a*(b*c) + (a*b)*c -> ((a*(b*c))+((a*b)*c)) statt 2abc

    a*b+a*c -> ((a*b)+(a*c)) statt a(b+c)

    x^(-1) - 1/x -> ((x^-1.0)-(1/x)) statt 0
    x*x^(-1) gleiches Problem

    a+(-a) -> Fehler: Unknown Constant: -a

    In der Ausgabe sollten überflüssige Klammern weggelassen werden.

    Logarithmengesetze fehlen, s.d. z.B. sowas zu 0 wird.
    ln(a^b) - bln(a)
    ln(ab) - (ln(a)+ln(b))

    Seltsamer Fehler:
    a^(b+c) - a^(b+c) wird korrekt zu Null ausgewertet.
    ab*ac - a^(b+c) aber nur zu ((a(b+c))-(a(b+c))) .
    Gebe ich diesen letzten Ausdruck wiederum ein macht er richtigerweise 0 draus.

    Algo terminiert wohl etwas zu früh.

    Sehr interessantes Projekt, das ich auch schon lange mal realisieren wollte. Hast aber nocht ein wenig Arbeit vor dir.
    Einerseits wohl am sinnvollsten alle Wurzel, Potenz, Logarithmen, Körpergesetze und was sich noch so auf den ersten Seiten einer Formelsammlung findet einzubauen. Dann wirds aber bestimmt verdammt langsam.

    Könntest mal etwas dazu sagen, wie du es implementiert hast.

    space



  • Expression: 2x^5+3x^3-2x-10
    Vereinfacht: ((2x^5)+((3x^3)-2x-10.0))
    ((2x^5)+((3x^3)-2x-10.0)) enthaelt Variablen: x
    x = 0
    time: 10.600000 s
    ((2x^5)+((3x^3)-2x-10.0)) = 47.0
    

    Verstehe ich nicht, wenn ich 0 für x einsetze sollte doch -10 rauskommen.
    Oder ist x hier was anderes ?



  • Und noch was:
    a-a+a-a erzeugt eine leere Ausgabe, und keine 0 wie z.B. a-a
    log(1) liefert als Ergebnis nicht 0.

    Kannst du vielleicht mal die vielen Klammern rausschmeißen? Und warum verdrehst du immer die Reihenfolge der Faktoren in einem Produkt wie z.B. 3*x -> (x*3)?
    Hübsch wären auch Konstanten/Variablen mit mehr als einem Buchstaben (z.B. alpha, beta, karlheinz, ...)

    Wie hast du das Implementiert?



  • Danke für die vielen Antworten. Ich komme gar nicht hinterher mit dem Programmieren 😉

    Ein paar generelle Sachen:
    - Man muss jeden mathematischen Operator eintippen. Konstrukte wie 2x werden noch nicht unterstützt. Man muss stattdessen 2*x eingeben. Ich werde mich da mal dransetzen. Die Sache ist komplizierter zu implementieren, als es auf den ersten Blick erscheint.

    - Die Downloads bei sourceforge.net sind veraltet. Im CVS befindet sich immer die aktuelle Version (im Moment leider nicht lauffähig, da es einen CVS-Fehler mit einer Ressource gibt)

    - Wie habe ich das gemacht? Die Beschreibung dessen würde den Rahmen des Threads wohl sprengen. Ich habe eine Dokumentation geschrieben, die die grundlegende Arbeitsweise erläutert. Diese Dokumentation ist im Moment ein wenig veraltet. Wer sich das trotzdem mal anschauen möchte, der kann sich das Dokument unter http://www.programmierforen.de/trash/doc/full.pdf herunterladen.

    - An Variablen mit mehreren Buchstaben habe ich auch gedacht. Allerdings wird es kompliziert, wenn die Konstrukte mit implizitem Operator (wie zB 2ab = 2*a*b) benutzt werden. Ist ab nun ein Variablenname oder sind es zwei Variablen? Deshalb habe ich mich dazu entschieden, dass man nur Variablen mit einem Buchstaben benutzen kann. Ausgenommen sind Konstanten. Das sind derzeit pi und euler_gamma.

    Aktuelle Änderungen (aus Zeitmangel noch nicht in der Web-Version):
    - Die vielen Klammern sind behoben
    - Unbekannte Funktionen werden nun berichtet

    Danke für die vielen Anregungen für die Vereinfachungen. Manche davon kannte ich gar nicht (Ich bin noch "normaler" Schüler auf dem Gymnasium und selbst im Mathe-Leistungskurs kriegt man recht wenig mit auf den Weg gegeben). Es wird einige Zeit dauern, bis all diese Vereinfachungen implementiert werden. Einige davon erfordern ziemlich gravierende Eingriffe in die gesamte Programmlogik und kosten demnach eine Menge Hirnschmalz. Das wird mich natürlich nicht daran hindern, das alles zu implementieren 😉

    P.S.: Wenn jemand Fehler in der Dokumentation findet, dann wäre es toll, wenn der/die mich darauf aufmerksam machen würde.



  • -5! ergibt -5.0
    ich würde ein "nicht definiert" oder -(5!) bevorzugen

    kann es sein dass dein Logarithmus zur Basis 2*PI arbeitet?

    Viele Grüße
    Fischi



  • Ich habe gerade nochmal ein neues Release gemacht. Die Web-Version ist immernoch veraltet, aber Leute mit Windows können sich bei Sourceforge ein neues Binary runterladen. Am Freitag/Wochenende folgt dann eine neue Webversion, sowie ein neues source- und linux-release.

    Link zum Windows-Binary:
    http://prdownloads.sourceforge.net/cwmp/0.3.2-pre-win32-2005.03.31.zip?download



  • Fischi schrieb:

    ich würde ein "nicht definiert" oder -(5!) bevorzugen

    kann es sein dass dein Logarithmus zur Basis 2*PI arbeitet?

    Zu 1: Habe ich ganz vergessen da eine Fehlerbehandlung einzubauen. Wird in der nächsten Version mit drinne sein.

    Zu 2: In dem Handler für log() gab es einen Fehler. Ich werde das Problem sobald wie möglich beheben. Der Handler für log(a, b) (mit b = basis) funktioniert einwandfrei.

    Jetzt gehe ich erstmal ins Bett 🙂 Gute Nacht an alle!



  • So, jetzt ist die Web-Version wieder up-to-date. Wie gewohnt unter http://crock.servequake.com/~hackbert/cwmp-test/cwmp.php zu finden...

    Das Testen kann weitergehen!



  • eingabe: "3*x + 2*x"
    ausgabe: "x*3+x*2"

    er kanns immernoch nicht 😕


Anmelden zum Antworten