• scipy.optimize.leastsq()拟合函数


    介绍

    scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)

    最小化一组方程的平方和(Minimize the sum of squares of a set of equations.)。

    x = arg min(sum(func(y)**2,axis=0))
    y

    Parameters:

    • func: callable
      • 应至少采用一个(可能长度为 N 向量)参数并返回 M 个浮点数。 它不能返回 NaN,否则拟合可能会失败。 M 必须大于或等于 N。
    • x0: ndarray
      • 最小化的起始估计。
    • args: tuple, optional
      • func 的任何额外参数都放在这个元组中。
    • Dfun: callable, optional
      • 计算具有跨行导数的 func 的雅可比(Jacobian)行列式的函数或方法。 如果这是无,雅可比(Jacobian) 将被估计。

    Returns:

    • x: ndarray
      • 解决方案(或不成功调用的最后一次迭代的结果)。
    • cov_x: ndarray
      • 黑森州的倒数。 fjac 和 ipvt 用于构建 Hessian 的估计。 None 值表示奇异矩阵,这意味着参数 x 中的曲率在数值上是平坦的。 要获得参数 x 的协方差矩阵,必须将 cov_x 乘以残差的方差 - 请参见 curve_fit。

    代码案例

    from scipy.optimize import leastsq          # 导入leastsq模块
    from scipy.optimize import curve_fit        # 导入leastsq模块
    import matplotlib.pyplot as plt             # 导入pyplot模块
    import matplotlib
    # 引用以下3句 在绘图显示中文时不会出现乱码  
    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    matplotlib.use('TkAgg')
    
    
    def func(x, p):
        # 定义拟合函数 y=a*np.exp(-(x-b)**2/(2*c**2))
        a, b, c = p
        return a*np.exp(-(x-b)**2/(2*c**2))
    
    
    def residuals(p, y, x):
        # 实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数
        return y - func(x, p)
    
    
    x = np.linspace(0, 10, 100)
    a, b, c = 1, 5, 2                           # 真实数据的函数参数
    y0 = func(x, [a, b, c])                     # 真实数据
    np.random.seed(0)                           # 随机噪声种子
    y1 = y0 + 0.02 * np.random.randn(len(x))    # 加入噪声之后的实验数据
    P0 = [2, 0.40, 0.2]                         # 第一次猜测的函数拟合参数
    result_fit1 = leastsq(residuals, P0, args=(y1, x))  # 拟合函数
    
    print(f"真实参数: a={a}, b={b}, c={c}")
    print("leastsq方法拟合参数", result_fit1[0])  # leastsq方法拟合参数拟合后的参数
    plt.figure()
    plt.plot(x, y0, label="真实数据")            # 绘制真实数据
    plt.plot(x, y1, "o", label="带噪声的实验数据")  # 绘制带有噪声数据
    plt.plot(x, func(x, result_fit1[0]), label="拟合数据")  # 绘制拟合结果
    plt.title('leastsq方法拟合')                 # 添加标题
    plt.xlabel('x')                             # x轴名称
    plt.ylabel('y')                             # y轴名称
    plt.legend()                                # 添加图例
    plt.show()                                  # 显示图像
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    输出

    In[0]: runfile('E:/09-code/06-Turbulent_flow_spectrum/test/test1.py', wdir='E:/09-code/06-Turbulent_flow_spectrum/test')
    真实参数: a=1, b=5, c=2
    leastsq方法拟合参数 [0.98878408 4.99079501 2.02431117]
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    参考链接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html

  • 相关阅读:
    全流程分析Netty设计思路与实践
    vue基础语法(上)
    电脑彻底卸载双系统中的Ubuntu ThinkPad X1 Carbon
    【C/PTA】函数专项练习(一)
    监狱工具管理系统-监狱劳动工具管理系统
    每日一博 - 反向代理、API 网关、负载均衡
    视觉SLAM十四讲_4李群与李代数
    Ubuntu 22.04 Golang环境配置
    STM32F105RBT6 使用定时器TIM3输出PWM波
    建议你们来看看这几个领导小心机
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/126690768