C# Determinante bestimmen

Neue Frage »

Auf diesen Beitrag antworten »
dennii09 C# Determinante bestimmen

Meine Frage:
Hallo,

und zwar möchte/soll ich die Determinanten von Matritzen bestimmen.
Ich möchte dies gerne über for-Schleifen machen, da ich finde, dass man es dadruch bestimmt am einfachsten hat.
Jedoch bin ich mir nicht ganz sicher, wie ich es mache. Für eine 2x2 Matrix habe ich es hinbekommen. Für eine 3x3 Matrix steht mir auch eine Idee im Kopf, jedoch ist der Rechnenweg mir zu lang und ich glaube es gehe auch kürzer.

Mein Code für die 2x2 Matrix sieht so aus, dass ich zwei for-schleifen mache, und eine Variabel soll die Zeilen, die andere die Spalten abarbeiten. Da die Schleifen ja die Variabeln mehrmals durchlaufen, ich aber nur einen Durchlauf benötige unterbreche ich die Schleifen einfach.

Könnt ihr mir helfen, wie man es 1. besser und 2. für eine 3x3 oder höhere Matrix machen kann?

Vielen Dank für eure Hilfe

Meine Ideen:
int[,] matrix = { { 2, 2 }, { 2,10} };


for(int i = 0;i<=matrix.GetLength(0)-1;i++)
{
for(int j=0;j<=matrix.GetLength(1)-1;j++)
{
int s1 = matrix[i, 0]*matrix[i+1,j+1]-matrix[i+1,j]*matrix[i,j+1];

Console.WriteLine(s1);
break;
}
break;
 
Auf diesen Beitrag antworten »
eulerscheZahl

Für 3x3 gibt es noch Sarrus, für höhere Ordnungen hilft Rekursion.
Du wirst aber recht schnell an die Grenzen kommen, wenn du es mit Unterdeterminanten angehst. Ich würde dir Gauss empfehlen, damit kriegst du es in annehmbarer Zeit hin.

Ich habe das vor einiger Zeit schonmal hier geschrieben, [C# IndexOutOfRangeException Problem]LINK[/URL].

Habe es mal auf dein Problem angepasst:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
private static double Determinante(double[,] matrix) {
	int n = matrix.GetLength (0);
	for (int i = 0; i < n; i++)
	{
		if (matrix[i, i] == 0)
		{
			for (int zeile=i; zeile<n; zeile++) {
				if (matrix [i, zeile] != 0) { //zeile tauschen
					for (int k = 0; k < n; k++) {
						double tmp = matrix [k, i];
						matrix [k, i] = matrix [k, zeile];
						matrix [k, zeile] = tmp;
					}
				}
			}
		}
		if (matrix[i, i] == 0) continue;
		for (int j = i + 1; j < n; j++)
		{
			//0er erzeugen durch Addition
			double faktor = -matrix[j, i] / matrix[i, i];
			for (int k = 0; k < n; k++) {
				matrix [j, k] += faktor * matrix [i, k];
			}
		}
	}
	double result = 1;
	for (int i = 0; i < n; i++) {
		result *= matrix [i, i];
	}
	return result;
}
Auf diesen Beitrag antworten »
dennii09

Puh, dass ist erstmal ein großer Brocken für einen, der die Informatik noch nicht so beherrscht. Na gut aber ich werde es schon hinbekommen.

Ich habe allerdings eine Frage bezüglich des Abschnitts, wo der Zeilen Tausch stattfindet. Kannst du mir den mal erklären, wie ich mir das vorstellen kann auch bezüglich der Schleifen?

Vielen Dank für deine Antwort und den Code.
Auf diesen Beitrag antworten »
eulerscheZahl

Ich tausche die Zeilen i[/i] und [b]zeile miteinander.
Mit k gehe ich die Spalten durch (ich stelle gerade fest, hier könnte ich auch bei i starten, statt bei 0).
Wenn ich den Wert der einen Zeile mit dem aus einer anderen überschreiben will, ist der erste Wert futsch, daher das Zwischenspeichern in tmp.

Bist du vertraut mit dem Gauß Algorithmus? Sonst würde ich dir raten, erst das Verfahren zu verstehen und dann den Code durchzulesen. Im Wikipediaartikel ist noch ein b auf der rechten Seite der Gleichung. Wenn du dir das wegdenkst und dann bei der Dreiecksmatrix das Produkt der Hauptdiagonalen bildest, hast du den Wert der Determinanten.

Edit: um meinen Code zu verstehen, reicht es, wenn du in der wikipedia Kapitel 1.1 liest.
 
Auf diesen Beitrag antworten »
dennii09

Ja mit dem Gauß-Algorithmus bin ich vertraut. Nur es in einen Quellcode zu schreiben braucht dann doch noch bisschen mehr. Aber danke für die Antwort hat mir auf jedenfall sehr geholfen und ich hoffe, dass ich damit dann auch Rechnungen oberhalb 3x3 Matrizen berechnen kann, indem ich deinen Code erweitere.

Vielen Dank für deine Hilfe.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »