柳青山 2021-03-22 11:31 采纳率: 50%
浏览 1712

用python中curve_fit拟合时报拟合次数达到上限, 而结果还没拟合出来错误。

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)

但是没看懂这步

  • 写回答

5条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2021-03-24 08:57
    关注

    建议拟合时给出一组初始参数。我试了一下,不同的初始参数,拟合结果差异巨大。你的目标函数和原始数据吻合吗?

    >>> 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 ])
    评论

报告相同问题?

悬赏问题

  • ¥15 python结合Matlab仿真忆阻器
  • ¥35 有人会注册whatsaop协议号吗?
  • ¥15 lead dbs 无法导入影像数据
  • ¥15 多目标MPA算法优化编程实现
  • ¥15 反激PWM控制芯片调研
  • ¥15 Python for loop减少运行时间
  • ¥15 fluent模拟物质浓度udf
  • ¥15 Collection contains no element matching the predicate
  • ¥20 冻品电商平台的搜索是怎么实现的
  • ¥15 如何搞一个可以控制、显示马达频率