Hilfe bei SOR-Verfahren / Iteration / Befehle wiederholen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

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)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Scholli: Gibt es: ``while``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Könntest du schreiben, was du schon mit while probiert hast und wo dort konkret die Probleme lagen?
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

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]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

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
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Alle Befehle inner halb der Schleife werden wiederholt. Soll "x0 = [0,1,-1,2]" immer wiederholt werden, oder einmalig vorher ausgeführt werden?
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

Das x0 soll nur der Startwert sein, alles danach ändert den Wert ja entsprechend und soll daher wiederholt werden.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

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)
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

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)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Scholli
User
Beiträge: 6
Registriert: Montag 21. Januar 2019, 11:56

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten