Seite 1 von 1

Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 13:24
von Scholli
Hallo,
ich habe die Aufgabe, ein Programm für das SOR-Verfahren zu schreiben.
Ich habe bisher bereits eine Matrix und die rechte Seite eingelesen und das Verfahren grundlegend als Rechnungen programmiert.
Mein Problem ist, dass ich die Rechenschritte eigentlich immer wiederholen müsste und nicht weiß, wie das funktioniert.

normalerweise müsste ich die Schritte für die verschiedenen x0 immer wiederholen, bis mein Vergleichswert 0 ergibt (Die Annäherung von x0 zum tatsächlichen Ergebnis x auf 10^-7 Stellen).
Hab es schon irgendwie mit For und While versucht, aber es hat nie das gemacht was ich wollte.

Kann mir jemand sagen, ob es einen Befehl gibt, der den Abschnitt zwischen den #### so lange wiederholt, bis die Annäherung genau genug ist?
Alternativ ginge auch den Abschnitt n-mal zu wiederholen.

Vielen Dank schonmal

Code: Alles auswählen

import math
from pprint import pprint
import numpy as np
from numpy import array, zeros, diag, diagflat, dot

w = 1
A = np.loadtxt("Matrix.txt")
b = np.loadtxt("rechte Seite")
x0 = [0,1,-1,2]

############################
s1 = np.dot( np.array(A)[0,:], x0)
xa1=np.array(x0)[0]-(w/np.array(A)[0,0]) *(s1-np.array(b)[0])
x0.remove(0)
x0.insert(0,xa1)
s2 = np.dot( np.array(A)[1,:], x0)
xa2=np.array(x0)[1]-(w/np.array(A)[1,1]) *(s2-np.array(b)[1])
x0.remove(1)
x0.insert(1,xa2)
s3 = np.dot( np.array(A)[2,:], x0)
xa3=np.array(x0)[2]-(w/np.array(A)[2,2]) *(s3-np.array(b)[2])
x0.remove(-1)
x0.insert(2,xa3)
s4 = np.dot( np.array(A)[3,:], x0)
xa4=np.array(x0)[3]-(w/np.array(A)[3,3]) *(s4-np.array(b)[3])
x0.remove(2)
x0.insert(3,xa4)
print (x0)

s1 = np.dot( np.array(A)[0,:], x0)
xb1=np.array(x0)[0]-(w/np.array(A)[0,0]) *(s1-np.array(b)[0])
x0.remove(xa1)
x0.insert(0,xb1)
s2 = np.dot( np.array(A)[1,:], x0)
xb2=np.array(x0)[1]-(w/np.array(A)[1,1]) *(s2-np.array(b)[1])
x0.remove(xa2)
x0.insert(1,xb2)
s3 = np.dot( np.array(A)[2,:], x0)
xb3=np.array(x0)[2]-(w/np.array(A)[2,2]) *(s3-np.array(b)[2])
x0.remove(xa3)
x0.insert(2,xb3)
s4 = np.dot( np.array(A)[3,:], x0)
xb4=np.array(x0)[3]-(w/np.array(A)[3,3]) *(s4-np.array(b)[3])
x0.remove(xa4)
x0.insert(3,xb4)
print (x0)

s1 = np.dot( np.array(A)[0,:], x0)
xa1=np.array(x0)[0]-(w/np.array(A)[0,0]) *(s1-np.array(b)[0])
x0.remove(xb1)
x0.insert(0,xa1)
s2 = np.dot( np.array(A)[1,:], x0)
xa2=np.array(x0)[1]-(w/np.array(A)[1,1]) *(s2-np.array(b)[1])
x0.remove(xb2)
x0.insert(1,xa2)
s3 = np.dot( np.array(A)[2,:], x0)
xa3=np.array(x0)[2]-(w/np.array(A)[2,2]) *(s3-np.array(b)[2])
x0.remove(xb3)
x0.insert(2,xa3)
s4 = np.dot( np.array(A)[3,:], x0)
xa4=np.array(x0)[3]-(w/np.array(A)[3,3]) *(s4-np.array(b)[3])
x0.remove(xb4)
x0.insert(3,xa4)
print (x0)
###########################################

print ("A:", A)
print ("b:", b)
print ("x:", x0)
y = np.linalg.solve(A, b)
print ("y:",y)
z = np.around(Ergebnis-y,7)
t = np.array([1,1,1,1])
Vergleich=np.dot( z, t)
print(Vergleich)

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 15:16
von __blackjack__
@Scholli: Gibt es: ``while``.

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 17:45
von ArtooDetoo
Könntest du schreiben, was du schon mit while probiert hast und wo dort konkret die Probleme lagen?

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 20:16
von Scholli
ich hatte es versucht mit:

