Scipy: Fehler in Eigenwertberechnung?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
turbo
User
Beiträge: 2
Registriert: Donnerstag 11. Oktober 2007, 10:47

Hallo!
Für eine Aufgabe benötige ich Eigenwerte, die ich mit scipy.linalg.eigvals(matrix) berechne. Da mir die Ergebnisse der Berechnung komisch vorkamen, hab ich die berechneten Werte überprüft. (Nach dem Muster det(matrix - lambda * E) = 0?):

Code: Alles auswählen

import scipy as S
import scipy.linalg as L
import random

def test(m):
	eig = L.eigvals(m)
	dim = S.shape(m)[0]
	eye = S.matrix(S.eye(dim,dim))
	for x in eig:
		eye_t = eye * x.real
		D = m - eye_t
		det = L.det(D)
		print 'Eigenwert:   ',x.real
		print 'Determinante nach Test:',det

def generate_matrix(dim, size):
	A = S.matrix(S.zeros((dim,dim)))
	for i in range(dim):
		for j in range(dim):
			A[i,j] = random.random()*size
	A *= A.transpose() #Symmetrisierung der Matrix
	print 'Groeßter Wert in der getesteten Matrix:',A.max()
	return A
	
def exe(i, size):
	for k in range(i):
		print 'Dimension der Matrix:',k+1
		A = generate_matrix(k+1,size)
		test(A)
		print'---------------'
Wenn ich diesen Code ausführe, beispielsweise mit:

>>>exe(30,2)

So ist das Ergebnis der Determinante bei fast allen Größen nicht wie erwartet 0, sondern extrem groß, immer größer werdend mit höherer Dimension.

Mache ich einen Fehler im Test?
Berechnet scipy falsche Werte?

Danke für die Hilfe im Voraus.

Grüße!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Nachdem deine berechnete Determinante bei kleinen Matrizen fast bei 0 liegt, nehme ich an, dass ein numerisches Problem bei einer der beiden Methoden auftritt. Natürlich ist zu hoffen, dass die von eigvals() berechneten Werte genau sind...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
turbo
User
Beiträge: 2
Registriert: Donnerstag 11. Oktober 2007, 10:47

birkenfeld hat geschrieben:Natürlich ist zu hoffen, dass die von eigvals() berechneten Werte genau sind...
Ich befürchte, dass das nicht der Fall ist. Denn nach der Python/SciPy Lösung habe ich es mit einer c++-Methode probiert, die vollkommen andere Ergebnisse liefert.
Kann es denn sein, dass eine veröffentlichte Methode derart falsch ist?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

turbo hat geschrieben: Kann es denn sein, dass eine veröffentlichte Methode derart falsch ist?
Ja, denn es ist schließlich ein offenes Projekt, in dem verschiedene Leute werkeln. Wie leicht unterläuft da mal ein Fehler?

Wende Dich doch einfach mit deinem Snippet an die Mailingliste (ich hoffe Du hast eine aktuelle scipy-Version?) und stelle Deine Frage dort. Die Entwickler lesen mit und entweder weisen sie Dich doch auf einen Schnitzer hin oder in der nächsten svn-Version ist der Fehler schnell korrigiert. (Jedenfalls meine Erfahrung.)

Gruß,
Christian
Antworten