2017-06-14 4 views
0

J'ai un ensemble de données, (x et y) que j'ai besoin d'ajuster avec un modèle analytique dans scipy.Équation pour ajuster le modèle de désintégration exponentielle dans scipy

enter image description here

J'ai essayé d'utiliser la boîte à outils d'ajustement de courbe MATLAB et quelques autres outils, y compris les termes simplement en ajoutant aux équations de montage standard (par exemple exponentielle). Ma seule vraie contrainte est que je voudrais limiter le nombre de paramètres qui doivent être ajustés, 4 serait idéal, mais 6 pourrait fonctionner et je suis assez sensible à un modèle qui correspond à l'ensemble de données au-dessus du linéaire partie de la courbe au début. C'est pourquoi je n'aime pas les solutions d'ajustement polynominal que j'ai pu obtenir.

Voici les données pour referencs,

Y = np.array([7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.48E-01 , 7.48E-01 , 7.48E-01 , 7.47E-01 , 7.47E-01 , 7.46E-01 , 7.46E-01 , 7.45E-01 , 7.44E-01 , 7.44E-01 , 7.43E-01 , 7.42E-01 , 7.41E-01 , 7.40E-01 , 7.39E-01 , 7.38E-01 , 7.37E-01 , 7.36E-01 , 7.35E-01 , 7.34E-01 , 7.32E-01 , 7.31E-01 , 7.30E-01 , 7.28E-01 , 7.27E-01 , 7.25E-01 , 7.24E-01 , 7.22E-01 , 7.21E-01 , 7.19E-01 , 7.17E-01 , 7.16E-01 , 7.14E-01 , 7.12E-01 , 7.10E-01 , 7.08E-01 , 7.06E-01 , 7.04E-01 , 7.02E-01 , 7.00E-01 , 6.98E-01 , 6.96E-01 , 6.94E-01 , 6.92E-01 , 6.90E-01 , 6.88E-01 , 6.86E-01 , 6.83E-01 , 6.81E-01 , 6.79E-01 , 6.77E-01 , 6.75E-01 , 6.72E-01 , 6.70E-01 , 6.68E-01 , 6.65E-01 , 6.63E-01 , 6.61E-01 , 6.58E-01 , 6.56E-01 , 6.54E-01 , 6.51E-01 , 6.49E-01 , 6.46E-01 , 6.44E-01 , 6.42E-01 , 6.39E-01 , 6.37E-01 , 6.34E-01 , 6.32E-01 , 6.30E-01 , 6.27E-01 , 6.25E-01 , 6.22E-01 , 6.20E-01 , 6.17E-01 , 6.15E-01 , 6.12E-01 , 6.10E-01 , 6.08E-01 , 6.05E-01 , 6.03E-01 , 6.00E-01 , 5.98E-01 , 5.95E-01 , 5.93E-01 , 5.91E-01 , 5.88E-01 , 5.86E-01 , 5.83E-01 , 5.81E-01 , 5.79E-01 , 5.76E-01 , 5.74E-01 , 5.71E-01 , 5.69E-01 , 5.67E-01 , 5.64E-01 , 5.62E-01 , 5.60E-01 , 5.57E-01 , 5.55E-01 , 5.53E-01 , 5.50E-01 , 5.48E-01 , 5.46E-01 , 5.43E-01 , 5.41E-01 , 5.39E-01 , 5.36E-01 , 5.34E-01 , 5.32E-01 , 5.29E-01 , 5.27E-01 , 5.25E-01]) 
X = np.arange(len(Y)) 

Enfin, je me sers symfit mais je suis ouvert à l'aide scipy.optimize.curve_fit ou d'autres méthodes si elle aide à résoudre mon problème.

+0

Les données ne correspondent pas à la figure – Stelios

+0

@Stelios, Oui, il a été corrigé maintenant. Désolé cela a pris tellement de temps, mon internet est mort donc j'ai dû mettre en place un hotspot. –

Répondre

2

Voici une tentative pour adapter vos données avec une fonction à trois paramètres f. Notez que la fonction n'est pas définie à x=0. Cependant, Scipy parvient à fournir un ajustement raisonnable pour tous les autres points. Vous pouvez remplacer x par f par quelque chose comme x+very_small_number pour obtenir une fonction qui est valide pour x=0.

from scipy.optimize import curve_fit 

def f(x, a, b, c): 
    return a + b * (1 - np.exp(-c/x)) 

sol = curve_fit(f, X, Y, p0 = (.75,.75,200,)) 

plt.plot(X, Y, 'o', label = 'data') 
plt.plot(X, [f(x,*sol[0]) for x in X], lw = 3, label = 'fit') 

enter image description here