Problem mit mehreren Variablen in einer Funktion

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
justus25
User
Beiträge: 1
Registriert: Samstag 5. November 2022, 21:22

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
Benutzeravatar
Kebap
User
Beiträge: 717
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo Justus, willkommen bei Python! :mrgreen:

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 )
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?
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.
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:

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()
Für das weitere Vorgehen brauchst du dann in etwa so eine Struktur:

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}.")
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.
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.
Antworten