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
func
: callable
x0
: ndarray
args
: tuple, optional
Dfun
: callable, optional
x
: ndarray
cov_x
: ndarray
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]
参考链接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html