Anzeige

LGS mit Parameter


#1
Guten Tag

Es ist nicht schwer das Gausssche Lösungsverfahren zu programmieren, wenn die Eintrage alle Zahlen sind. Aber was ist wenn nicht nur Zahlen sondern auch Parameter vorkommen? Hat jemand eine Idee über eine Java-Klasse, die Matrizeneinträge auch als Parameter speichert?. Ein Matrix mit Parameter wäre



a[0][0]=1; a[0][1]=1+x*x; a[0][2]=1/(1+a) usw., wobei x, a Parameter sind



Gruß sandra
 
Zuletzt bearbeitet von einem Moderator:
#2
Hi

du meinst vermutlich das Eliminationsverfahren?

Wenn ja, wie geht das überhaupt ohne x, also nur mit Zahlen? Dann gibts ja nichts zum Lösen.

Wenn es immer nur um die selben Matrizen geht, einfach händisch abhängig von a lösen und dann in Java nur reinschreiben, wie man das Endergebnis mithilfe von a ausrechnet.

Sonst, mit Matrizen die der User ins Programm eingeben kann oder so, wird das bestenfalls nicht einfach. Arbeite dich in http://krum.rz.uni-mannheim.de/jas/ ein.
 
#4
In dem Fall musst du sowas wie JAS wohl selbst schreiben :rolleyes:
Es hat schon seinen Grund, dass ein Institutsleiter einer Uni 16 Jahre daran arbeitet und es trotzdem ziemlich mickrig ist, im Vergleich zu dem was zB. Mathematica kann (entwickelt seit 28 Jahren von einer Firma mit 700 Mitarbeitern, und auch das ist keineswegs perfekt).

Nur angenommen, man will das...
...

Schritt 1, Gleichungslösen

Angenommen, es soll nur Plus und Minus verstehen (was nicht sein kann, warum siehe unten).

a) Mit den BigNum-Klassen vertraut machen, damit man sich wenigstens um Overflows etc. keine Sorgen machen muss

b) Strings zu einem Tree Parsen
Dabei Klammern+Operatorprioritäten und unäres Minus beachten.
Nodetypen zB. Zahl, Variable, Plus, Minus

c) Einseitige Ausdrucksvereinfachung implementieren, Richtung "linearer"
Also für sowas wie "1+2*(3*4+5x/5a)" => "25+2x/a", nur eben ohne * und / gedacht
Beinhaltet Zusammenfassung ("1+1" => "2", "a+a" => "a+a" weil keine Multiplikation, "a-a" => 0, ggf. Reihenfolgeänderungen "4-2-4+2" => "0", Auflösen von Klammern (auch Minusumdrehung beachten), Entfernen von 0s, usw.

d) Zweiseitige (x+y=a+b) Umformungen zu einer bestimmten Variable hin (x=a+b-y)
Mit den selben Operationen wie oben.
Dabei auch beachten dass die Variable mehr als einmal vorkommen kann (x+x-y+y=a+b)
Auch beachten dass es evt. unendlich viele Lösungen gibt (x=x bzw. 0=0).

e) Auch unterstützen, nach den Umformungen für die Variablen werte einzusetzen und eine Zahl als Endergebnis zu bekommen. Idealerweise keine wirklichen Divisionen machen, sondern Brüche behalten.

(Schritt 2: Das obige System zum Rechnen verwenden und den Algo damit eben implementieren)

...

Ist schon kompliziert genug so, nur mit + und -. Und kann, wie oben gesagt, nicht funktionieren wegen Schritt d:

Was ist, wenn man zB. "x+x=2" herausbekommt? Genau, zunächst braucht man jetzt plötzlich doch Mulitplikation und Division, um "x=1" zu erhalten. Und damit eine ganze Reihe von weiteren Problemen: Beim Parsen Brüche einführen für fixe Kommazahlen (1.234 => 1234/1000), evt. gibt es keine Lösung (/0), evt. gibt es mehrere richtige ("x(x+2)=x", deswegen können Vars nicht einfach annuliert werden), wirkliche Klammerauflösungen, 0-Faktoren bei Klammern, Brüche auflösen wenn /1, Variablen und Primfaktoren von Bruchen rausannulieren wenn möglich, Polynomdivision, PD-Umkehrungen, ...

Und wenn man das alles hat geht der Wahnsinn erst richtig los: So wie "x+x=2" oben kanns ja auch "x*x=2" geben, und damit bekommt man Pow/Root. Ohne viel Details diesmal, aber kommen natürlich noch mehr Sachen dazu (virtuelle Imaginäre, Logbasen, Taylor...).

Als nächstes Level braucht man dann Exp/Ln, das wiederrum braucht Differentation, das Integrale, das...
was danach kommt braucht schon zum Kennen der Namen ein Mathematikstudium , und der SymbComp-Teil ist ein aktives Forschungsgebiet.
 
Zuletzt bearbeitet:
#7
ich will nicht alles programmieren Nur eine Klasse umm LGS zu lösen mehr nicht
Das ist auch alles, worum es in meinem Beitrag geht.

.
Nochmal überdeutlich:

Wenn es um eine fixe Gleichung geht: händisch auflösen, die Variablenwerte vom Benutzer abfragen, und die Lösungsformel damit fix ins Java-Programm reinschreiben.

Wenn nicht: Lib/Fertigsoftware verwenden, oder gleich vergessen, viel zu viel Arbeit.
.

Und die Polnische Notation als Notation selber hilft maximal zum Debuggen.
Die Idee dahinter ist aber sehr wichtig für den Parser-Tree (Teil b oben)
 
Anzeige
Anzeige