Curve_fit没有提供参数以正确拟合数据

时间:2019-02-26 19:56:31

标签: python scipy

我有一个名为EV的数据集,以及一个函数。该功能将V和4个参数作为输入。参数E0V0应该是函数的最小值。

对于曲线拟合,我给出了一些参数的初始值。给出E0V0作为相应数据集的最小值。 B0的理论值应为28,因此我给出了该值,并为B1给出了一个随机值。

在曲线拟合之后,我尝试获取该函数的最小值并找到E0V0。我得到的值似乎还可以。然后绘制数据和定义的函数。 curve_fit结果与我的数据不匹配。我认为问题出在配件部分,但我不确定。 EV是我的实验结果,我知道它们没有任何作用。

这是代码:

from scipy.optimize import curve_fit
from scipy.optimize import fmin
import matplotlib.pylab as plt

V = np.array([9359.78033951, 10835.11571553, 12457.86763189, 14235.05592385, 16173.70042667, 18280.82097561, 20563.43740591, 23028.56955282, 25683.23725162, 28534.46033754, 31589.25864585])

E = np.array([12.73271364, 10.56261464, 8.21189843, 5.67853559, 3.18963332, 1.76136256,2.35816986,  5.01274293,  9.64990078, 16.22373202, 24.7102355])

E0 = min(E)
V0 = min(V)
print(V0,E0)

def func(V, E0, V0, B0, B1):
         return E0 + B0*V/B1 * (((V0/V)**B1)/(B1-1) + 1);

p0 = [E0, V0, 28, 100]    
params, param2 = curve_fit(func, V, E, p0)

V0_new = fmin(func, V0, args=(params[0], params[1], params[2], params[3]))
E0_new = func(V, params[0], V0_new, params[2], params[3])

for ii in range(len(V)):
plt.plot(V, E, '-k')
plt.plot(V[ii], func(V[ii], params[0], params[1], params[2], params[3]), 'or')

经过几次运行,我开始收到此错误:

    ---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-14-ec759702af45> in <module>
      6 
      7 p0 = [E0, V0, 28, 100]
----> 8 params, param2 = curve_fit(func, V, E, p0)
      9 
     10 V0_new = fmin(func, V0, args=(params[0], params[1], params[2], params[3]))

/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    753         cost = np.sum(infodict['fvec'] ** 2)
    754         if ier not in [1, 2, 3, 4]:
--> 755             raise RuntimeError("Optimal parameters not found: " + errmsg)
    756     else:
    757         # Rename maxfev (leastsq) to max_nfev (least_squares), if specified.

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.

现在优化后我什至没有得到值。任何帮助表示赞赏。

编辑我以某种方式设法再次获得了该数字。您会看到这些点不适合数据。

fig.png

Edit2 我一直在运行脚本,有时会出现此错误,并且不会给我任何参数...

Warning: Maximum number of function evaluations has been exceeded.

所以我需要解决此最大评估问题,然后找到一种方法来获取正确适合数据的正确参数。

1 个答案:

答案 0 :(得分:0)

curve_fit中基础的数学运算最好在numpy数组而不是常规列表上进行。将代码的前几行更改为:

from scipy.optimize import curve_fit
from scipy.optimize import fmin
import numpy as np

V = np.array([9359.78033951, 10835.11571553, 12457.86763189, 14235.05592385, 16173.70042667, 18280.82097561, 20563.43740591, 23028.56955282, 25683.23725162, 28534.46033754, 31589.25864585])

E = np.array([12.73271364, 10.56261464, 8.21189843, 5.67853559, 3.18963332, 1.76136256,2.35816986,  5.01274293,  9.64990078, 16.22373202, 24.7102355])

您得到的错误是由一系列函数调用fsolve-> _root_hybr导致的,该函数随后调用了循环达到最大数量的fortran minipack例程。

我试图重新创建您的错误,但是得到的是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-134dfaf77356> in <module>
     18 
     19 V0_new = fmin(func, V0, args=(params[0], params[1], params[2], params[3]))
---> 20 E0_new = func(V, params[0], V0_new, params[2], params[3])

<ipython-input-1-134dfaf77356> in func(V, E0, V0, B0, B1)
     12 
     13 def func(V, E0, V0, B0, B1):
---> 14          return E0 + B0*V/B1 * (((V0/V)**B1)/(B1-1) + 1);
     15 
     16 p0 = [E0, V0, 28, 100]

TypeError: can't multiply sequence by non-int of type 'numpy.float64'

将数组更改为np.array时不存在此错误。