Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
20.10.2008, 19:46
Felheart



Hallo lieber Thewaller,
wir haben seit einiger Zeit unsere neuen Rechner in der Schule,
er kann lineare Gleichungssysteme, Polynomgleichungen und allgemeine Gleichungen
auflösen.
Allderdings müssen bei ersteren beiden die Formeln in der Normalform vorliegen,
den Lösungsweg kann er nicht anzeigen und allgemeinen Gleichungen kann das
gute Gerät nur auflösen(mit einer Variablen), nicht vereinfachen.

Ich will jetzt selbst so ein System für den Computer programmieren.
Der Benutzer soll eine belibige Formel eingeben können und das Programm vereinfacht sie soweit wie mögleich, wenn möglich soll es sie dann auch gleich
komplett auflösen.

Wie ist da die beste vorgehensweise, sodass das Programm später Wurzeln und
Exponenten, Klammern auflösen und Punkt-vor-Strich kann?

Als einfaches Bespiel: Wie könnte ich 10x+2x vom Programm als 12x ausgeben lassen ?

--

zum Seitenanfang zum Seitenende Profil || Suche
001
20.10.2008, 20:28
Exec



sag doch mal lieber was das für ein rechner ist.
programmierbar, aber nicht fähig formeln zu vereinfachen klingt irgendwie unlogisch. aber man weiß ja nie.

--

"selbermachen rockt am meisten :D" - -LeJean-

zum Seitenanfang zum Seitenende Profil || Suche
002
20.10.2008, 20:39
Kloetengott



geht ja nicht um den schulrechner, sondern darum das er ein programm basteln will, das selbst formeln löst.
gibt es nicht die math.h bibliothek die schon sehr vieles vereinfacht?
ich gestehe ausser nem einfachem rechner hab ich in mathematischer hinsicht noch nichts komplexes gebaut in c (bevorzuge c).

ich würde sagen du musst den string in einzelteile zerlegen und einzeln berechnen. also alles x ist in eine variable legen und zusammen rechnen, alles was y ist usw.
wird aber schnell sehr umständlich.
ich bin mir fast sicher das es da entsprechende konstrukte in der math.h gibt...

--

"Kloetengott: Ich finde Leute die sich selbst zitieren echt armseelig!"

zum Seitenanfang zum Seitenende Profil || Suche
003
20.10.2008, 21:12
hausi



1. Mit yacc (oder ähnlichem) einen Lexer für Mathematische Ausdrücke erstellen
2. Mit lex einen Parser für den token stream erstellen
3. AST in eine etwas besser les- und navigierbare Form bringen (DOM)
4. Expression Evaluator schreiben (der wohl einfachste Teil).
5. Gleichungen löst man mit Hilfe des Gaussschen Eliminationsverfahren auf.
Edit: 6. Gaaanz viel Debugging ;)

Oder ganz einfach: Nach CAS (Computer Algebra System) suchen und einfach ein bereits bestehendes Projekt verwenden / weiterentwickeln. Neuentwicklungen in dieser Grössenordnung lohnen sich eigentlich nie, da sie wegen der Komplexität nicht mehr wirklich als persönliches Weiterbildungsprojekt durchgehen und auf dem Markt schon 100 existieren, die genau das und vieles mehr machen können.

--


Dieser Beitrag wurde am 20.10.2008 um 21:14 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
20.10.2008, 21:12
Felheart



@002: Stimmt ich will mein eigenes Programm machen.

Mit math.h kann man sin,cos,tan, sqrt und andere faxen machen, ja.
Eben das mit dem alles X in eine Variable und so hab ich mir auch schon so überlegt.
Aber dann würde das ja wider auf ein std::map<char, double> zurücklaufen.
Und das ganze in strings und dann splitten und so, da hast du recht, das ist SEHR aufwändig.
Gibt es da nicht ein Beispiel oder so?

Allgemein hab ich gedacht mir sowas: http://www.arndt-bruenner.de/mathe/scripts/gleichungssysteme.htm
Blos in "besser" und in c++ zu schreiben, mehr funktionen und so.
Ich hab mir da schon das .js angeguckt aber das ist auch nicht ganz einfach.

edit:
@hausi: Klingt logisch.
Aber Eliminationsverfahren will ich nicht benutzen, da man schriftlich so selten Gleichungen auflöst ;)
Obwohl bei dem Link kann man auch umstellen wie das Script es machen soll

--


Dieser Beitrag wurde am 20.10.2008 um 21:17 von Felheart bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
20.10.2008, 22:13
dp
Administrator


