我有一个名为E
和V
的数据集,以及一个函数。该功能将V和4个参数作为输入。参数E0
和V0
应该是函数的最小值。
对于曲线拟合,我给出了一些参数的初始值。给出E0
和V0
作为相应数据集的最小值。 B0
的理论值应为28,因此我给出了该值,并为B1
给出了一个随机值。
在曲线拟合之后,我尝试获取该函数的最小值并找到E0
和V0
。我得到的值似乎还可以。然后绘制数据和定义的函数。 curve_fit结果与我的数据不匹配。我认为问题出在配件部分,但我不确定。 E
和V
是我的实验结果,我知道它们没有任何作用。
这是代码:
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.
现在优化后我什至没有得到值。任何帮助表示赞赏。
编辑我以某种方式设法再次获得了该数字。您会看到这些点不适合数据。
Edit2 我一直在运行脚本,有时会出现此错误,并且不会给我任何参数...
Warning: Maximum number of function evaluations has been exceeded.
所以我需要解决此最大评估问题,然后找到一种方法来获取正确适合数据的正确参数。
答案 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时不存在此错误。