首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未找到最佳参数:对函数的调用数达到maxfev = 1000

未找到最佳参数:对函数的调用数达到maxfev = 1000
EN

Stack Overflow用户
提问于 2013-04-05 10:38:17
回答 4查看 120.4K关注 0票数 44

我想做一件可爱的衣服。但是我一直得到一个运行时错误:

未找到最佳参数:对函数的调用数达到maxfev = 1000

我使用以下脚本。有人能告诉我哪里出了问题吗?我使用Spyder和am仍然是一个初学者。

代码语言:javascript
运行
复制
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()
EN

回答 4

Stack Overflow用户

发布于 2019-06-13 05:05:27

西皮氏

代码语言:javascript
运行
复制
     curve_fit() 

使用迭代来搜索最优参数。如果迭代次数超过默认的800次,但仍未找到最优参数,则会引发此错误。

代码语言:javascript
运行
复制
    Optimal parameters not found: Number of calls to function has reached maxfev = 800

您可以为curve_fit()提供一些初始猜测参数,然后再试一次。或者,您可以增加允许的迭代。或者两者都做!

下面是一个示例:

代码语言:javascript
运行
复制
    popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], maxfev=5000)

p0是猜测

maxfev是最大的迭代次数。

您也可以尝试设置边界,这将有助于函数找到解决方案。但是,不能同时设置边界和max_nfev。

代码语言:javascript
运行
复制
    popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], bounds=(1,3))

Source1:https://github.com/scipy/scipy/issues/6340

Source2:我自己的测试和发现关于github的不是100%的准确

另外,关于不使用0作为'x‘值的其他建议也是很好的建议。使用1启动'x‘数组,以避免被零错误除以。

票数 32
EN

Stack Overflow用户

发布于 2013-04-05 12:37:29

您的原始数据是t1F1。因此,curve_fit应该被赋予t1作为其第二个参数,而不是 t

代码语言:javascript
运行
复制
popt, pcov = curve_fit(func, t1, F1, maxfev=1000)

现在,一旦您获得了拟合的参数,popt,您就可以在t中的点处计算func,以获得一个拟合的曲线:

代码语言:javascript
运行
复制
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")

(为了避免使用t,我从Warning: divide by zero encountered in log中删除了0 (per StuGrey的答案)。

代码语言:javascript
运行
复制
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()

票数 21
EN

Stack Overflow用户

发布于 2019-01-13 19:00:15

Curve_fit()使用迭代来搜索最优参数。如果迭代次数超过设定的1000次,但最优参数仍然不可用,则会引发此错误。您可以为curve_fit()提供一些初始猜测参数,然后再试一次。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15831763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档