lunar hat geschrieben:@Arachnid "sys.exit()" ist an dieser Stelle – innerhalb einer Funktion – ein absolutes No-Go. Nutze
Ausnahmen, um Fehler innerhalb von Funktionen anzuzeigen.
Danke, hab ich korrigiert.
Ich nehme an, sys.exit() sollte man vermeiden, weil es das ganze Programm abbricht, obwohl nur an einer isolierten Stelle, die nicht unbedingt das komplette Program betrifft ein Fehler vorliegt?
So dass mir nicht eine Funktion, in einem Programm, dass aus vielen besteht, das ganze Programm abbricht?
Ist das dann eher für die Programmstabilität oder für das Finden von Fehlern nützlich? Oder für beides?
lunar hat geschrieben:Die Funktion "listensumme()" ist identisch zur eingebauten Funktion
sum() und daher überflüssig.
Mhm, das hat bei mir jetzt nicht wirklich funktioniert. sum() nimmt ja immer 4 Argumente, klar ich könnte mit liste
dann über alle Listenelemente iterieren, das hat bei mir aber nicht wirklich geklappt, er hat dann immer eine Fehlermeldung angezeigt, dass ihm eine Summationsvariable fehlt. Beim Suchen nach einer Lösung, habe ich aber den Befehl add() gefunden, der mir sehr nützlich erschien. Ich hab den neuen Quellcode ganz unten, ist das so okay? Könnte es sein, dass hier ein Unterschied zwischen Python und Sage besteht? Das Sage sich sum() für mathematische Summen reserviert?
lunar hat geschrieben:In der ersten Schleife "for k in determinanten:" würde ich "k" eher "determinante" nennen, da "k" kein Zähler ist, sondern eben eine konkrete Determinante. Die Schleife selbst lässt sich mithilfe der eingebauten Funktion any() abkürzen zu:
Code: Alles auswählen
if any(d == 0 for d in determinanten):
raise ValueError("Keine LU-Zerlegung moeglich, Hauptabschittsdeterminanten verschwinden")
Statt "sys.exit()" verwende ich hier eine Ausnahme, um den Fehler anzuzeigen.
Danke, das mit "determinante" statt "k" ist tatsächlich einleuchtend und sinnvoller. Diese any()-Funktion kannte ich noch gar nicht, danke.
Kleine Frage noch zu dem raise-Befehl. Das "ValueError" gibt eine Klasse an, der der Fehler zugeordnet werden kann, habe ich das richtig verstanden? Also so, dass ich halt dann schnell erkennen kann, ob mein Eingabewert nicht stimmt oder vlt. ein Syntaxfehler vorliegt etc.?
lunar hat geschrieben:Die zwei inneren "for"-Schleifen lassen sich ebenfalls abkürzen:
Code: Alles auswählen
lk.extend(0 for i in range(k))
lk.extend((1/A[k-1,k-1])*A[i-1,k-1] for i in range(k + 1, n + 1))
Danke, liste.extend() war mir nicht so geläufig, hab das zwar gelesen, aber wenn man ständig nur mit liste.append() arbeitet, vergisst man sowas schnell. Wenn ich das richtig sehe, ist .extend() praktisch genauso wie .append(), nur dass ich mit .extend() gleich mehrere Werte hinzufügen kann, sehe ich das richtig?
lunar hat geschrieben:Um Operatoren wie "+" oder "!=", sowie nach Kommata in den Argumente für Funktion werden in Python üblicherweise Leerzeichen platziert, um die Lesbarkeit zu erhöhen.
Okay, ist sinnvoll. Habe ich gemacht, hoffe ich habe nichts übersehen.
lunar hat geschrieben:Die Variablen würde ich englisch benennen, da sich ein Gemisch aus deutschen Namen und englischen Schlüsselwörtern einfach komisch liest. YMMV.
[/quote][/quote]
Okay, auch verständlich. Werde ich mich wohl zukünftig dran halten, sofern mir die nötigen englischen Begriffe vertraut sind.
Die Fehlerausgabe habe ich dennoch auf deutsch gelassen, erschien mir hier eher angemessen.
Okay, hier also mein überarbeiter Quellcode:
Code: Alles auswählen
def LUDecomposition(M):
A = M
n = A.nrows()
m = A.ncols()
subdeterminants = [det(A.submatrix(0, 0, k, k)) for k in range(1, n)]
if n != m:
raise ValueError ("Keine LU-Zerlegung moeglich, Matrix ist nicht quadratisch")
if any(subdeterminant == 0 for subdeterminant in subdeterminants):
raise ValueError ("Keine LU-Zerlegung moeglich, Hauptabschnittsdeterminanten verschwinden")
I = identity_matrix(n)
listlkek = []
for k in range(1, n):
lk = []
ek = matrix([0 if i != k else 1 for i in range(1, n+1)])
lk.extend(0 for i in range(1, k+1))
lk.extend((1 / A[k-1, k-1]) * A[i-1, k-1] for i in range(k+1, n+1))
lk = matrix(lk)
Mk = I - lk.transpose()*ek
A = Mk*A
listlkek.append(lk.transpose()*ek)
U = A
L = I + add(listlkek)
return L, U
M = matrix([ [1, 2, 3], [6, 3, 1], [9, 3, 2] ])
result = LUDecomposition(M)
print "L ist: \n{0}\n\nUnd U ist: \n{1}".format(result[0], result[1])
Ich habe noch einige kleine Änderungen daran vorgenommen, von denen ich meinte sie verbessern die Ausgabe, so dass man halt auch richtig sieht, was das Endergebnis ist.
Auf jeden Fall nochmal vielen Dank für die ganze Hilfe