Tenferenzu
Vice Admiral
- Registriert
- Okt. 2017
- Beiträge
- 6.532
Liebes Forum,
ich stehe mal wieder auf dem Schlauch was Programmierung angeht. Rein Ablauforientiert bekomm ich das mittlerweile schon ganz gut hin, allerdings blicke ich noch nicht ganz durch wie man wirklich mit Klassen/Instanzen (das sollte der richtige Terminus sein oder?) rechnet.
Es geht hier um einen numerischen Löser der erstmal ganz simpel gehalten werden soll für das Beispiel. Im Prinzip möchte ich jeder Zelle auf meinem (1D) Rechengrid zu einer Instanz machen und ihnen neben einem Index auch ein paar Werte wie Geschwindigkeit u, Temperatur t etc. zuweisen und dann damit rechnen können. Alle Beispiele ich ich so zur Objektorientierung im Bereich Python gefunden habe, waren meist auf andere Anwendungen zugeschnitten. Deshalb hoffe ich hier etwas Hilfe zu bekommen.
Ich nehme einfach mal das Beispiel Geschwindigkeit da das am einfachsten zu berechnen ist. Aktuell habe ich eine Liste/Vektor mit Werten die dann durchiteriert wird um den nachfolgenden Zeitpunkt t=/=0 zu berechnen. Dazu verwende ich die eigentliche Zelle (i) und die danach bzw rechts davon (i+1) als auch zwei Listen. Eine aktuelle Liste und eine für den neuen Zeitpunkt t+1.
Hier mal der Code den ich Beispielhaft überführen möchte:
Klar müsste ich da einiges ändern um das zum Laufen zu bekommen aber man nehme mal an ich möchte nur den numerischen Teil überführen mit der Berechnung. Wie müsste ich da vorgehen? Ist das überhaupt eine gute Idee? Gibt es dafür bessere Lösungen?
Momentan stecke ich hier ziemlich am Beginn und weiß schlicht nicht wie ich das ansetzen soll bzw. wie ich dann damit rechnen kann/soll.
Am liebsten wäre mir sowas wie: Variable u neu der Zelle n = Variable U der Zelle n + Zelle n+1 mit Variable u
Danke schonmal und liebe Grüße!
P.s. Bevor jemand fragt, nein das sind keine Hausaufgaben. Ich spiel schon länger mit Python rum aber habe mir bisher nicht an die Objektorientierung rangetraut da ich diese im Studium auch schon nicht verstanden habe..^^
Ich hätte auch noch dieses Codeschnipsel hier gefunden das ja theoretisch im Kontext meines Hauptprogramms funktioniert, allerdings checke ich nicht ganz was es macht. Den Ersteller kann ich leider nicht mehr fragen...
len(u) wäre die Anzahl an Elementen im Vektor u.
cm = Zellenmittlepunkt
right ngb = right neighbour
ich stehe mal wieder auf dem Schlauch was Programmierung angeht. Rein Ablauforientiert bekomm ich das mittlerweile schon ganz gut hin, allerdings blicke ich noch nicht ganz durch wie man wirklich mit Klassen/Instanzen (das sollte der richtige Terminus sein oder?) rechnet.
Es geht hier um einen numerischen Löser der erstmal ganz simpel gehalten werden soll für das Beispiel. Im Prinzip möchte ich jeder Zelle auf meinem (1D) Rechengrid zu einer Instanz machen und ihnen neben einem Index auch ein paar Werte wie Geschwindigkeit u, Temperatur t etc. zuweisen und dann damit rechnen können. Alle Beispiele ich ich so zur Objektorientierung im Bereich Python gefunden habe, waren meist auf andere Anwendungen zugeschnitten. Deshalb hoffe ich hier etwas Hilfe zu bekommen.
Ich nehme einfach mal das Beispiel Geschwindigkeit da das am einfachsten zu berechnen ist. Aktuell habe ich eine Liste/Vektor mit Werten die dann durchiteriert wird um den nachfolgenden Zeitpunkt t=/=0 zu berechnen. Dazu verwende ich die eigentliche Zelle (i) und die danach bzw rechts davon (i+1) als auch zwei Listen. Eine aktuelle Liste und eine für den neuen Zeitpunkt t+1.
Hier mal der Code den ich Beispielhaft überführen möchte:
Python:
def linearconv(nt, dt, c, nu, filename, varname):
u = csvimporttonumpy('%s' %varname)
un = numpy.ones(nx)
iterations = [] # neu laden der Variable um alte Werte loszuwerden
cour = []
diffzahl = []
for i in dx:
courrant = c * dt / i
cour.append(courrant)
difz = nu * dt / (i ** 2)
diffzahl.append(difz)
print('Min. Courant number is:', min(cour))
print('Max. Courant number is:', max(cour))
print('Min. diffusion number is:', min(diffzahl))
print('Max. diffusion number is:', max(diffzahl))
for n in range(nt): # loop for values of n from 0 to nt, so it will run nt times
un = u.copy() # copy the existing values of u into un
iterations.append(un)
for i in range(1, len(cb)-2):
u[i] = un[i] + dt * (((nu / (dx[i] ** 2)) * ((un[i] ** 2) + 2 * un[i] * un[i-1] + (un[i-1] ** 2))) - ((c / dx[i]) * (un[i] - un[i-1])))
with open('output/%s.csv' %filename, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(iterations)
Klar müsste ich da einiges ändern um das zum Laufen zu bekommen aber man nehme mal an ich möchte nur den numerischen Teil überführen mit der Berechnung. Wie müsste ich da vorgehen? Ist das überhaupt eine gute Idee? Gibt es dafür bessere Lösungen?
Momentan stecke ich hier ziemlich am Beginn und weiß schlicht nicht wie ich das ansetzen soll bzw. wie ich dann damit rechnen kann/soll.
Python:
class Cell:
def __init__(self, u):
self.u = 0.0
c1 = Cell('0')
c2 = Cell('1')
c3 = Cell('0')
Am liebsten wäre mir sowas wie: Variable u neu der Zelle n = Variable U der Zelle n + Zelle n+1 mit Variable u
Danke schonmal und liebe Grüße!
P.s. Bevor jemand fragt, nein das sind keine Hausaufgaben. Ich spiel schon länger mit Python rum aber habe mir bisher nicht an die Objektorientierung rangetraut da ich diese im Studium auch schon nicht verstanden habe..^^
Ich hätte auch noch dieses Codeschnipsel hier gefunden das ja theoretisch im Kontext meines Hauptprogramms funktioniert, allerdings checke ich nicht ganz was es macht. Den Ersteller kann ich leider nicht mehr fragen...
Code:
cells = []
for j in range(len(u)):
cell = Cell() # Was zum Geier macht der Teil des Codes?
cell._index = j
cell._midpoint = cm[j]
if len(cells) > 0:
cells[-1]._right_ngb = cell
cells.append(cell)
# print(cm[j])
len(u) wäre die Anzahl an Elementen im Vektor u.
cm = Zellenmittlepunkt
right ngb = right neighbour
Zuletzt bearbeitet: