Cramersche Regel

Du hast eine Idee für ein Projekt?
Antworten
pydeal
User
Beiträge: 2
Registriert: Montag 15. Februar 2016, 16:05

Hallo, ich bin relativ neu in pyhton.
Habe deshalb mal ganz klein angefangen und versucht die cramersche regel mal in ne Funktion zu setzen.
habe das auch soweit fertig, wenn auch viel zu kompliziert.
dummerweise bekomme ich kein Ergebnis beim ausführen. ´

Code: Alles auswählen

import numpy as np
def cr(ma,ve):
    import copy
    ma1=copy.deepcopy(ma)
    ma2=copy.deepcopy(ma)
    ma3=copy.deepcopy(ma)
    def ce(mat,ve,n):
        mat[0,n]=ve[0]
        mat[1,n]=ve[1]
        mat[2,n]=ve[2]
    ce(ma1,ve,0)
    ce(ma2,ve,1)
    ce(ma3,ve,2)
    x1=np.linalg.det(ma1)/np.linalg(ma)
    x2=np.linalg.det(ma2)/np.linalg(ma)
    x3=np.linalg.det(ma3)/np.linalg(ma)
    print(x1,x2,x3)
widerstandsmatrix=np.matrix('55 15 5;40 15 -5;25 -5 10')
loesungsvektor=[2,0,0]
cr(widerstandsmatrix,loesungsvektor)

kann mir jemand sagen wo der fehler liegt?
BlackJack

@pydeal: Also ich bekomme einen `TypeError` wenn ich das ausführe, und den solltest Du auch bekommen.

Falls Du auch der Mathematik kommst: In der Informatik schätzt man Namen bei denen man die Bedeutung ablesen kann. `cr` und `ce` sind keine guten Funktionsnamen. `ma`, `ve`, und Namen mit angehängten Nummern sind nicht gut. Bei letzterem will man in der Regel auch eher eine Datenstruktur wie eine Liste (oder ein Array) verwenden. Insbesondere wenn mit den durchnummerierten Werten gleichartig verfahren wird.

``import``-Anweisungen stehen in der Regel am Anfang des Moduls. Dazu (und zu Namen und Leerraum) verliert der Style Guide for Python Code ein paar Worte.

Das `copy`-Modul ist hier auch nicht nötig, da die Numpy-Arraytypen selber eine `copy()`-Methode besitzen.
pydeal
User
Beiträge: 2
Registriert: Montag 15. Februar 2016, 16:05

Danke, hab den Vektor als np.array umgeschrieben.
und alles mal bisschen besser benannt.
Nun habe ich noch ne frage. Ich würde das gerne für beliebige quadratische matrixen.
Kann ich die erzeugten matrixen irgendwie in eine Funktion schreiben, das je nach größe der Matrix entsprechend viele Kopien der Matrix erzeugt werden mit fortlaufenden namen?

Code: Alles auswählen

import numpy as np
widerstandsmatrix=np.matrix('25 -5 10;-5 40 15;10 15 55')
loesungsvektor=np.array([0,0,2])
cramer(widerstandsmatrix,loesungsvektor)
def cramer(matrix,vektor):
    matrix1=np.copy(matrix)
    matrix2=np.copy(matrix)
    matrix3=np.copy(matrix)
    def cramereinsetzung(matrize,vektor,n):
        matrize[0,n]=vektor[0]
        matrize[1,n]=vektor[1]
        matrize[2,n]=vektor[2]
    cramereinsetzung(matrix1,loesungsvektor,0)
    cramereinsetzung(matrix2,loesungsvektor,1)
    cramereinsetzung(matrix3,loesungsvektor,2)
    x1=np.linalg.det(matrix1)/np.linalg.det(matrix)
    x2=np.linalg.det(matrix2)/np.linalg.det(matrix)
    x3=np.linalg.det(matrix3)/np.linalg.det(matrix)
    print(x1,x2,x3)
   
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@pydeal: wenn man Variablen durchnummerieren will, will man eigentlich eine Liste benutzen. Und statt eine Datenstruktur zu kopieren und zu ändern ist es besser, die Daten gleich in ihrer endgültigen Form zu erzeugen:

Code: Alles auswählen

def cramer(matrix,vektor):
    det = np.linalg.det(matrix)
    result = []
    for n in range(matrix.shape[1]):
        matrix_neu = numpy.hstack([matrix[:,:n], vektor.reshape(-1,1), matrix[:,n+1:]])
        result.append(np.linalg.det(matrix_neu) / det)
    return result
Antworten