python曲线拟合函数scipy.optimize.leastsq()

目录

  • 介绍
  • Parameters:
  • Returns:
  • 代码案例

介绍

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()                                  # 显示图像

输出

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]

python曲线拟合函数scipy.optimize.leastsq()_第1张图片
参考链接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html

你可能感兴趣的:(#,scipy,scipy,python,matplotlib)