import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy.special as sc
import math
##自定义函数 指数积分
def func(x,a,b):
c=1.798#单位时间单位长度发热丝的发热量
d=0.006#校准后的探针间距
e = 15.0 #热脉冲加热时间
#a为热传导系数
#b为热容量
return c/(4*math.pi*a*b)*(sc.expi(-d*d/(4*a*(x-e)))-sc.expi(-d*d/(d*a*x)))
func(35.0,4.0,2.0)
#定义x,y数组
x = [1,2,3,4,5,6]
x = np.array(x)
num = [0.1,0.3,0.6,0.7,0.56,0.40]
y = np.array(num)
#非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
#获取popt里面是拟合系数
print(popt)
a = popt[0]
b = popt[1]
报错位置:
RuntimeError Traceback (most recent call last)
<ipython-input-37-21e87c6beb1e> in <module>()
21 y = np.array(num)
22 #非线性最小二乘法拟合
---> 23 popt, pcov = curve_fit(func, x, y)
24 #获取popt里面是拟合系数
25 print(popt)
D:\anaconda\lib\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 = 600.
在论坛上看到说可修改maxfev上限。
eg:Para = leastsq(error, p0, args=(x, y), maxfev=500000)
但是没看懂这步
建议拟合时给出一组初始参数。我试了一下,不同的初始参数,拟合结果差异巨大。你的目标函数和原始数据吻合吗?
>>> import numpy as np
>>> from scipy.optimize import curve_fit
>>> import scipy.special as sc
>>> def func(x,a,b):
c = 1.798 # 单位时间单位长度发热丝的发热量
d = 0.006 # 校准后的探针间距
e = 15.0 # 热脉冲加热时间
return c/(4*np.pi*a*b)*(sc.expi(-d*d/(4*a*(x-e)))-sc.expi(-d*d/(d*a*x)))
>>> x = np.array([1,2,3,4,5,6])
>>> y = np.array([0.1,0.3,0.6,0.7,0.56,0.40])
>>> popt, pcov = curve_fit(func, x, y, (0.1,0.1))
>>> popt
array([22676.65477375, 22603.1803406 ])
>>> func(x, *popt)
array([-2.55176979e-09, -2.33759368e-09, -2.20206616e-09, -2.09747202e-09,
-2.00857697e-09, -1.92827169e-09])
>>> popt, pcov = curve_fit(func, x, y, (10,10))
>>> popt
array([ 5.25821240e+02, -5.00622994e-03])
>>> func(x, *popt)
array([0.49686749, 0.45516447, 0.42877532, 0.40840931, 0.39110013,
0.3754635 ])
使用题主给出的目标函数,设置初始参数为(10,10),拟合得到最佳系数为(5.25821240e+02, -5.00622994e-03),然后绘制x在[1,10]的范围内的函数图像如下图所示。说这个的意思是,你从传感器得到的数据,要呈现出某种函数特征,你才可以用某种函数去拟合。
这是公式,Q=q/c,q是已知的。然后未知参数是阿尔法和c,其他都是已知的。t0是指传感器加热时间(已知),t是测数据时间,已知。r是传感器上两根针距离已知。y值是可以测出来的,于是我就想通过非线性拟合直接得到阿尔法和c
拟合的前提是原始数据自身表现出目标函数的特征。感觉你的问题,要么是数据质量不好,要么是拟合函数不对。