Potenzmethode

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

Potenzmethode

Beitragvon Lola234 » Mittwoch 20. Dezember 2017, 15:31

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

  1. def power_iteration(M: np.ndarray, epsilon: float = -1.0) -> (np.ndarray, list):
  2.  
  3.     if M.shape[0] != M.shape[1]:
  4.         raise ValueError("Matrix not nxn")
  5.  
  6.     if epsilon == -1:
  7.         epsilon = 10*np.finfo(float).eps
  8.  
  9.     n,m = M.shape
  10.     vector = np.random.rand(m)
  11.     z = np.empty_like(vector)
  12.  
  13.     residuals = []
  14.     residual = 2.0 * epsilon
  15.  
  16.     while residual > epsilon:
  17.         np.copyto(z, vector)
  18.         vector = np.dot(M,vector)
  19.         Vnorm = np.linalg.norm(vector)
  20.         residual = np.linalg.norm(vector-z)
  21.         residuals.append(residual)
  22.         vector = vector / Vnorm
  23.  
  24.     return vector, residuals
Benutzeravatar
miracle173
User
Beiträge: 120
Registriert: Samstag 6. Februar 2016, 00:28

Re: Potenzmethode

Beitragvon miracle173 » Montag 25. Dezember 2017, 12:24

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

Re: Potenzmethode

Beitragvon Sirius3 » Montag 25. Dezember 2017, 13:07

@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.

  1. def power_iteration(matrix, epsilon=None):
  2.     n, m = matrix.shape
  3.  
  4.     if n != m:
  5.         raise TypeError("Matrix not nxn")
  6.  
  7.     if epsilon is None:
  8.         epsilon = 10*np.finfo(float).eps
  9.  
  10.     vector = np.random.rand(m)
  11.     residuals = []
  12.     while True:
  13.         old_vector = vector
  14.         vector = matrix.dot(vector)
  15.         vector /= np.linalg.norm(vector)
  16.         residual = np.linalg.norm(vector - old_vector)
  17.         residuals.append(residual)
  18.         if residual < epsilon:
  19.             break
  20.  
  21.     return vector, residuals

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder