Hallo,
ich muss von Anfang an sagen, dass ich nicht wirklich Erfahrung habe ein Programm in Python zuschreiben. Aber da ich ein Experiment in meinem Physikstudium auswerten möchte, bin ich jetzt dazu gezwungen. Ich bin bis jetzt recht zufrieden mit meinem bisher erlernten Wissen aber nun stellt sich das erste Problem, welches mich überfordert. Hier erst einmal das, was ich bis jetzt hinbekommen habe.
import numpy as np
import matplotlib.pyplot as plt
#Werte einbeziehen
Daten = np.loadtxt('Data30-140.csv',delimiter=';', skiprows=1)
Z = Daten[:,1]
t = Daten[:,2]
#Funktion Poisson
def N_0(tau, N, t1, tk, deltat):
return N/(np.exp(-1*t1 / tau) - np.exp(-1*(tk + deltat)/ tau))
taulist=np.arange(0,4.0001,0.0001)
N_0list=N_0(taulist, 17022, 1.208333333, 2.08333E-05 , 4.16667E-05)
def f_i(N_0, tau, t, deltat):
return N_0/tau * (np.exp(-1*((t+deltat)/2)/tau))*deltat
f_ilist=f_i(N_0list, taulist, t , 4.16667E-05)
def mlm_Poisson(Z, N_0, tau, t, deltat,f_i):
return -2* np.sum(Z*np.log(f_ilist))
poissonlist=mlm_Poisson(Z, N_0list, taulist, t,4.16667E-05, f_ilist )
Nun meine Frage, dazu schildere ich erst einmal mein Ziel. Ich habe verschiedene Werte für t und N_0. Nun möchte ich (es handelt sich um den Abschnitt ab def f_i) das f_i ausrechnen für das erste t und dem ersten N_0 für alle tau. Also möchte ich t und N_0 festsetzten und tau durchlaufen, danach für das zweite t und das zweite N_0 alle tau´s durchlaufen. Ich weiß aber nicht wie ich das machen soll.
Ich hoffe mein Problem ist einigermaßen verständlich dargestellt.
Vielen Dank für eure Hilfe
Justus
Problem mit mehreren Variablen in einer Funktion
Hallo Justus, willkommen bei Python!
Bitte benutze den Code-Button, wenn du deinen Code hier einstellst, damit bspw. Leerzeichen am Anfang richtig angezeigt werden:
Ich kann nicht sagen, dass ich deine Frage richtig verstanden habe, aber für (mehrere Stufen von) WIederholungen brauchst du vermutlich (geschachtelte) Schleifen. Kennst du dich damit schon aus?
Für das weitere Vorgehen brauchst du dann in etwa so eine Struktur:
Ergibt dann etwa folgenden Ablauf:
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 1 und N_0 mit Wert 5.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 2 und N_0 mit Wert 6.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 3 und N_0 mit Wert 7.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 4 und N_0 mit Wert 8.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Bitte benutze den Code-Button, wenn du deinen Code hier einstellst, damit bspw. Leerzeichen am Anfang richtig angezeigt werden:
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
#Werte einbeziehen
Daten = np.loadtxt('Data30-140.csv',delimiter=';', skiprows=1)
Z = Daten[:,1]
t = Daten[:,2]
#Funktion Poisson
def N_0(tau, N, t1, tk, deltat):
return N/(np.exp(-1*t1 / tau) - np.exp(-1*(tk + deltat)/ tau))
taulist=np.arange(0,4.0001,0.0001)
N_0list=N_0(taulist, 17022, 1.208333333, 2.08333E-05 , 4.16667E-05)
def f_i(N_0, tau, t, deltat):
return N_0/tau * (np.exp(-1*((t+deltat)/2)/tau))*deltat
f_ilist=f_i(N_0list, taulist, t , 4.16667E-05)
def mlm_Poisson(Z, N_0, tau, t, deltat,f_i):
return -2* np.sum(Z*np.log(f_ilist))
poissonlist=mlm_Poisson(Z, N_0list, taulist, t,4.16667E-05, f_ilist )
Grundsätzlich schreibt man Variablen und Funktionen klein. Hoffentlich widerspricht das bei dir keinen Bedeutungen von t oder T und n oder N, usw. Die ganzen Abkürzungen im Variablennamen und fehlende Leerzeichen um die Rechenoperationen machen den Code schwerer für mich lesbar als nötig. Diese "magischen" Zahlen wie 4.16667E-05 will man eigentlich auch einmal zentral definieren und dann nur noch aufrufen. Dann kommt man auch nicht durcheinander, was sie bedeuten, und wenn man sie ändern will, kann man keine Stelle übersehen. Davon abgesehen mischt man nicht Funktionsdefinitionen und Aufrufe wild durcheinander, sondern definiert erstmal alle Funktionen und danach zusätzlich eine "main" Funktion, die den ganzen Rest aufruft. Also in etwa so:Nun meine Frage, dazu schildere ich erst einmal mein Ziel. Ich habe verschiedene Werte für t und N_0. Nun möchte ich (es handelt sich um den Abschnitt ab def f_i) das f_i ausrechnen für das erste t und dem ersten N_0 für alle tau. Also möchte ich t und N_0 festsetzten und tau durchlaufen, danach für das zweite t und das zweite N_0 alle tau´s durchlaufen. Ich weiß aber nicht wie ich das machen soll.
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
#Funktion Poisson
def N_0(tau, N, t1, tk, deltat):
return N / (np.exp(-1 * t1 / tau) - np.exp(-1 * (tk + deltat) / tau))
def f_i(N_0, tau, t, deltat):
return N_0 / tau * (np.exp(-1 * ((t + deltat) / 2) / tau)) * deltat
def mlm_poisson(Z, N_0, tau, t, deltat, f_i):
return -2 * np.sum(Z * np.log(f_ilist))
def main():
#Werte einbeziehen
daten = np.loadtxt('Data30-140.csv', delimiter=';', skiprows=1)
z = daten[:,1]
t = daten[:,2]
taulist = np.arange(0,4.0001, 0.0001)
N_0list = N_0(taulist, 17022, 1.208333333, 2.08333E-05 , 4.16667E-05)
f_ilist = f_i(N_0list, taulist, t, 4.16667E-05)
poissonlist=mlm_poisson(z, N_0list, taulist, t, 4.16667E-05, f_ilist )
if __name__ == "__main__":
main()
Code: Alles auswählen
werte_fuer_t = [1, 2, 3, 4]
werte_fuer_n0 = [5, 6, 7, 8]
for t, n0 in zip(werte_fuer_t, werte_fuer_n0):
print(r"Hier könnte dann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert {t} und N_0 mit Wert {n0}.")
for tau in [9, 10]:
print("Falls noch weitere Berechnungen pro tau nötig sein sollten, wäre hier Platz dazu, und es hat aktuell den Wert {tau}.")
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 1 und N_0 mit Wert 5.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 2 und N_0 mit Wert 6.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 3 und N_0 mit Wert 7.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
Hier kann der Funktionsaufruf stehen, um f_i auszurechnen für t mit Wert 4 und N_0 mit Wert 8.
Falls noch weitere Berechnungen für tau mit Wert 9 nötig sind, wäre hier Platz dazu.
Falls noch weitere Berechnungen für tau mit Wert 10 nötig sind, wäre hier Platz dazu.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.