Cosinus mit einem Gaußschen Umschlag, der in Python mit scipy.optimize.curve_fit versagt hat
Posted: 20 May 2025, 15:55
Ich versuche, Daten anzupassen, die einer Cosinusfunktion mit einem verfallenen Gaußschen Umschlag mit Python und insbesondere scipy.optimize.curve_fit ähneln. Es scheint jedoch, dass mein Code die Parameter nicht genug variiert. Der horizontale Offset bleibt meiner ersten Vermutung sehr nahe, auch wenn es sich eindeutig um kein optimaler Punkt handelt. Ich habe das überprüft, indem der horizontale Offset manuell variiert und der Bestimmungskoeffizient berechnet wurde und die von curve_fit angebotenen Werte nicht die optimalste.
Ich kann versuchen, eine manuelle Minimierung des Bestimmungskoeffizienten durchzuführen, aber ich bin neugierig, was in meiner Passform falsch ist.>
Code: Select all
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
id_ = '0'
filename = '250516_FF_01_coincidences_'+id_+'mm.txt'
def FF_function(x,l,s,A,xoff):
d = x - xoff
return A*np.cos(2*np.pi/l*d)*np.exp(-0.5*(d/s)**2)+A #
data = pd.read_csv(filename, sep=' ',header= None).to_numpy()
# data = data.astype(dtype=np.float32)
fig = plt.subplots(figsize=(10,5))
ax = plt.subplot(111)
ax.plot(data[:,0],data[:,1],alpha = 0.3)
guess = [4.40673558e-02, 2.63973377e-01, 1.63702697e+02, -0.2]
xx=np.linspace(min(data[:,0]),max(data[:,0]),1000)
# ax.plot(xx,FF_function(xx,*guess)
popt,cov = curve_fit(FF_function,data[:,0],data[:,1],p0 = guess)
ax.plot(xx,FF_function(xx,*popt), color ='C0',alpha = 0.5)
SSE = np.sum(np.square(data[:,1]-FF_function(data[:,0], *popt)))
SST = np.sum(np.square(data[:,1]-np.mean(data[:,1])))
r2 = 1 - SSE/SST
print(r2)
print(popt)
#
ax.set_xlabel('Displacement (mm)')
ax.set_ylabel('Coincidences')
Ich kann versuchen, eine manuelle Minimierung des Bestimmungskoeffizienten durchzuführen, aber ich bin neugierig, was in meiner Passform falsch ist.>