Ing Mathematik: Numerisches Lösen von Eigenwertproblemen

Aus testwiki
Version vom 20. Oktober 2024, 15:16 Uhr von imported>Intruder (Wielandt-Iteration)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Vorlage:Navigation zurückhochvor buch

Insbesondere bei Schwingungen sind Eigenwerte und -vektoren von Bedeutung (siehe z.B. Vorlage:W oder Hagedorn, Hochlenert: Technische Schwingungslehre. Harri Deutsch, 2012, ISBN 978-3-8171-1890-8). Aber auch die Hauptspannungen in der Festigkeitslehre können als Eigenwertproblem behandelt werden (siehe z.B. Vorlage:W und Hagedorn, Wallaschek: Technische Mechanik Bd.2, Festigkeitslehre. Europa, 5.Aufl., 2015, ISBN 978-3-8085-5691-7).

Eigenwerte und Eigenvektoren - Allgemeines

Es sei

Ax=λx mit An×n,xn,λ.

AxλIx=0 mit I als nxn-Einheitsmatrix.

(AλI)x=0

Für nicht triviale Lösungen (x0) muss gelten:

det(AλI)=0 (charakteristische Gleichung oder Säkulargleichung).

λn+αn1λn1++α1λ+α0=0. Die Lösungen dieses Polynoms heißen Eigenwerte.

α0=detA;αn1=SpurA;αn=1

Ein Polynom vom Grad n hat maximal n Nullstellen. D.h. es gibt auch höchstens n Eigenwerte. Die zu λi gehörenden Vektoren xi0 heißen Eigenvektoren.

Siehe auch Vorlage:W.

Ein Beispiel mit Python und SciPy:

import numpy as np
import scipy.linalg as la

A = np.array([[ 24,  54, -38,  -8],
              [-11, -27,  20,  -2],
              [  0,  -2,   3,  -6],
              [  6,  14,  -10, -1]])

w, v = la.eig(A)

# Eigenwerte
print(w)
# Eigenvektoren
print(v)

Ausgabe:

[-3.+0.j  2.+0.j  1.+0.j -1.+0.j]
[[-9.05821627e-01  4.08248290e-01 -9.25820100e-01  9.17662935e-01]
 [ 3.39683110e-01  4.08248290e-01  1.54303350e-01 -2.29415734e-01]
 [-1.13227703e-01  8.16496581e-01 -3.08606700e-01  2.29415734e-01]
 [-2.26455407e-01  1.93235474e-14 -1.54303350e-01  2.29415734e-01]]
 

Siehe auch [1]

Spektrum einer Matrix

Die Menge der Eigenwerte nennt man das Spektrum σ(A). Der Spektralradius ist ρ=max(|λi|).

Vielfachheiten

  • Algebraische Vielfachheit: κi (k-facher Eigenwert von A)
SpurA=κ1λ1+κrγr
detA=λ1κ1λrγr
  • Geometrische Vielfachheit: γi=dim Kern(AλiI)=nRang(AλiI)

Mehrfache Nullstellen werden entsprechend ihrer Vielfachheit gezählt.

Symmetrische Matrizen

Für reelle, symmetrische Matrizen gilt:

  • Eigenwerte sind reell
  • Eigenvektoren stehen senkrecht aufeinander
  • geometrische und algebraische Vielfachheit stimmen bei jedem Eigenwert überein.

Seien

  • p ... Anzahl der positiven Eigenwerte der symmetrischen Matrix S
  • q ... Anzahl der negativen Eigenwerte der symmetrischen Matrix S
  • d ... Anzahl der Eigenwerte die Null sind.

Dann sind

  • (p, q) ... Signatur von S
  • p-q ... Trägheitsindex von S
  • d ... Defekt von S.

Eine symmetrische Matrix ist positiv definit, wenn alle ihre Eigenwerte > 0 sind.

Siehe auch Vorlage:W.

Diagonalisierbarkeit

Eine Matrix A lässt sich diagonalisieren, wenn sie n linear unabhängige Eigenvektoren x1,,xn aufweist.

C=(x1,,xn)

C1AC=diag(λ1,,λn)

Jordansche Normalform

Marie Ennemond Camille Jordan (französischer Mathematiker, 1838-1922)

