verschachtelte schleife

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
bremen_hs_1992
User
Beiträge: 23
Registriert: Montag 16. November 2020, 15:11

Guten Tag Leute, ich habe ein Problem und würde mich über eine kleine Richtungsleitung in diesem Problem sehr freuen.

Vielleicht sagt jemandem dieses Problem ja was, ich gehe in einer verschachtelten schleife 2 indizes nacheinander durch
erst alle ortspunkte i und nach jedem durchlauf wird die zeit j um 1 erhöht.
Dies ist um eine Wärmeausbreitung in einem Metall Stab zu simulieren.

Code: Alles auswählen

#Berechnung
U_0_X_0 = 200   # Anfangstemperatur in Celsius im Zentrum des Laserstrahls von -1mm bis +1 mm Ortskoordinate
U_0_X_rod = 20    # Anfangstemperatur von -50mm bis -1mm und +1mm bis 50mm der Aluminiumstange
L = 0.1    # Länge Aluminium Stab [m]
I_d = 0.002  # Durchmesser Laserstrahl [m]
n = 100   # Anzahl Stützstellen
delta_x = L/n  # Schrittweite der Gitterstellen (0.01m)
delta_t = 1 # Messungen pro sekunde
λ_Alu = 230  # Wärmeleitfähigkeit Alu [W/m*K]
rho_Alu = 2700 # Dichte Alu [KG/m³]
c_Alu = 88800  # Spezifische Wärmekapazität Alu [J/kG*K] (eig 888...erstmal für berechnung)
a_Alu = λ_Alu / (rho_Alu * c_Alu)  # Temperaturleitfähigkeit
a_Alu_x = a_Alu *  / delta_x**2 # Temperaturleitfähigkeit,  und Schrittweite als 1 Koeffizient

X = np.arange(0,0.05, 0.001)  #Alu Stab länge       
U = np.zeros(50)  #Temperatur array
U = U + U_0_X_rod  # 0er array wird mit 20 beschrieben (Temp. außerhalb des Laserstrahls)
U[0] = U_0_X_0  # -1 mm
U[1] = U_0_X_0  # Temperatur an der Stelle X=0 


#Plot bei t = 0 (Laserstrahl ist nur sehr kurz auf dem stab undzwar 1 mm durchmesser links)
fig, ax = plt.subplots(figsize = (10, 7))
ax.set(xlabel='länge (m)', ylabel='Temperatur (°C)',
       title='Temperaturverteilung im Aluminium Stab bei t=0')
plt.plot(X,U , marker = "o")
plt.grid()


del_t = [1,2,3,4,5,6,7,8,9,10]#Zeit liste

for j in (del_t):
    for i in range(len(U)-1):
        U[j+1,i] = U[j,i] + a_Alu_x * del_t[j] * (U[j,i] - 2*U[j,i] + U[j,i])
    
Also die schleife soll für del_t den ersten wert also 1 nehmen dann alle j indices iterieren bis dass array U durch ist, dann j um 1 erhöhen und wieder von vorne...
Am ende soll ein 3 D Plot entstehen Temperatur nach Ort und Zeit
Das Problem liegt hier in der schleife es sagt too many indices ,ich habe in meiner Lektüre Python 3 von Peter Kaiser jedoch keine Doppelindizierung gefunden und komme so auf keinen Fehleransatz
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn ich das richtig sehe, ist U doch ein 1-dimensionaler Array. Du versuchst mit z.B. `U[j+1,i]` darauf wie auf einen 2-dimensionalen Array zuzugreifen.

Übrigens: aussagekräftige Variablennamen kosten nichts. Deine kryptischen Abkürzungen sind für Aussenstehende nicht zu verstehen. Und für dich wahrscheinlich auch nicht mehr, wenn du dir in 2 Jahren oder so den Code nochmals anschaust.

Gruß, noisefloor
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist umständlich, erst U mit 0en zu Initialisieren, und dann ein neues Array aus den 0 und einem Wert zu erzeugen. Wenn U die gleiche Dimension wie X haben soll, solltest Du das auch nutzen!

Code: Alles auswählen

U = np.empty_like(X)
U.fill(U_0_X_rod)
Warum schreibst Du die Zeiten in del_t aus? Warum benutzt Du dort nicht auch arange?
Neben allen anderen schlechten Variablennamen ist `j` ein ganz schlechter Name, weil er suggeriert, dass das ein Index ist, in Wirklichkeit ist es aber ein Zeitpunkt. Und dann passiert es auch gleich, dass Du j fälschlicherweise als Index benutzt.
Statt der inneren for-Schleife solltest Du numpy benutzten.

Code: Alles auswählen

times = np.arange(1, 11)
Us = [U]
for time in times:
    U_neu = U + a_Alu_x * time * (U - 2*U + U)
    Us.append(U_neu)
    U = U_neu
U[j,i] - 2*U[j,i] + U[j,i] gibt ziemlich genau 0.
bremen_hs_1992
User
Beiträge: 23
Registriert: Montag 16. November 2020, 15:11

danke für die Antworten, und sirius du hast recht es sollte eigendlich U[j,i+1] -2*U[j,i] + U[j,i-1] lauten..
Antworten