kurze und lange antwort,

1) vergiss es

2) du willst den input in einen AST parsen, in dem mittels umformungen aufloesen und am ende vereinfachungen auf den gesamten ausdruck anwenden. wenn dir string splitten schon zu aufwaendig ist, bekommst du nichtmal den baum hin. wenn dich das trotzdem nicht abhaelt, als allererstes koenntest du aber mal drueber nachdenken, ob du c, "c mit klassen" oder gar c++ benutzen willst.

wie schon festgestellt wurde, hilft math.h hier garnicht bzw. nur bei der -- vergleichsweise trivialen -- auswertung weiter.

--

zum Seitenanfang zum Seitenende Profil || Suche
006
21.10.2008, 00:38
Tuboatse-Harald



Es duerfte wahrscheinlicher sein, dass du Matlab entsprechend debuggst und hex'ed, dass da `(c) by Felheart' drin steht und du Lizenzschluessel vergeben kannst, als dass du jemals selber ein CAS schreibst. Spielst auf einem Niveau mit so einem Idioten, der fuer ein eigenes Spiel ein eigenes Layer 4 Protokoll entwickeln wollte.

--

Twisted and Brainfire.
Das Fleisch ist willig und der Club ist eine Fleischerei!

zum Seitenanfang zum Seitenende Profil || Suche
007
21.10.2008, 03:55
theDon



Matlab ist _kein_ CAS!

Zitat:
Tuboatse-Harald
Spielst auf einem Niveau mit so einem Idioten, der fuer ein eigenes Spiel ein eigenes Layer 4 Protokoll entwickeln wollte.
Ah, die gute, alte Zeit.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
008
21.10.2008, 16:39
Felheart



Ihr habt recht es ist mehr aufwand als gedacht.

@dp: Strings splitte ist mir nicht zu aufwändig, ich hab nur gefragt ob es einfacher geht. Hätte ja sein können das ich was überseh und mir mehr Arbeit mach als nötig.
Aber stimmt die Spielerei ist den Aufwand nicht wert. Vieleicht später mal.

@Harald: Was ist mit dir los? Schlechten Tag?

--

zum Seitenanfang zum Seitenende Profil || Suche
009
21.10.2008, 18:02
Kriz



Was Onkel Georg (hrhr) dir damit sagen möchte ist, daß nicht nur der programmierende Aufwand pervers hoch ist für einen Einzelnen, sondern auch das Verständnis dessen, was du im Vorfeld überhaupt begreifen musst, um so einen Termoptimierer zu entwickeln. Lassen wir mal nur das Mathematische beiseite, dann bleiben noch Spezialkenntnisse in Automatentheorie, Syntaxlehre, Grammatiken und Alphabete, reguläre Ausdrücke sowie grundlegende Datenstrukturen (Bäume), meinetwegen auch noch Design Patterns für's Feeling.

Das ist Stuff for Staff, sprich für viele Profis in einem Team.

Hausi hat's ja schon vorbemerkt: YACC/LEX bzw. BISON/FLEX sind deine Freunde sowie viel Material über C++, Algorithmen und Regular Expressions.

Mein Tipp: Probiere dich erstmal an simplen Evaluatoren (+,-,*,/ und Klammern), damit du mal ein Gefühl dafür bekommst, _was_ du eigentlich vorhast.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
010
21.10.2008, 22:58
LeJean



Die lexikalische Analyse könnte er ggf. mit ein paar Hilfen und Grundwissen über reguläre Ausdrücke noch zusammenbasteln, aber es wird spätestens an der Syntaxanalyse scheitern. Dann eine semantische Analyse um den Syntaxbaum zu attributieren, eine Ausgaberoutine, und und und..
Ich schätze, dass der aufwändigste Teil die Entwicklung der Grammatik ist.. hab aber in der Richtung selbst auch einige Zeit schon nichts mehr gemacht.

Aber das ist noch lange kein Projekt, das man nur mit "vielen Profis" bewältigen kann! Es bedarf nur äh.. einer - sagen wir "gründlichen" Einarbeitung.

--

zum Seitenanfang zum Seitenende Profil || Suche
011
22.10.2008, 13:02
Kriz



Alles Einzelgänger hier...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
012
22.10.2008, 14:46
scus



http://maxima.sourceforge.net/ kann Formeln vereinfachen...

--

sincères amitiés scus
--
Tand, Tand ist das Gebilde von Menschenhand

zum Seitenanfang zum Seitenende Profil || Suche