Seite 1 von 1

Potenzmethode

Verfasst: Mittwoch 20. Dezember 2017, 15:31
von Lola234
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

Re: Potenzmethode

Verfasst: Montag 25. Dezember 2017, 12:24
von miracle173
Was ist die Potenzmethode?

Re: Potenzmethode

Verfasst: Montag 25. Dezember 2017, 13:07
von Sirius3
@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