Potenzmethode

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Lola234
User
Beiträge: 1
Registriert: Mittwoch 20. Dezember 2017, 15:14

Hi ich hab hier versucht die Potenzmethode zu Programmieren aber ich hab einen zeitfehler also das programm läuft zu lange
denke das liegt an der while schleife wo ich residual berechne
vielleicht sieht ja jemand nen fehler
bin leider totaler anfänger und das ist alles mehr geraten als gewusst
Danke schonmal

Code: Alles auswählen

def power_iteration(M: np.ndarray, epsilon: float = -1.0) -> (np.ndarray, list):

    if M.shape[0] != M.shape[1]:
        raise ValueError("Matrix not nxn")

    if epsilon == -1:
        epsilon = 10*np.finfo(float).eps

    n,m = M.shape
    vector = np.random.rand(m)
    z = np.empty_like(vector)

    residuals = []
    residual = 2.0 * epsilon

    while residual > epsilon:
        np.copyto(z, vector)
        vector = np.dot(M,vector)
        Vnorm = np.linalg.norm(vector)
        residual = np.linalg.norm(vector-z)
        residuals.append(residual)
        vector = vector / Vnorm

    return vector, residuals
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

Was ist die Potenzmethode?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lola234: was meinst Du mit "es läuft zu lange"? An was machst Du das fest?

Default-Werte sollten sich von normalen Werten unterscheiden und keine magische Zahl sein. Normalerweise wird `None` für "kein Wert angegeben" verwendet. So wie Du das programmiert hast, kannst Du aber auch direkt Dein Epsilon angeben.

Wenn es keine n x n -Matrix ist, würde ich das als TypeError und nicht als ValueError sehen. Statt künstlich einen Wert zu erzeugen, dass eine while-Schleife losläuft, nimmt man eine while-True-Schleife, die per if und break beendet wird. Variablen werden komplett klein geschrieben. Ansonsten schein mir das default-Epsilon ein bißchen klein.

Code: Alles auswählen

def power_iteration(matrix, epsilon=None):
    n, m = matrix.shape
 
    if n != m:
        raise TypeError("Matrix not nxn")
 
    if epsilon is None:
        epsilon = 10*np.finfo(float).eps
 
    vector = np.random.rand(m)
    residuals = []
    while True:
        old_vector = vector
        vector = matrix.dot(vector)
        vector /= np.linalg.norm(vector)
        residual = np.linalg.norm(vector - old_vector)
        residuals.append(residual)
        if residual < epsilon:
            break
 
    return vector, residuals
Antworten