Literatur Computer Algebra System



  • Das zweite Zitat ist nicht von mir.

    Dass ich das nicht kenne heißt nicht, dass es keine gibt 😉 Ich kanns mir allerdings auch nicht wirklich vorstellen. Und selbst wenn es sowas gibt, dann wäre es leider auch nicht sehr wahrscheinlich, dass der Code in dem Buch gut wäre. Ich stell mir das so ähnlich wie mit den ganzen Spielebüchern vor. Da versucht man ein Grundgerüst vorzustellen, wie man ein Spiel in C++ schreiben würde, dabei ist der Code aber oft miserabel, weil die Autoren selber wenig Ahnung davon haben. Und wer gut C++ kann, würde wahrscheinlich auch nicht versuchen, das in ein Buch mit DirectX/OpenGl und sonstigen spielerelevanten Themen zu packen.
    Was gibts an einem CAS als ganzes zu verstehen? Ich hab mich jetzt noch nie so wirklich intensiv damit befasst, aber ich stelle mir das als eine Menge von unabhängigen Problemen vor. Für einige davon gibt es sicherlich mehr oder weniger elegante Lösungen. Symbolisch differenzieren dürfte im Normalfall z.B. relativ einfach sein. Da kann man selber was schreiben. Symbolisch integrieren dürfte aber schon wesentlich schwieriger sein. Da gibts Verfahren, um die richtige Integrationsmethode zu finden, aber die sind glaub ich nicht so zuverlässig und der Benutzer könnte ja eine beliebige Funktion eingeben, die man erstmal geschickt aufteilen müsste. Das sind aber wahrscheinlich eher mathematische als programmiertechnische Probleme, lohnt sich kaum ein Buch darüber zu schreiben, wie man sowas programmiert. Und wie man sowas überhaupt macht wirst du in guten Büchern über Infinitesimalrechnung wahrscheinlich finden (hab keine gelesen, bin Informatiker).
    Dann gibts wahrscheinlich auch lauter kleine Problemchen, z.B. wie man "schöne" Werte darstellt. Als Ergebnis will man vielleicht Pi/2 sehen und nicht den Wert, aber woher weiß man das?



  • indem man durch Pi teilt



  • großbuchstaben schrieb:

    indem man durch Pi teilt

    War nur ein Beispiel. Könnte auch 2/3 * Pi sein, oder e ^ -3 usw. Ich glaube, sowas zu erkennen ist nicht einfach. Läuft aber wahrscheinlich tatsächlich auf etwas Bruteforce hinaus, mir fallen zumindest keine anderen Ansätze ein.



  • Es gäbe noch das Computer Algebra Handbook von Johannes Grabmeier, Erich Kaltofen und Volker Weispfenning.

    Gute Literatur dazu wäre wohl (auch) uralter Fortran-Code.
    Man könnte sich (zu konkreten Fragen) auch an Leute wenden, die Rechensysteme für "Public" entwickeln.
    Als Beispiele fallen mir hier GNU Octave ein oder Jasymca von Helmut Dersch.
    Außerdem gibt es eine Fachgruppe: http://www.fachgruppe-computeralgebra.de
    Hier ein Tutorial, wie man einen Scheme-Interpreter mit Haskell schreiben kann:
    http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours
    (Den Interpreter kann man dann als (luxuriöses) Frontend für die eigene Algorithmenbibliothek benutzen.)

    Es ist vielleicht noch hilfreich, sich über die (technische) Geschichte der CA zu informieren (um nicht das Rad neu erfinden zu müssen, oder um technische Entwicklungen und Workarounds zu verstehen). ABER:

    Ist es wirklich das Problem, dass dir noch Literatur fehlt, oder denkst du schon an ganz bestimmte technische Fragen?
    (Die noch nicht in den Büchern angesprochen wurden?)
    (Fehlt dir ein Entwicklungssystem, bzw. kannst du nicht nicht entscheiden?)
    (Ein erster Schritt wäre doch, die Algorithmen im Buch nach und nach in die eigene Bibliothek (mit) aufzunehmen, Funktionen testen usw. Ein anderer Schritt wäre, um über das Buchalgorithmen hinauszugehen, sich an bestimmten mathematischen (oder technischen) Vorlieben zu orientieren.



  • Das mit dem Zitat tut mir Leid, Mechanics. Werde ich sofort ändern.

    Die Algorithmen eines CAS, wie sie ja in meinen Büchern beschrieben sind, verstehe ich. Worüber ich aber noch nichts gelesen hab, ist der Aufbau eines CAS.
    Also welche Komponenten gibt es, ich hätte da spontan an

    -Parser, der die Eingabe analysiert und in einen Baum überführt, aber
    nur wenn es sich um eine Gleichung, ... handelt, wenn es sich um einen Operator
    wie zum Beispiel Derivate... handelt, wird dieser ausgeführt
    -Baumstruktur}
    -und die Algorithmen halt

    gedacht
    Also mein Probem ist eher die Organisation der Komponenten untereinander, als die
    ganzen Algorithmen.

    Das mit der Geschichte der CA erscheint mir eine gute Idee zu sein, und das Buch werde ich mir mal anschauen...

    Vielen Dank erstmlal!!!
    Gruß Paul



  • durchaus ein interessantes Thema.
    Muss dazusagen, dass ich noch nie auch ein annähernd so etwas implementiert habe.
    Allerdings habe ich schon Skript-Interpreter geschrieben, und dafür kann ich dir praxisnahe Bücher wie folgende empfehlen (beide lassen sich im Internet als PDF finden)

    • Wirth: Grundlagen und Techniken des Compilerbaus
    • Parr: Language Implementation Patterns

    Nachdem du die Bücher durch hast, bist du in der Lage solide Interpreter für durchaus einigermaßen mächtige Sprachen zu schreiben. Für mathematische Ausdrücke reicht das vollkommen. In deinem Fall reicht wahrscheinlich das Buch von Wirth, und dort im Speziellen die Kapitel über Scanner, Parser sowie Einbezug von Kontext (z.B. Datentypen). Codegenerierung (Bytecode, Maschinencode) ist bereits weniger interessant für dich.

    Damit hast du zumindest mal einen Syntaxbaum. Auf diesem würde ich nun arbeiten und die weiteren Auswertungen vornehmen.
    Du wirst in irgendeiner Form wohl eine Mustererkennung am Baum durchführen müssen. Z.B. wenn Muster x vorliegt, versuchst du durch Substitution zu integrieren, sonst mittels partieller Integration, usw. Mehr fällt mir dazu auch nicht ein. Denke aber, dass dir die Baumdarstellung durchaus hilft, dass dieser zweite Teil dann einfacher wird.



  • Das mit dem Interpreter ist jetzt nicht so das Problem. Das Buch von Wirth habe ich, und aus dem Magazin gibt es ja auch diesen einen Artikel über einen mathematischen Interpreter. Das habe ich alles durchgearbeitet, und ich habe meinen Interpreter noch um eigene Variablen, eigene Funktionen sowie Funktionsableitungen erweitert. Das ableiten war alles symbolisch, nur das
    Ausrechnen des Wertes war nummerisch. Das schwierigste daran war für mich das
    Zusammenspiel zwischen der Symboltabelle und dem Ableitungsprozess, da ja nicht
    nach jeder Variable abgeleitet (ode abgelitten wie mein Mathelehrer scherzenshalber einmal sagte 😃 ) wird. Am Ende gab das ein ganz schönes
    Gefrickel. Als ich dann eine andere Variante dazu in einer meiner Bücher fand, war
    ich echt erstaunt über die Einfachheit...



  • henriknikolas schrieb:

    da ja nicht
    nach jeder Variable abgeleitet (ode abgelitten wie mein Mathelehrer scherzenshalber einmal sagte 😃 ) wird. Am Ende gab das ein ganz schönes
    Gefrickel. Als ich dann eine andere Variante dazu in einer meiner Bücher fand, war
    ich echt erstaunt über die Einfachheit...

    Ähm, wonach abgelitten wird, ist doch Teil der Fragestellung.

    Frage

    ?diff(x^3,x)
    

    Antwort

    3*x
    

    Windowsuservereinfachungen wie
    Frage

    ?diff(x^3)//Oh, nur eine Variable drin, ich denke mir ?diff(x^3,x)
    

    sind erstmal was für Wolfram Alpha und für Anwender wie Dich und mich völlig irrelevant.



  • Also ich hatte den Einstieg mit einem beliebigen Lisp-Buch und vorne irgendwo wird schon ein symbolischer Ableiter in ein paar Zeilen Code vorgemacht.

    Ab dann nur der Gedanke, wie man im Prinzip Lisp betreibt, ohne Lisp als Engine benutzen zu müssen.

    Zum Rausfinden, daß sum(1,n,n^-1)==+inf nehme man Patternmatching und tippe den Bronstein ab.

    Und dann bleibt noch das willkürliche Umverfummeln.

    a=(x+1)(x+2)
    a=x^2+3
    x+2
    Was ist besser? Naja, mit der ersten Form kann man Nullstellen finden. Aber die zweite Form erlaubt erst, ein anderes Polynom zu subtrahieren und vielleicht kommt in Different ja was lineares raus. Man kann nicht vorher wissen, was die gute Darstellung eines Unterterms ist, um weiter zu vereinfachen. Da heißt es, die verschiedenen Varianten zu bruteforcen. Und DANN mei MuPad und Konsorten gucken, welche Tricks sie kennen, um weniger zu bruteforcen. Duellsterbfranzosen sind sowas von 30-er-Jahre. Ähm 1830, nicht 1930. Trotzdem zu kompliziert fürs Abi, weil die Lehrer es verstehen müssten vor dem Lehren und Lehrer werden eben die, die nicht erkennen, woanders dringend gebraucht zu werden.



  • @volkard:
    hast also schon was in die Richtung gemacht - erzähl mal was du alles umgesetzt hast, würd mich interessieren.



  • volkard schrieb:

    Frage

    ?diff(x^3,x)
    

    Antwort

    3*x
    

    ein CAS mit Sinn für Komik



  • Mechanics schrieb:

    War nur ein Beispiel. Könnte auch 2/3 * Pi sein, oder e ^ -3 usw. Ich glaube, sowas zu erkennen ist nicht einfach. Läuft aber wahrscheinlich tatsächlich auf etwas Bruteforce hinaus, mir fallen zumindest keine anderen Ansätze ein.

    man kann in einer Körpererweiterung wie Q(pi, e) rechnen, da sind 2/3 Pi und e^-3 schon enthalten.


Anmelden zum Antworten