简介
本文介绍了基于matlab实现的复杂函数以及多元函数的拟合。在工程和研究中偶尔会遇到要用一个非常复杂的数学公式来拟合实验测量数据,对这些复杂的数学公式拟合时,采用常见的拟合方法往往会失败,或者得不到足够精确的结果。本文以笔者多年工作经验中的某些典型场景为例,介绍钻研出来的一些非常有用的拟合经验。
案例
需要对如下公式进行拟合,能看出来Y=f(Z,E,A),关于参数a1,a2,...,a13的关系
现在需要通过给定的数据点集,通过拟合得到上述参数的一套值出来
共获得了实验数据约350组,即下列数据共350行4列,现在通过如下所示的数据集进行拟合
AZEY3811.5163-2.50103603224810.3738-2.79688141525912.442-2.830217835271012.8485-3.44376281011.7724-4.074541935291016.1245-1.609437912301117.6367-3.036554268311115.571-4.074541935321119.4956-4.327538449331118.3907-4.803621125341122.5039-5.203007187351121.8553-6.502290171321210.2576-2.120263536...
拟合采用的方法是matlab提供的 lsqnonlin 方法,该方法在帮助文档中解释是
lsqnonlin: Solve nonlinear least-squares (nonlinear data-fitting) problem(非线性最小二乘);
该函数的基本使用方法就是
% 函数 lsqnonlin 非线性最小二乘% 格式 x = lsqnonlin(fun,x0)x = lsqnonlin(fun,x0,lb,ub)x = lsqnonlin(fun,x0,lb,ub,options)% x0为初始解向量;% lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];% options为指定的优化参数;% lsqnonlin解决非线性最小二乘法问题,包含非线性数据的拟合问题% 其中初值x0要有。lb,ub,option可为空
然而在运用到实际工程中,需要完成以上公式的拟合时,需要考虑几个问题:
(1)该方法拟合时,需要给定每个参数的初始值,而且不同的初始值,拟合出来的结果可能并不相同,甚至差异非常大;
(2)有的初始值选取会导致拟合失败,直接得不到结果;
(3)该怎样写函数fun才能得到有效的拟合;
(4)当得到拟合结果,即一组参数a1,a2,...,a13的值时,怎样判定其精确度,以及准确性;
拟合结果:
以下是得到的一组合理的结果,
a(1)=10.163845,a(2)=0.395367,a(3)=-0.975375,a(4)=3.311806,a(5)=4.096069,a(6)=1.211358,a(7)=-17.871560,a(8)=1.283213,a(9)=12.979366,a(10)=43.064128,a(11)=24.059464,a(12)=0.598062,a(13)=10.028580,
对比实验值和拟合后的公式计算值
实验值拟合公式计算值-2.501036032-2.225177809-2.796881415-2.564047068-2.830217835-2.630709452-3.44376-2.810040425-4.074541935-3.138910417-1.609437912-3.94426673-3.036554268-3.824619464-4.074541935-3.787810766-4.327538449-4.383690344-4.803621125-4.618642492-5.203007187-5.173452295-6.502290171-5.479602794-2.120263536-2.590791649-2.407945609-3.299192629-3.91005-3.345059132-2.659260037-4.06265759-2.813410717-3.529119214......
拟合的结果和原始实验数据点相比,相当接近
下图是350个点的 拟合结果和实验值对比,二者曲线贴近效果良好
下图是局部的放大观察
用re=sum(abs(YA-Y))/length(Y);统计350个点的平均偏离程度,Y为实验值,YA为计算值,平均值计算结果为re=0.623681,
定义相对偏差 abs(YA-Y)/abs(Y)
350个数据点中有300的拟合值和实验值的偏差在1倍以内,这些点的平均偏差在30%左右,
50个点的偏差大于1倍,但这大部分也只是因为实验值太小,拟合值和实验值的绝对偏差除以很小的实验值,会得到很大的相对值。
拟合结果是很好的,公式很符合实验数据
最小二乘法与非线性拟合
定义:最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
最小二乘法是以如下目标函数最小化的一种优化方法:
,
其中是指定的拟合函数,或者说回归模型;是所有拟合数据集的值;
对于一个具体的拟合,例如,是一个具有4个参数的3元拟合函数,且提供拟合数据集共m组数据,即(),…, ()
那么
,最小二乘法就是要求得一组使得e最小。
要求一组使得取最小值,是一个单目标优化问题,通常对于这种优化问题,有多种优化算法,通常采用梯度下降法求解
关于梯度下降法,参考:
梯度下降法原理解析(大白话+公式推理)_梯度下降法公式_又是谁在卷的博客-CSDN博客
对于拟合:,是关于的线性函数,所以该拟合是一个线性拟合。
在计算的迭代过程中,有
,为梯度下降法中的学习率
对于的迭代计算过程与类似。
其中
下面列举一个非线性拟合的示例:
假定有如下拟合函数
,是关于的非线性函数,它是具有5个参数的2元拟合函数
同样采用m组拟合数据,
,
在计算的迭代过程中,有
,
对于的迭代计算过程与类似。
其中=
梯度下降法通过以上迭代公式去计算
得到后,也就完成了最初的拟合任务。
总结
本文介绍了一个具有3个变量,14个参数的复杂多元函数的拟合实现,通过matlab的lsqnonlin方法实现,并分享了一些拟合的技巧心得。
中间过程的脚本和数据,以及心得技巧在此分享给有需要的人,共勉
链接:/s/1JO2DFQ5b1AP0GGtFErn19w?pwd=ptty
提取码:ptty