Je veux faire un ajustement logique. Mais je continue à avoir une erreur d'exécution:
Paramètres optimaux non trouvés: Nombre d'appels à la fonction atteint maxfev = 1000
J'utilise le script suivant. Quelqu'un peut-il me dire où je vais mal? J'utilise Spyder et je suis encore débutant.
import math
import matplotlib as mpl
from scipy.optimize import curve_fit
import numpy as np
#data
F1=[735.0,696.0,690.0,683.0,680.0,678.0,679.0,675.0,671.0,669.0,668.0,664.0,664.0]
t1=[1,90000.0,178200.0,421200.0,505800.0,592200.0,768600.0,1036800.0,1371600.0,1630800.0,1715400.0,2345400.0,2409012.0]
F1n=np.array(F1)
t1n=np.array(t1)
plt.plot(t1,F1,'ro',label="original data")
# curvefit
def func(t,a,b):
return a+b*np.log(t)
t=np.linspace(0,3600*24*28,13)
popt, pcov = curve_fit(func, t, F1n, maxfev=1000)
plt.plot(t, func(t, *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
Vos données d'origine sont t1
et F1
. Par conséquent, curve_fit
devrait recevoir t1
comme deuxième argument, pas t
.
popt, pcov = curve_fit(func, t1, F1, maxfev=1000)
Une fois que vous avez obtenu les paramètres ajustés, popt
, vous pouvez évaluer func
aux points de t
pour obtenir une courbe ajustée:
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
(J'ai supprimé zéro de t
(selon la réponse de StuGrey) pour éviter le Warning: divide by zero encountered in log
.)
import matplotlib.pyplot as plt
import scipy.optimize as optimize
import numpy as np
# data
F1 = np.array([
735.0, 696.0, 690.0, 683.0, 680.0, 678.0, 679.0, 675.0, 671.0, 669.0, 668.0,
664.0, 664.0])
t1 = np.array([
1, 90000.0, 178200.0, 421200.0, 505800.0, 592200.0, 768600.0, 1036800.0,
1371600.0, 1630800.0, 1715400.0, 2345400.0, 2409012.0])
plt.plot(t1, F1, 'ro', label="original data")
# curvefit
def func(t, a, b):
return a + b * np.log(t)
popt, pcov = optimize.curve_fit(func, t1, F1, maxfev=1000)
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
Après avoir corrigé vos instructions d'importation:
#import matplotlib as mpl
import matplotlib.pyplot as plt
votre code a généré l'erreur suivante:
RuntimeWarning: divide by zero encountered in log
en changeant:
#t=np.linspace(0,3600*24*28,13)
t=np.linspace(1,3600*24*28,13)
produit la sortie suivante:
Curve_fit()
utilise des itérations pour rechercher les paramètres optimaux. Si le nombre d'itérations dépasse le nombre défini de 1000, mais que les paramètres optimaux ne sont toujours pas disponibles, cette erreur sera générée. Vous pouvez fournir des paramètres de définition initiaux pour curve_fit()
, puis réessayer.