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)