Nicht jede Matrix ist diagonalisierbar. Aber jede quadratisch komplexe Matrix A lässt sich auf die jordansche Normalform J bringen.

T1AT=J=(J100Jk)

mit T regulär komplex, Jj=(λj10λj1λj10λj)sj×sj

Wie man die Transformation auf die jordansche Normalform durchführt (Berechnung von J,T aus gegebenen A), siehe z.B. Burg, Haf, Wille, Meister: Seite 237ff. Dies ist einigermaßen aufwendig. Umgekehrt ist das natürlich sehr einfach.

Shift - Verschieben von Eigenwerten

Sind λi die Eigenwerte der nxn-Matrix A, so hat die Matrix Aϵ=A+ϵI die Eigenwerte μi=λi+ϵ. λi und die μi haben gleiche algebraische Vielfachheit.

Hessenbergmatrix

Eine (obere) Hessenbergmatrix ist eine quadratische Matrix Hn×n, deren Einträge unterhalb der ersten Nebendiagonalen gleich Null sind, also hij=0 für alle i>j+1.

H=(h11h12h13h1nh21h22h23h2n0h32h33h3n00hnn1hnn)

Siehe auch Vorlage:W.

Krylov-Verfahren

Das Krylov-Verfahren eignet sich nur für kleine Matrizen (n8) (Quelle: Burg, Haf, Wille, Meister: Seite 249). Die Matrix A habe nur unterschiedliche Eigenwerte. Das Verfahren ist ziemlich instabil. Es wird deshalb in der Praxis nur selten eingesetzt.

Gegeben sei eine 4x4-Matrix A. Startvektor sei z0=[1,1,1,1]. Funktioniert das nicht, fährt man mit z0=[1,1,1,1] fort usw. Funktioniert das alles nicht, so lässt sich das Problem mit dem Krylov-Verfahren nicht lösen.

Python-Code (rudimentär):

import numpy as np
import scipy.linalg as la
import scipy.optimize as opt
import matplotlib.pyplot as plt

# 4x4-Matrix
A = np.array([[3, 1, -10, 5],
              [1, -7, 1, 2],
              [-10, 1, 3, -6],
              [5, 2,  -6, -1]])

n = A.shape[0]
z = np.zeros((n,n))
zn = np.zeros(n)

# Koeffizientenmatrix für lin. GS erstellen
z[:,0] = [ 1, 1, 1, 1]

for k in np.arange(1, n):
    z[:,k] = A @ z[:,k-1]

zn = A @ z[:,3]

# Löse lin. GS
x = la.solve(z, -(-1)**4 * zn)

# Polynom erstellen
p = np.poly1d([1, x[3], x[2], x[1], x[0]])

# Nullwerte ermitteln
eigenwert = np.zeros(n)

for k in np.arange(0, n):
    if k == n-1:
        i = 15
    else:
        i = -10 + k*4
    eigenwert[k] = opt.newton(p, i) 

# Konsolenausgabe
for k in np.arange(0, n):
    print(eigenwert[k])

# Grafik
x = np.arange(-12, 20, .1)
y = p(x)
x1 = np.arange(-10, 0, .1)
y1 = p(x1)

plt.plot(x, y)
for k in np.arange(0, n):
    plt.plot(eigenwert[k], 0, "o")

plt.axes([0.3, 0.5, 0.25, 0.25])
plt.plot(x1, y1)
for k in np.arange(0, n-1):
    plt.plot(eigenwert[k], 0, "o") 

plt.grid()
plt.show()

Konsolenausgabe:

-9.125090927816691
-5.8570090791499965
-3.5129666875859895
16.49506669455273

Grafik:

Das charakteristische Polynom für dieses Beispiel lautet: χ(x)=x4+2x3199x21562x3097=0

Jacobi-Verfahren

Dieses Verfahren eignet sich für kleine reelle symmetrische Matrizen. Es arbeitet mit Givens-Rotationen:

A(0)=A

Rk=[10000cosφsinφ00sinφcosφ00001],

Damit folgt wieder die symmetrische Matrix A(1)=RkTARk. Führt man dies immer weiter durch, so ergibt sich eine Diagonalmatrix.

