Entwickler-Ecke

WinForms - Matrix


Noobie93 - Do 26.06.14 10:34
Titel: Matrix
Hallo

Wie im Bild gezeigt wird folgende Eingabe gemacht, leider weiß man nicht wie viele Unbekannte bzw. Gleichungen eingegeben werden.
Nun seht ihr meinen Quellcode. Was müsste ich hier ändern das er das in eine Matrix speichert. Also nur die Zahlenwerte?
LG


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    int[,] a;
        int anz;

        public static int Matrix(int anz) {

            for (int i = 0; i <= anz; i++)
            {
                int anz = richTextBox1.Items.Count;
                string gleichungx = richTextBox1.Items[anz - 1].ToString();
            }
        }


Ralf Jansen - Do 26.06.14 10:37

Hausaufgabe?


Noobie93 - Do 26.06.14 10:38

So auf die Art. Ich soll das Gauß'sche Eliminationsverfahren programmieren.


Ralf Jansen - Do 26.06.14 11:01

Wenn die Aufgabe keine freie Eingabe der Formel erzwingt solltest du das erstmal lassen und dir ein anderes Eingabeverfahren ausdenken. Also zum Beispiel einfach den User nach der größe der Matrix fragen und ihn dann eine entsprechende große Matrix eingeben lassen. Sonst bist du jetzt beim Formelparsing was schon ein gewisser Aufwand an sich ist und eigentlich nichts mit dem Problem des Eliminationsverfahren zu tun hat sondern schon ein größeres Problem in sich ist das dich vermutlich mehr beschäftigt als der eigentlich zu lösende Rechenverfahren.

Falls du das doch möchtest, bisher bist da nur an dem Punkt die einzelnen Gleichungen aus der Textbox zu holen.
Ein einfaches Auslesen der Zahlen aus diesen Gleichungen wird dir nicht helfen du brauchst schon etwas das näher an einem Parser für mathematische Ausdrücke ist da
a.) Der Faktor 1 nicht genannt wird du willst ihn aber bestimmt trotzdem bekommen. Variablen mit Faktor 0 nicht in der Gleichung stehen.
b.) Du Anhand der genannten Variablen erstmal die Größe der Matrix bestimmen mußt (und wie man aus a erkennt die Anzahl Zahlen nicht mit der Anzahl Variablen korrespondieren muß)
c.) Beachten mußt in welcher Reihenfolge die Variablen angeben wurden
d.) Allgemein Sinnhaftigkeit der Gleichungen testen mußt (sind es überhaupt gültige Ausdrücke, wird meine Matrix quadratisch also gibt es gleichviele Gleichungen und Variablen etc.)


Noobie93 - Do 26.06.14 13:28

Wie ist ein Parser aufgebaut?


Ralf Jansen - Do 26.06.14 14:28

Er zerlegt eine Ausdruck in bekannte Tokens (hier Operatoren, Variablen, Konstanten) und liefert als Ergebnis einen Ausdruck der von einem System dann auch einfach auswertbar ist. Anders also ein belibieger Ausdruck in einem string dessen Bedeutung nur dem Leser bekannt ist und nur vom Ansehen desjenigen als mathematische Gleichung erkannt werden kann.

Aber ich wiederhole noch mal wenn das nicht das eigentliche Problem war dann ignoierer das und beschäftige dich mit mit dem Gauß'sche Eliminationsverfahren. Das Parsen einer Gleichung ist eine Nebenkriegsschauplatz und eher schwieriger als das eigentliche Problem.


Th69 - Do 26.06.14 14:29

Hallo Noobie93, :welcome:

in deinem Crosspost myCSharp.de - Gleichungssystem richtig parsen [http://www.mycsharp.de/wbb2/thread.php?threadid=112053] wurde dir ja schon ein Link auf meinen Parser für mathematische Formeln [http://www.mycsharp.de/wbb2/thread.php?threadid=71995] gegeben (wo auch ein bißchen Theorie dazu erklärt wird).
Aber ich muß Ralf zustimmen, daß hierfür ein Parser (wahrscheinlich) deine bisherigen Kenntnisse übersteigt. Ich würde dir ebenfalls empfehlen, einfach eine Matrix in Tabellenform anzuzeigen (z.B. mit dem DataGridView).

Im Anhang habe ich mal einen Screenshot von einem meiner ähnlichen Programme gemacht (wenn auch mit dem Borland C++ Builder, d.h. der VCL, erstellt ;- ).


Noobie93 - Do 26.06.14 21:33

Ja aber der Parser ist ja das was ich benötige


Ralf Jansen - Do 26.06.14 21:54

Zitat:
Ist dieses jagged Array anders zu befüllen oder was mache ich falsch?


Jede Zeile im Array ist dann ein eigenes Array und muß dann explizit instanziiert werden.

also


C#-Quelltext
1:
2:
3:
4:
5:
6:
double[][] A = 
{
    new double[] { 01,  1 },
    new double[] { 24, -2 },
    new double[] { 0315 }
};


Edit: Häh???


Noobie93 - Do 26.06.14 23:30

Was ist kann bei meinem Quellcode falsch sein, das er auf die 4te Unbekannte nicht reagiert. Egal welche Zahl man eingibt es kommt immer 0,999999 raus.
Kann mir wer weiterhelfen?
Lg


freak4fun - Fr 27.06.14 01:43

Hast du das mal debugged? :shock:

Debuggen (MS VS 2013 E)



C#-Quelltext
1:
x[i] = (b[i] - sum) / A[i][i];                    


i = 3, b[3] = 0.41379310344827536, sum = 0, A[3][3] = 0.41379310344827586 <-- (Quelle: Debugger Lokal-Fenster) ;)

Edit: Hast du echt einen Java-Quellcode [http://introcs.cs.princeton.edu/java/95linear/GaussianElimination.java] kopiert und umgewandelt? :oops:


Noobie93 - Fr 27.06.14 08:51

Ja hab ich debugged. Mit 3 Unbekannten läuft es ja einwandfrei. Nur bei der 4ten fängt es dann an.
Wie kann ich diesen Fehler beheben?
Lg


Ralf Jansen - Fr 27.06.14 11:09

Rechne das Verfahren per Hand nach dann hast du die einzelnen Ergebnisse der Zwischensteps. Dann debugge den Code und siehe dir die Zwischensteps an. Dort wo es voneinander differiert schau dir den Code genauer an.
Ich würde dir empfehlen das Verfahren selbst zu programmieren dann tust du dich auch mit dem debuggen leichter. Und als Nebeneffekt lernst du Programmieren UND Mathe in einer Weise die haften bleibt.


Noobie93 - So 29.06.14 20:38

Hab es nun überarbeitet und es funktioniert nun alles :)
Jetzt werde ich mich dem Parser widmen.
Die Anzahl der Gleichungen kann ich ja mit Count auslesen. Doch wie splitte ich die Zahl vom Buchstaben und speicher beides seperat?
Lg