web-dev-qa-db-fra.com

Scipy curvefit RuntimeError: paramètres optimaux non trouvés: le nombre d'appels à la fonction a atteint maxfev = 1000

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()
13
Tjitze

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()

enter image description here

15
unutbu

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:

enter image description here

2
StuGrey

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.

0
Hanrong Zheng