Python非线性拟合自定义函数参数(对标MATLAB-nlinfit函数)

Posted Z.Q.Feng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python非线性拟合自定义函数参数(对标MATLAB-nlinfit函数)相关的知识,希望对你有一定的参考价值。

文章目录


一、前言

本文使用到了 Python 中的 scipy 包和 pycse 包,可使用如下命令下载:

pip install -i https://mirrors.aliyun.com/pypi/simple scipy pycse

我的 Python 版本为 Python3.9.7,系统为 Ubuntu21.10


二、curve_fit 函数

使用方法:

from scipy.optimize import curve_fit
popt, pcov = curve_fit(func, xdata, ydata, bounds = (0, (1., 1.)))

其中 xdataydata 为等长的数组,bounds 为参数限制范围。例如拟合曲线 a e − b ∗ x + c ae^-b * x + c aebx+c 中的参数 a, b, c

def func(x, a, b, c):
	return a * np.exp(-b * x) + c

拟合数据如下:

xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
rng = np.random.default_rng()
y_noise = 0.2 * rng.normal(size=xdata.size)
ydata = y + y_noise
popt, pcov = curve_fit(func, xdata, ydata)

拟合效果如下:

In [25]: popt
Out[25]: array([2.56274217, 1.37268521, 0.47427475])

其中 popt 列表里储存的便分别是 a, b, c 参数的值。


三、nlinfit 函数

这是 pycse 包中提供的函数,对标 MATLAB 中的 nlinfit 函数,但是其底层还是基于 scipy 中的 curve_fit 函数:

from pycse import nlinfit
pars, pint, se = nlinfit(func, xdata, ydata, coeffs, alpha = 0.05)

这里的 coeffs 值为我们给定的 func 函数的初始参数值,需要我们自己给出解释,alpha 值为置信水平(默认 95%)。

coeffs = np.array([2., 1., 0])
pars, pint, se = nlinfit(func, xdata, ydata, coeffs, alpha = 0.05)

输出如下:

In [28]: pars
Out[28]: array([2.49689418, 1.38830888, 0.57077955])

四、对比

虽然两个函数都可以解非线性拟合,但是效果却不同,例如我最近在拟合如下函数参数时:

n ( x ) = 1 + B 1 x x − C 1 + B 2 x x − C 2 + B 3 x x − C 3 n(x) = 1 + \\dfracB_1xx- C_1+ \\dfracB_2xx - C_2+ \\dfracB_3xx- C_3 n(x)=1+xC1B1x+xC2B2x+xC3B3x

若我使用 curve_fit 函数拟合,效果是非常差的,不是拟合不出来就是结果误差到根本没法使用,而若使用 nlinfit 函数,在给定初始参数为 [0.1, 0.1, 0.1, 0.1, 0.1, 0.1] 后,拟合效果还是非常好的。


五、总结

注:pycse 中的 nlinfit 函数和 MATLAB 的还是有很大区别的,例如初始参数不能与精确值差太多,不然便求解不出来。

以上是关于Python非线性拟合自定义函数参数(对标MATLAB-nlinfit函数)的主要内容,如果未能解决你的问题,请参考以下文章

matlab自定义函数拟合

在matlab中如何根据拟合图得到函数?

Python小白的数学建模课-23.数据拟合全集

# Python小白的数学建模课-23.数据拟合全集

matlab能不能对多组数据做出拟合函数

想用matlab确定拟合函数的最佳次数?