Gauss-Eliminierung

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
meta
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:20

Sonntag 3. Dezember 2017, 16:27

Hallo zusammen,

ich habe da ein Problem mit meinem Code
Es geht um die Eliminierung mithilfe von Gauss

Code: Alles auswählen

    for k in range(n):

        maxelem = abs(A[k:,k]).argmax() + k

        if maxelem > k:
            lowRowA         = A[k]
            A[k]            = A[maxelem]
            A[maxelem]      = lowRowA

            lowRowB         = b[k]
            b[k]            = b[maxelem]
            b[maxelem]      = lowRowB
            
            for row in A[k+1,n]:
                ratio  = A[k]/row[k]

                A[row] = A[k] - ratio*A[row]
                b[row] = b[k] - ratio*b[row]

    return A, b
der Fehler ist in diesem Block:
IndexError: index -9223372036854775808 is out of bounds for axis 0 with size 4

Ich bin noch ein Neuling was programmieren angeht.


kann mir wer da weiterhelfen
Danke
mfg meta
Sirius3
User
Beiträge: 8437
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 3. Dezember 2017, 18:25

@meta: um das Problem nachvollziehen zu können, braucht es die vollständige Fehlermeldung und ein lauffähiges Programm. Numpy macht keine Kopien des Inhalts bei einfachem Indexzugriff, so dass Deine Swap-Operationen nicht funktionieren. Schau Dir mal an welchen Werte »row« hat, und wie Du ihn benutzt.
meta
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:20

Sonntag 3. Dezember 2017, 18:56

Hallo
Danke für deine Antwort.

Code: Alles auswählen

def gaussian_elimination(A: np.ndarray, b: np.ndarray, use_pivoting: bool = True) -> (np.ndarray, np.ndarray):

    
     # TODO: Perform gaussian elimination
    for k in range(n):

        maxelem = abs(A[k:,k]).argmax() + k

        if maxelem > k:
            lowRowA         = A[k]
            A[k]            = A[maxelem]
            A[maxelem]      = lowRowA

            lowRowB         = b[k]
            b[k]            = b[maxelem]
            b[maxelem]      = lowRowB
            
            for row in A[k+1,n]:
                ratio  = A[k]/row[k]

                A[row] = A[k] - ratio*A[row]
                b[row] = b[k] - ratio*b[row]

    return A, b
der Fehler der ausgegeben wurde bei python
<ipython-input-33-269e413bb7a7> in gaussian_elimination(A, b, use_pivoting)
50 b[maxelem] = lowRowB
51
---> 52 for row in A[k+1,n]:
53 ratio = A[k]/row[k]
54

IndexError: index 4 is out of bounds for axis 1 with size 4

ich habe es da mit der Matrix A:
array([[ 1, 1, 3, 1],
[ 3, 1, 1, 2],
[ 4, 2, 4, 3],
[ 2, 0, -2, 1]])

und b:
mit dem 0 Vektor.
meta
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:20

Sonntag 3. Dezember 2017, 19:28

Ich habe den swap nochmal überarbeitet würde das ausreichen :

Code: Alles auswählen

        if maxelem > k:
            A[[k,maxelem]] = A[[maxelem, k]]
            b[[k,maxelem]] = b[[maxelem, k]]
Sirius3
User
Beiträge: 8437
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 3. Dezember 2017, 22:22

@meta: wäre das der Code, müßte ein NameError kommen, weil `n` nicht definiert ist. Ja, so kann man zwei Zeilen tauschen. Und nochmal der Tipp: schau Dir an, was `row` ist, bzw. sein sollte.
Antworten