我想做一个logharitmic适合。但我不断收到运行时错误:
找不到最佳参数:已达到函数调用次数 maxfev = 1000
我使用以下脚本。谁能告诉我哪里出错了?我使用Spyder仍然是一个初学者。
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()
答案 0 :(得分:15)
您的原始数据为t1
和F1
。因此curve_fit
应该t1
作为第二个参数,不 t
。
popt, pcov = curve_fit(func, t1, F1, maxfev=1000)
现在,一旦获得拟合参数popt
,就可以在func
中的点评估t
以获得拟合曲线:
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
(我从t
删除了零(根据StuGrey的回答)以避免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()
答案 1 :(得分:2)
修复导入语句后:
#import matplotlib as mpl
import matplotlib.pyplot as plt
您的代码产生了以下错误:
RuntimeWarning: divide by zero encountered in log
变化:
#t=np.linspace(0,3600*24*28,13)
t=np.linspace(1,3600*24*28,13)
产生了以下输出:
答案 2 :(得分:1)
Curve_fit()
使用迭代来搜索最佳参数。如果迭代次数超过了设置的1000次,但最佳参数仍然不可用,则会出现此错误。您可以为curve_fit()
提供一些初始猜测参数,然后重试。
答案 3 :(得分:0)
Scipy's
curve_fit()
使用迭代来搜索最佳参数。如果迭代次数超过默认次数800,但仍找不到最佳参数,则将引发此错误。
Optimal parameters not found: Number of calls to function has reached maxfev = 800
您可以为curve_fit()提供一些初始猜测参数,然后重试。或者,您可以增加允许的迭代次数。还是两者都做!
这里是一个例子:
popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], maxfev=5000)
p0是猜测
maxfev是最大迭代次数
您也可以尝试设置边界,这将有助于函数找到解决方案。 但是,您不能同时设置边界和max_nfev。
popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], bounds=(1,3))
来源1:https://github.com/scipy/scipy/issues/6340
Source2:我自己进行测试,发现about github并非100%准确
此外,关于不使用0作为“ x”值的其他建议也是很好的建议。以1开头“ x”数组,以避免除以零错误。