Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 曲线拟合未给出正确拟合数据的参数_Python_Scipy - Fatal编程技术网

Python 曲线拟合未给出正确拟合数据的参数

Python 曲线拟合未给出正确拟合数据的参数,python,scipy,Python,Scipy,我有名为E和V的数据集,还有一个函数。此函数将V和4个参数作为输入。参数E0和V0应为函数的最小值 对于曲线拟合,我给出了一些参数的初始值E0和V0作为相应数据集的最小值。B0的理论值应该是28,所以我给了它,我给了B1一个随机值 在曲线拟合之后,我尝试获得函数的最小值,并找到E0和V0。我得到的价值观似乎还不错。然后我绘制数据和定义的函数。曲线拟合结果与我的数据不匹配。我想问题出在配件上,但我不确定E和V是我的实验结果,我知道它们没有任何关系 代码如下: from scipy.optimize

我有名为
E
V
的数据集,还有一个函数。此函数将V和4个参数作为输入。参数
E0
V0
应为函数的最小值

对于曲线拟合,我给出了一些参数的初始值
E0
V0
作为相应数据集的最小值。
B0
的理论值应该是28,所以我给了它,我给了
B1
一个随机值

在曲线拟合之后,我尝试获得函数的最小值,并找到
E0
V0
。我得到的价值观似乎还不错。然后我绘制数据和定义的函数。曲线拟合结果与我的数据不匹配。我想问题出在配件上,但我不确定
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.
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在里面
6.
7 p0=[E0,V0,28100]
---->8参数,参数2=曲线拟合(func,V,E,p0)
9
10 V0_new=fmin(func,V0,args=(参数[0],参数[1],参数[2],参数[3]))
/曲线拟合中的anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py(f、扩展数据、ydata、p0、sigma、绝对sigma、检查有限、边界、方法、jac、**kwargs)
753成本=总成本(infodict['fvec']**2)
754如果ier不在[1,2,3,4]中:
-->755 raise RUNTIMERROR(“未找到最佳参数:”+errmsg)
756其他:
757#如果指定,将maxfev(leastsq)重命名为max_nfev(最小二乘)。
RuntimeError:未找到最佳参数:函数调用数已达到maxfev=1000。
现在我甚至没有得到优化后的值。感谢您的帮助

编辑我不知怎么又得到了这个数字。你看这些点与数据不符

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

警告:已超过最大功能评估次数。


因此,我需要解决这个最大求值问题,然后找到一种方法来获得正确的参数,以正确地拟合数据。

曲线拟合中的数学运算最好在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])
您得到的错误是一系列函数调用的结果,这些函数调用循环达到最大值时调用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'
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
18
19 V0_new=fmin(func,V0,args=(参数[0],参数[1],参数[2],参数[3]))
--->20 E0_new=func(V,参数[0],V0_new,参数[2],参数[3])
在函数中(V、E0、V0、B0、B1)
12
13 def功能(V、E0、V0、B0、B1):
--->14返回E0+B0*V/B1*((V0/V)**B1)/(B1-1)+1);
15
16 p0=[E0,V0,28100]
TypeError:无法将序列与类型为'numpy.float64'的非整数相乘

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

哦,对不起,我实际上是从一个txt文件中获取数据,我只是像那样将数据粘贴到这里,我的坏。。。我会纠正你所说的,但不幸的是,这不是错误的根源。谢谢你的回答。当然。我只是认为根本原因可能是相同的,但根据系统/软件包版本等不同,错误的表现形式也不同。您是否使用numpy中的
loadtxt
生成输入?我使用genfromtxt,但我刚刚编辑了这个问题,现在唯一的问题是,我从曲线拟合得到的结果与我的数据不匹配。请注意,协方差数组(param2)元素都是inf。您从B0和B1的极值开始,算法无法找到解决方案。更改:p0=[E0,V0,-1,-1]并且它工作
曲线拟合
给了我值:E0,V0,B0,B1=4.37e+01,1.87e+04,4.87e-03,-1.215e+00I在更改数据集时仍然有相同的问题。。。