A(k+1)=RkTA(k)Rk=RkTRk1TR0TTkTA(0)R0Rk1RkTk=diag(λ1,,λn)

Siehe auch Vorlage:W, Burg, Haf, Wille, Meister: Seite 251ff, Hanke-Bourgeois: Seite 238ff oder [2].

Potenzmethode nach von Mises

Richard von Mises (österreichisch-US-amerikanischer Mathematiker, 1883-1953)

Sie wird auch Vektoriteration oder Von-Mises-Iteration genannt und berechnet den betragsgrößten Eigenwert. Sie eignet sich besonders für dünnbesetzte Matrizen. Das Verfahren lässt sich den Krylow-Unterraum-Verfahren zuordnen.

Python-Code:

import numpy as np

A = np.array([[3, 1, -10, 5],
              [1, -7, 1, 2],
              [-10, 1, 3, -6],
              [5, 2,  -6, -1]]) 

r = [1,1,1,1]

for k in np.arange(0,50):
    r = A@r
    lam = np.max(np.absolute(r))
    r = r/lam

print(lam)

Ausgabe:

16.495066694547337

Siehe auch Vorlage:W, Burg, Haf, Wille, Meister: Seite 254ff, Hanke-Bourgeois: Seite 218ff

Deflation

Siehe vorerst Vorlage:W und Burg, Haf, Wille, Meister: Seite 257f.

Wielandt-Iteration

Helmut Wielandt (deutscher Mathematiker, 1910-2001)

Siehe vorerst Vorlage:W und Burg, Haf, Wille, Meister: Seite 258f.

Lanczos-Verfahren

Siehe vorerst Vorlage:W und Hanke-Bourgeois: Seite 259ff

Weitere Verfahren

  • QR-Verfahren basierend auf der Hessenberg-Matrix (siehe auch Vorlage:W, und Hanke-Bourgeois: Seite 227ff)
  • Hyman-Verfahren

Eigenwerte und -vektoren mit SciPy

Mit SciPy und Python lassen sich die Eigenwerte und -vektoren sehr einfach berechnen. Dazu gibt es eine Reihe von SciPy-Funktionen. Nachfolgend wird die Verwendung einiger dieser Funktionen gezeigt. Siehe dazu auch die SciPy-Dokumentation [3].

Python-Code (gegeben sei eine symmetrische Matrix):

import numpy as np
from scipy import linalg

a = np.array([[3, 1, -10, 5],
              [1, -7, 1, 2],
              [-10, 1, 3, -6],
              [5, 2,  -6, -1]])

ev1 = linalg.eigvals(a)   # Eigenwerte für allgemeine Matrizen
ev2 = linalg.eigvalsh(a)  # Eigenwerte für symmetrische/hermitesche Matrizen
w, vl = linalg.eig(a)     # Eigenwerte und Eigenvektoren

print(ev1)
print("-"*75)
print(ev2)
print("-"*75)
print(w)
print("-"*75)
print(vl)

Ausgabe:

[16.49506669+0.j -9.12509093+0.j -5.85700908+0.j -3.51296669+0.j]
---------------------------------------------------------------------------
[-9.12509093 -5.85700908 -3.51296669 16.49506669]
---------------------------------------------------------------------------
[16.49506669+0.j -9.12509093+0.j -5.85700908+0.j -3.51296669+0.j]
---------------------------------------------------------------------------
[ 0.63731292  0.33339446  0.64983438 -0.24575529]
[ 0.03424931 -0.71822344  0.51243339  0.4694615 ]
[-0.65183109  0.5045163   0.48861626  0.28606588]
[ 0.40960403  0.34418968 -0.27637196  0.79835866]]

Gedruckte Werke (auszugsweise)

  • Burg, Haf, Wille, Meister: Höhere Mathematik für Ingenieure, Band II: Lineare Algebra. 7. Auflage, Springer Vieweg, 2012, ISBN 978-3-8348-1853-9
  • Hanke-Bourgeois: Grundlagen der Numerischen Mathematik und des Wissenschaftlichen Rechnens. 3. Aufl., Vieweg+Teubner, 2009, ISBN 978-3-8348-0708-3


Vorlage:Navigation zurückhochvor buch