for i in [1,1] wird 2mal ausgeführt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Arachnid
User
Beiträge: 16
Registriert: Dienstag 27. Juli 2010, 18:32

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 :)
Zuletzt geändert von Arachnid am Montag 15. April 2013, 18:57, insgesamt 1-mal geändert.
BlackJack

@Arachnid: `sum()` nimmt maximal zwei Argumente entgegen, wobei das zweite auch noch optional ist und mit 0 vorbelegt.

Code: Alles auswählen

In [85]: sum?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:<built-in function sum>
Namespace:  Python builtin
Docstring:
sum(sequence[, start]) -> value

Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start' (which defaults to 0).  When the sequence is
empty, returns start.
Arachnid
User
Beiträge: 16
Registriert: Dienstag 27. Juli 2010, 18:32

BlackJack hat geschrieben:@Arachnid: `sum()` nimmt maximal zwei Argumente entgegen, wobei das zweite auch noch optional ist und mit 0 vorbelegt.

Code: Alles auswählen

In [85]: sum?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:<built-in function sum>
Namespace:  Python builtin
Docstring:
sum(sequence[, start]) -> value

Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start' (which defaults to 0).  When the sequence is
empty, returns start.
Okay, dann ist da definitiv ein Unetrschied zwischen Sage und Python. Denn wenn ich eine Syntaxabfrage für sum() in meiner Sageumgebung starte kriege ich folgendes:
File: /usr/local/sage-5.5/local/lib/python2.7/site-packages/sage/misc/functional.py

Type: <type ‘function’>

Definition: sum(expression, *args, **kwds)

Docstring:

Returns the symbolic sum ∑bv=aexpression with respect to the variable v with endpoints a and b.

INPUT:

expression - a symbolic expression
v - a variable or variable name
a - lower endpoint of the sum
b - upper endpoint of the sum
algorithm - (default: ‘maxima’) one of - ‘maxima’ - use Maxima (the default) - ‘maple’ - (optional) use Maple - ‘mathematica’ - (optional) use Mathematica
Bzw. wenn ich z.B. sum(5, 0, 3) eingebe folgende Fehlermeldung:
TypeError: symbolic_sum() takes at least 4 arguments (3 given)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Arachnid hat geschrieben:Okay, dann ist da definitiv ein Unetrschied zwischen Sage und Python. Denn wenn ich eine Syntaxabfrage für sum() in meiner Sageumgebung starte kriege ich folgendes
...
File: /usr/local/sage-5.5/local/lib/python2.7/site-packages/sage/misc/functional.py
Ohne Sage zu kennen, vermute ich, das da in Deinem Code etwas in der Art

Code: Alles auswählen

from sage import *
auftaucht und Dir die build-in sum-Funktion von Python verdeckt.
Antworten