ich habe mich jetzt daran gemacht, das Gaußsche Eliminationsverfahren in Python zu schreiben.
Als Vorlage habe ich einen Pseudocode benutzt, der mich so ungefähr durch den Algorithmus gebracht hat. Viele Probleme habe ich gelöst und habe jetzt auch eine Ausgabe, nur leider ist sie falsch.
Würde mich freuen, wenn mal jemand kurz drüberschauen könnte, ich hoffe ich habe mein Werk gut genug kommentiert.
Was vielleicht unverständlich sein könnte: im Pseudocode fangen die Angaben Zeilen/Reihen bei 1 an, bei Python in einer Liste aber bei 0, somit musste ich das abändern.
Aber schaut selbst:
Code: Alles auswählen
i := 1
j := 1
while (i <= m and j <= n) do
Find pivot in column j, starting in row i:
maxi := i
for k := i+1 to m do
if abs(A[k,j]) > abs(A[maxi,j]) then
maxi := k
end if
end for
if A[maxi,j] != 0 then
swap rows i and maxi, but do not change the value of i
Now A[i,j] will contain the old value of A[maxi,j].
divide each entry in row i by A[i,j]
Now A[i,j] will have the value 1.
for u := i+1 to m do
subtract A[u,j] * row i from row u
Now A[u,j] will be 0, since A[u,j] - A[i,j] * A[u,j] = A[u,j] - 1 * A[u,j] = 0.
end for
i := i + 1
end if
j := j + 1
end while
Code: Alles auswählen
def gaus(matrix):
(m, n) = (len(matrix), len(matrix[0])) # Groesse der Matrix bestimmen
i = 0
j = 0
# Index anpassen, denn 3+2 entspricht 0-2 und 0-1
m -= 1
n -= 1
while i <= m and j <= n:
maxi = i
for k in range (i+1,m+1):
if matrix[k][j] > matrix[maxi][j]:
maxi = k
if matrix[maxi][j] != 0:
# Reihen tauschen
line = matrix[i]
matrix[i] = matrix[maxi]
matrix[maxi] = line
# jede Spalte in Reihe i durch den Wer in [i][j] teilen
for spalte in range (0,n+1):
matrix[i][spalte] /= matrix[i][j]
# matrix[u][j]* Reihe i von Reihe u abziehen
for u in range (i,m+1):
for v in range (0,n+1):
matrix[u][v] -= matrix[u][j]*matrix[i][v]
i = i+1
j = j+1
matrix = [[2.0, 1.0, -1.0, 8.0],
[-3.0, -1.0, 2.0, -11.0],
[-2.0, 1.0, 2.0, -3.0]]
gaus(matrix)
print matrix