C/C++ symbolische Mathematik beibringen...



  • Gregor schrieb:

    Da geraded schon so eine Frage gestellt wird, erweiter ich die gleich mal mit den Themengebieten "symbolisches Integrieren" und "Lösen von Gifferentialgleichungen". Weiß jemand, wie man das einem Computer beibringt?

    Also, wenn die DGL in ner bestimmten Form gegeben ist, dann kann man das ganz kochrezeptmäßig lösen. Also ist das weniger ein Problem.
    Das hat zumindest mein Mathematik Lehrer gesagt. Beim Integrieren bin ich mir nicht sicher. Ich denke, dass da Näherungsverfahren ihre Anwendung finden.

    @Winn: IMHO kann man C++ gar nichts beibringen.



  • Näherungsverfahren scheiden aus, es geht hier ausdrücklich um symbolische Verfahren. Und die gibt es natürlich, wie sollten sonst Maple & Co. sowas machen? Wenns auch Lisp sein darf, empfehle ich dieses Buch: http://www.norvig.com/paip.html



  • Also wird das mit KI gemacht?



  • Kommt drauf an, was du unter KI verstehst.



  • Jover schrieb:

    @Winn: IMHO kann man C++ gar nichts beibringen.

    Hmm 😞 Kann man C/C++ nicht beibringen, wie man z.B. eine Matrix mit einer anderen Matrix multipliziert und dabei nicht Zahlen, sondern halt Variablen benutzt hat ? So ein Programm wie Mathematica kann das...

    thx@bashar, jetzt hab ich die englischen Suchbegriffe, werd mich mal direkt auf die Suche begeben... allerdings bin ich an C/C++ gebunden. Ich schau mal...

    EDIT: So hab jetzt mal allgemeiner angefangen und schaue mir "Computer Algebra and Symbolic Computation : Elementary Algorithms" von Cohen, Joel S. an http://www.amazon.de/exec/obidos/ASIN/1568811586/qid=1075848189/sr=1-2/ref=sr_1_8_2/302-6868897-6428808



  • Nein, C++ kannst du nichts beibringen. Du kannst ne Klasse schreiben die mit Matritzen rechnet.



  • Wäre irgendwie auch seltsam, wenn eine Sprache lernen könnte. Ein Compiler bestehend aus einem gigantischen neuronalen Netz?



  • Wäre irgendwie auch seltsam, wenn eine Sprache lernen könnte

    schau dir mal (Common) Lisp an. Ist zwar kein autonomes lernen. Aber man definiert in Lisp eigentlich seine eigenen Problemlösungssprachen. Zum Beispiel hab ich eine SQL Implementierung in Common Lisp geschrieben, so dass man direkt auf Sprach Ebene SQL ausführen kann und das aufwendige Parsen entfällt.

    Das von Bashar angesprochene Buch (PAIP) ist auf jeden Fall sehr interessant und lohnt sich!



  • Bashar schrieb:

    Kommt drauf an, was du unter KI verstehst.

    I stelle mir das so vor, dass das Programm den Mathematischen Ausdruck ansieht und dann mit Hilfe der KI entscheidet was es als nächstes machen soll. Wenn dann die KI noch dazulernt kann sie ja uU. gewisse Erfahrungswerte miteinbeziehen.

    Oder liege ich da falsch?



  • Das ist dann allerdings schon ziemlich kompliziert. Vielleicht sollte man erstmal klein Anfangen und den Rechner nach einer vorgegebenen Regelliste arbeiten lassen, wobei er immer die erste, die gerade paßt verwendet. Noch dazu könnte man die Auflösung in mehrere Schritte teilen:

    1. Auf Normalform (was immer das dann auch genau sein mag) bringen
    2. Lösungsverfahren ansetzen


  • Warum sollte ein symbolischer Integrierer dazulernen müssen? Die Integralregeln sind ja nun nicht unbedingt heftig in Bewegung, idealerweise kann er einfach alles.
    Ansonsten war das eine rhetorische Frage. Jedes Problem der KI hat die Tendenz, nicht mehr als KI zu gelten, sobald es gelöst ist.



  • Jester schrieb:

    Vielleicht sollte man erstmal klein Anfangen und den Rechner nach einer vorgegebenen Regelliste arbeiten lassen...

    Das sehe ich genauso ! Natürlich kann man C/C++ nichts beibringen, so daß er daraus "Neues" entwickelt... aber symbolisches Rechnen, wie ich es meinte bzw. nachdem ich suche, ist in Maple, Matlab, MathCad, Mathematica usw. schon umgesetzt worden...

    Brauche doch keine KI, um C/C++ die "abstrakte (=symbolische)" Matrizenrechnung beizubringen oder allgemeiner lineare Algebra.



  • Ich weiß jetzt nicht, ob ich euch so richtig verstanden habe. Aber ein Programm, was aufgrund der gegebenen Gleichung selbst entscheidet, was es damit tun soll, ist natürlich schon eine recht große Herausforderung. Aber wenn Du Dir vorstellst, daß Du mit Gleichung, wie z.B. Dein 'A*(B+C)=A*B+A*C' arbeitest und der PC mit diesen Gleichung ohne Zahlen arbeiten soll, dann würde ich das ganze vielleicht mit einem binären Baum angehen, um die Struktur der eingegebenen Gleichung erst einmal aufzunehmen. Danach müßtest Du eigentlich nur noch Vorgaben erstellen, nach denen diese Gleichung bearbeitet werden soll. Du könntest z.B. sagen, daß alle Klammern aufgelöst werden sollen. Oder man könnte z.B. A*A zu A² machen. Ich habe mal ein Programm für die gesamte Mathematik der Oberstufe geschriebenen. Und mit diesem binären Baum ließ sich das ganze recht angenehm lösen.



  • BorlandUser schrieb:

    ... dann würde ich das ganze vielleicht mit einem binären Baum angehen, um die Struktur der eingegebenen Gleichung erst einmal aufzunehmen...

    Ich habe mal ein Programm für die gesamte Mathematik der Oberstufe geschriebenen. Und mit diesem binären Baum ließ sich das ganze recht angenehm lösen.

    Das hab ich mir auch schon überlegt, es liegt einfach nahe es in einer Baumstruktur einzugliedern... in welcher Sprache hast Du denn Dein Programm für die Oberstufe geschrieben ? Quellcode ? 😃



  • Ich habe es damals in C++ für UNIX und Windows geschrieben. Es war ein wenig schwer es portabel zu bekommen, da ich die lineare Algebra auch mit 3D-Darstellungen veranschaulichen wollte. Lief ganz gut. Ich kann mal nach dem Quellcode schauen. Ist jetzt aber schon einige Zeit her. Und das Programm ist nach meinem Abitur nicht mehr wirklich viel zum Einsatz gekommen. Ich schau aber gerne mal nach. Kann aber etwas dauern und ich kann leider nichts versprechen.



  • Risch-Algorithmus. Ich kenne aber kein Buch dazu.



  • Eine große Schwierigkeit ist es auch, jeden Ausdruck auf eine kanonische Form zu bringen (d.h. gleiche Ausrücke auch als gleich zu erkennen.



  • Winn schrieb:

    Gute Begriffe, Links, Bücher... wenn ihr was wißt, bitte, her damit.

    keine ahnung. aber für mich wäre der naheliegende weg, nen lisp-interpreter in c++ zu implementieren (und die klassen würde ich xlisp nennen, wenn es xlisp nicht schon gäbe. vielleicht auch lisp plus plus (tip!)) und den gleichungslöser dann in lisp bauen.



  • Matrizen sind was für 3D Spiele. Jede gute Spiele Engine kapselt eine Klasse die mit Matrizen rechnen kann. Aber jede x beliebige Formel lösen, geht nur, wenn die Formel mit vielen vielen case Anweisungen zerlegt und analysiert wird.Für jede Möglichkeit muß dann eine andere Methode aufgerufen werden die das Ganze ausrechnet. Alles nur viel Fleissarbeit. Mathematik ist logisch und so lassen sich auch alle Gesetzte in Programm packen. Aber dafür ist bereits reichlich Anwendersoftware erstellt die auch bestens funktioniert.



  • @CRIUIX:

    Genau! Und deswegen lernen Informatiker im Studium fast nur 10-FingerSystem, damit sie nachher schnell tippen können! Möglicherweise dann auch in Partnerarbeit, so mit 20 Fingern!

    Mal im Ernst: glaubst Du wirklich, daß die sich bei z.B. Maple hingesetzt haben und das ganze mit switch-case analysiert haben und jeden einzelnen Fall einzeln implementiert haben? Nicht? Ich auch nicht. Sowas macht man mit allgemeinen Regeln, die man zum Beispiel in Prädikatenlogik oder ähnlichem kodiert. Die läßt man dann vom Rechner anwenden. Das einzige was man wirklich programmieren muß ist ein kleiner Parser, ein Term-Matcher und einen ordentlichen Suchalgorithmus mit ner guten Heuristik.

    MfG Jester


Anmelden zum Antworten