Code: Alles auswählen

while Vergleich !=0:
	x0 = [0,1,-1,2]
#####
hier dann das ganze Programm in den ###
####
	print (x0)
Als Ergebnis kommt eine unendliche Aufzählung des selben Vektors:
[-0.73046875, 1.50732421875, 2.8468017578125, 3.92340087890625]

der richtige Vektor müsste sich dem hier annähern:
[-0.76271186 1.52542373 2.86440678 3.93220339]

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 20:27
von Sirius3
Wenn Du am Anfang der Schleife immer wieder `x0` auf die Startwerte setzt, warum erwartest Du, dass die Schleife jemals etwas anderes macht? Wo wird denn Vergleich geänderrt?

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Montag 21. Januar 2019, 20:43
von Scholli
Was müsste ich denn ändern, damit es funktioniert?
Hab leider nicht wirklich Ahnung von sowas.
Dachte nur, in dem restlichen Programm wird das x0 immer wieder geändert und mir sozusagen nur der End-Wert ausgegeben

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 14:52
von ArtooDetoo
Alle Befehle inner halb der Schleife werden wiederholt. Soll "x0 = [0,1,-1,2]" immer wiederholt werden, oder einmalig vorher ausgeführt werden?

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 16:02
von Scholli
Das x0 soll nur der Startwert sein, alles danach ändert den Wert ja entsprechend und soll daher wiederholt werden.

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 17:09
von ArtooDetoo
Hier steht der Befehl allerdings in der Schleife und nicht davor.
Scholli hat geschrieben: Montag 21. Januar 2019, 20:16 ich hatte es versucht mit:

Code: Alles auswählen

while Vergleich !=0:
	x0 = [0,1,-1,2]
#####
hier dann das ganze Programm in den ###
####
	print (x0)

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 18:36
von Scholli
aber wenn ich meinen Startvektor x0 außerhalb habe, können sich die Befehle innerhalb nicht darauf beziehen, weil die inneren eingerückt sind, der Startvektor dann aber nicht mehr (glaube ich)

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 18:45
von __deets__
Ui. Wenn es nur eine Möglichkeit gäbe, Gewissheit zu erlangen! Auf, Robin, ins Experimentiermobil! Wir schreiben uns ein Stückchen Testcode und probieren aus, ob unsere Annahme stimmt!

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Dienstag 22. Januar 2019, 18:47
von ThomasL
Mich irritiert etwas, dass du anstelle die Tipps auszuprobieren, die dir hier gegeben werden, obskure Vermutungen äußerst.
Probiere es aus, schau was passiert und zeige hier deinen Code und eventuelle Fehlermeldungen.
Des Weiteren empfehle ich dir sehr eindringlich mal das Python Tutorial durch zu arbeiten. https://docs.python.org/3.7/tutorial/index.html

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Mittwoch 23. Januar 2019, 06:26
von Scholli
ThomasL hat geschrieben: Dienstag 22. Januar 2019, 18:47 Mich irritiert etwas, dass du anstelle die Tipps auszuprobieren, die dir hier gegeben werden, obskure Vermutungen äußerst.
Ich probiere die Tipps ja aus und habe auch selbst schon einige Zeit für die Aufgaben gebraucht, komme aber nicht auf ein funktionierendes Programm.
Wenn ich x0 außerhalb der Schleife bestimme, kam beim ersten Versuch eine Fehlermeldung, die soweit ich mich erinnere meinte, dass es in der Schleife kein definiertes x0 gibt. Dann habe ich das ganze nach dem Tipp noch einmal versucht, aber das gab es dann plötzlich gar keine Anzeigen mehr, weder Ergebnis, noch Fehlermeldung.
Ich weiß, dass ich sicherlich einige Grundlagen für Python brauche, mein Problem ist nur, dass dies die letzte Aufgabe ist, die ich brauche um für meinen Abschluss zugelassen zu werden, der nichts mit programmieren zu tun hat und habe daher nicht noch mehr Zeit, mich in alle Feinheiten reinzuarbeiten.
Daher hatte ich ja gehofft, dass mir jemand noch Tipps geben kann, wie so ein funktionierender Code für die While-Schleife bei meinem Programm aussehen könnte

Re: Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

Verfasst: Mittwoch 23. Januar 2019, 08:20
von Sirius3
Ohne zu wissen, was Du probiert hast, kann man schlecht sagen, warum das, was Du probiert hast, nicht so funktioniert, wie wir denken, wie wir die Lösung erklärt haben. Mit anderen Worten, ohne Code und genauer Fehlermeldung kann man nicht helfen.