Die Gausche Summenformel in Python programmieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
CsAngel
User
Beiträge: 2
Registriert: Mittwoch 31. März 2021, 11:14

Mittwoch 31. März 2021, 11:44

Hallo ihr Lieben,

ich stehe momentan vor einer echt großen Herausforderung und nachdem ich mir jetzt 3h lang den Kopf zerbrochen habe möchte ich euch um Hilfe bitten.
Die Aufgabe ist es, unter einem Graphen mit n Maxima n Gausfunktionen zu legen. Momentan muss ich noch für jede Anzahl n die unten stehenen funktionen einzeln implementieren.

Code: Alles auswählen

def _1gaussian(x, amp1, cen1, sigma):
    return amp1 * (np.exp(-((x - cen1) ** 2) / (2 * (sigma ** 2))))

def _2gaussian(x, amp1, cen1, amp2, cen2, sigma):
    return amp1 * (np.exp(-((x - cen1) ** 2) / (2 * (sigma ** 2)))) + \
           amp2 * (np.exp(-((x - cen2) ** 2) / (2 * (sigma ** 2))))

def _3gaussian(x, amp1, cen1, amp2, cen2, amp3, cen3, sigma):
    return amp1 * (np.exp(-((x - cen1) ** 2) / (2 * (sigma ** 2)))) + \
           amp2 * (np.exp(-((x - cen2) ** 2) / (2 * (sigma ** 2)))) + \
           amp3 * (np.exp(-((x - cen3) ** 2) / (2 * (sigma ** 2))))

def _4gaussian(x, amp1, cen1, amp2, cen2, amp3, cen3, amp4, cen4, sigma):
    return amp1 * (np.exp(-((x - cen1) ** 2) / (2 * (sigma ** 2)))) + \
           amp2 * (np.exp(-((x - cen2) ** 2) / (2 * (sigma ** 2)))) + \
           amp3 * (np.exp(-((x - cen3) ** 2) / (2 * (sigma ** 2)))) + \
           amp4 * (np.exp(-((x - cen4) ** 2) / (2 * (sigma ** 2))))

jetzt bin ich auf der Suche nach einer Möglichkeit dieses langwierige Verfahren abzukürzen. Gibt es eine Möglichkeit dass sich die gewünschte Funktion von selbst erzeugt, und ich nur die Anzahl der Maxima eingeben muss?

Dafür wäre es wohl notwendig funktionen in funktionnen zu verschachteln, da ich zum einen eine Funktion benötige die mir die richtige Anzahl Parameter für die eigentliche Funktion liefert.

und gibt es in Python eine Möglichkeit die Gaussche Summenfunktion zu implementieren?



Vielen Dank schonmal an jeden der antwortet

Schöne Grüße
CsAngel
Sirius3
User
Beiträge: 14210
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 31. März 2021, 14:51

Die Idee wäre ja, gar keine verschiedenen Funktionen zu haben, sondern eine Funktion, die gleich einen Vektor mit Amplituden und Zentren bekommt:

Code: Alles auswählen

def gaussian(x, amplitudes, centers, sigma):
    x = np.asarray(x)[..., None]
    return (np.exp(-(x - centers) ** 2 / (2 * sigma ** 2)) * amplitudes).sum(axis=-1)
    
# values = gaussian(x, [amp1, amp2, amp3], [cen1, cen2, cen3], sigma)
CsAngel
User
Beiträge: 2
Registriert: Mittwoch 31. März 2021, 11:14

Donnerstag 8. April 2021, 16:20

Aber das funktioniert nicht :/ wenn man deine implementierung abläuft wird mir angezeigt, " x does not exist", "amp1 does not exist", etc. wo definiere ich diese werte?
Benutzeravatar
kbr
User
Beiträge: 1230
Registriert: Mittwoch 15. Oktober 2008, 09:27

Donnerstag 8. April 2021, 16:31

Das sind genau die gleichen Werte, die Du auch an Deine oben genannten Funktionen übergibst.
Antworten