Unterschiedlicher Output von Surface und Laptop

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
Haennes
User
Beiträge: 4
Registriert: Dienstag 9. Dezember 2014, 20:40

Hallo liebes Python-Forum.

Ich hab ein Programm geschrieben welches das CG-Verfahren auf ein lineares Gleichungssystem anwendet. Das ist aber auch unwichtig worum es geht.
Mein Problem is folgendes:
Wenn ich das Programm auf meinem Laptop ausführe gibt mir die CMD bei den letzten beiden Ausgaben Vektoren nur mit nan aus.
Wenn ich das Programm auf dem Surface (wo ich es auch programmiert habe) ausführe gibt es zu 80% die richtige Lösung aus und zu 20% in etwa die gleichen nan vektoren wie auf dem Laptop. Ich verändere nichts und es ist genau der gleiche code.
Sowohl auf dem Laptop als auch auf dem Surface läuft Python 2.7.8.
Ich könnte zufrieden sein, dass es auf dem Surface richtig läuft aber ich würde gerne wissen wo der Fehler nun steckt um ihn in weiteren Projekten zu vermeiden.

Grüße Hannes

Code: Alles auswählen

 # CG-Verfahren
import numpy as np
import sys

A1 = np.empty([5,5])  	# Konstruktion von A mit m = 5
for i in range(1,6,1):
	for j in range(1,6,1):
		A1[i-1,j-1] = 1.0 / (i + j - 1.0)
		
A2 = np.empty([10,10])	# Konstruktion von A mit m = 10
for i in range(1,11,1):
	for j in range(1,11,1):
		A2[i-1,j-1] = 1.0 / (i + j - 1.0)
		
b1 = np.empty([5,1])	# Konstruktion von b mit m = 5	
for i in range(1,6,1):
	for j in range(1,6,1):
		b1[i-1] += ((-1.0)**(j-1.0))*(1.0/(i+j-1.0))
		
b2 = np.empty([10,1])	# Konstruktion von b mit m = 10
for i in range(1,11,1):
	for j in range(1,11,1):
		b2[i-1] += ((-1.0)**(j-1.0))*(1.0/(i+j-1.0))
		
x1 = np.empty([5,1])	# Exakte Loesung bei m = 5	
for i in range(1,6,1):
	x1[i-1] = (-1.0)**(i-1.0)
	
x2 = np.empty([10,1])	# Exakte Loesung bei m = 10
for i in range(1,11,1):
	x2[i-1] = (-1.0)**(i-1.0)


def cg(A,b,z_1,tol,x_i):		# Conjugate Gradients Method inklusive exakter Loesung x
	t_n = b - np.dot(A,z_1)
	r_n = b - np.dot(A,z_1)
	itcount = 1
	z_n = z_1
	while np.dot(np.transpose(r_n),r_n)[0,0] > tol:
		a_n = (np.dot(np.transpose(r_n),r_n)[0,0])/(np.dot(np.transpose(t_n),(np.dot(A,t_n)))[0,0])
		z_n = z_n + a_n*t_n
		r_n = b - np.dot(A,z_n)
		g_n = (-1) * (np.dot(np.transpose(t_n),np.dot(A,r_n))[0,0])/(np.dot(np.transpose(t_n),np.dot(A,t_n))[0,0])
		t_n = r_n + g_n * t_n
		itcount += 1
	else:
		print(z_n)
		print("Fehler: ")
		print(x_i - z_n)
		print("Iterationen: ")
		print(itcount)

print("CG-Verfahren mit m = 5 und tol = 1e-8: ")
cg(A1,b1,np.array([[0],[0],[0],[0],[0]]),1e-8,x1)
print("CG-Verfahren mit m = 5 und tol = 1e-13: ")
cg(A1,b1,np.array([[0],[0],[0],[0],[0]]),1e-13,x1)
print("CG-Verfahren mit m = 10 und tol = 1e-8: ")
cg(A2,b2,np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0]]),1e-8,x2)
print("CG-Verfahren mit m = 10 und tol = 1e-13: ")
cg(A2,b2,np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0]]),1e-13,x2)
print(sys.version) 
BlackJack

@Haennes: Ich bekomme da gar keine NaNs bei heraus:

Code: Alles auswählen

$ python forum.py
CG-Verfahren mit m = 5 und tol = 1e-8: 
[[ 0.98922716]
 [-0.79590653]
 [ 0.11347639]
 [ 0.34499104]
 [ 0.33993093]]
Fehler: 
[[ 0.01077284]
 [-0.20409347]
 [ 0.88652361]
 [-1.34499104]
 [ 0.66006907]]
Iterationen: 
5
CG-Verfahren mit m = 5 und tol = 1e-13: 
[[ 0.99999998]
 [-0.99999999]
 [ 1.00000002]
 [-0.99999998]
 [ 1.00000002]]
Fehler: 
[[  2.23840085e-08]
 [ -1.02618691e-08]
 [ -1.57768794e-08]
 [ -1.65530886e-08]
 [ -1.59440738e-08]]
Iterationen: 
7
CG-Verfahren mit m = 10 und tol = 1e-8: 
[[ 0.98018055]
 [-0.70228707]
 [-0.02306297]
 [ 0.20835746]
 [ 0.19940501]
 [ 0.10002926]
 [-0.02365059]
 [-0.14479346]
 [-0.25351013]
 [-0.34712115]]
Fehler: 
[[ 0.01981945]
 [-0.29771293]
 [ 1.02306297]
 [-1.20835746]
 [ 0.80059499]
 [-1.10002926]
 [ 1.02365059]
 [-0.85520654]
 [ 1.25351013]
 [-0.65287885]]
Iterationen: 
5
CG-Verfahren mit m = 10 und tol = 1e-13: 
[[ 0.99927862]
 [-0.97389231]
 [ 0.77013768]
 [-0.19251287]
 [-0.29775169]
 [ 0.01008485]
 [ 0.23947329]
 [ 0.20397825]
 [-0.10986074]
 [-0.64913358]]
Fehler: 
[[  7.21384409e-04]
 [ -2.61076932e-02]
 [  2.29862322e-01]
 [ -8.07487133e-01]
 [  1.29775169e+00]
 [ -1.01008485e+00]
 [  7.60526708e-01]
 [ -1.20397825e+00]
 [  1.10986074e+00]
 [ -3.50866423e-01]]
Iterationen: 
9
2.7.3 (default, Feb 27 2014, 20:00:17) 
[GCC 4.6.3]
Und ich denke nicht das die Python-Version hier eine Rolle spielt solange es eine 2.x ist.
Haennes
User
Beiträge: 4
Registriert: Dienstag 9. Dezember 2014, 20:40

Hi Black Jack!
Vielen Dank für die schnelle Antwort!
Ich habe mein Programm noch einem anderen Freund geschickt bei dem auch das gleiche Problem mit den NaN's auftrat.
Es freut mich jedoch zu sehen, dass bei dir die richtige Lösung rauskommt!
Vielleicht kannst du ja mal versuchen das Programm oft hintereinander auszuführen.
Ich hab keine Ahnung von Python und com Compilen oder Interpreten aber kann es vielleicht daran liegen, dass nicht genug Speicher für die berechnungen freigestellt werden?
Kann es vielleicht an Notepad++ liegen?

Grüße Hannes
BlackJack

@Haennes: Da das Programm deterministisch ist, kommt da immer das selbe heraus. Das hat weder etwas mit Speicher noch mit unterschieden zwischen nativen Compilern oder Bytecodeinterpretern zu tun. Bei 2 + 2 erwartest Du doch sicher auch dass da immer das selbe heraus kommt, egal wie oft man das Programm laufen lässt. Hier sind die Rechnungen zwar ein wenig komplizierter, aber wie gesagt auch deterministisch.
Haennes
User
Beiträge: 4
Registriert: Dienstag 9. Dezember 2014, 20:40

Ja so hab ich mir das auch gedacht. Nur komme ich mir selbst schon verrückt dabei vor, dass wenn ich das gleiche Programm mehrmals ausführe, dass ich unteschiedliche Ergebnisse erziehle.
Vielen Dank für die Antwort, BlackJack. Ich denke ich werde noch etwas rumspielen und vielleicht ja etwas übernatürliches finden.

Gruß Hannes

Edit:
Auf dem Surface tritt das Problem wie nach einer Wunderheilung nicht mehr auf. Werd jetzt auf dem Laptop weiterforschen.
Haennes
User
Beiträge: 4
Registriert: Dienstag 9. Dezember 2014, 20:40

Ich glaube ich habe das Problem gefunden. Es hatte wohl etwas mit dem Speicherplatz zu tun. Ich hatte das Programm auf meiner OneDrive gespeichert und es wurde gleichzeitig von meinem Laptop und von meinem Surface aufgerufen. Dabei muss irgendetwas schiefgegangen sein.
Mein Freund, der das Programm auch ausgeführt hat, hat dies auch über meinen OneDrive Ordner gemacht. Dort ist dann das gleiche Problem aufgetreten.
Vielen Dank für das Troubleshooting.

Gruß Hannes
Antworten