简介
本文介绍了基于matlab实现的复杂函数以及多元函数的拟合。在工程和研究中偶尔会遇到要用一个非常复杂的数学公式来拟合实验测量数据,对这些复杂的数学公式拟合时,采用常见的拟合方法往往会失败,或者得不到足够精确的结果。本文以笔者多年工作经验中的某些典型场景为例,介绍钻研出来的一些非常有用的拟合经验。
案例
需要对如下公式进行拟合,能看出来Y=f(Z,E,A),关于参数a1,a2,...,a13的关系
现在需要通过给定的数据点集,通过拟合得到上述参数的一套值出来
共获得了实验数据约350组,即下列数据共350行4列,现在通过如下所示的数据集进行拟合
A Z E Y
3 8 11.5163 -2.501036032
24 8 10.3738 -2.796881415
25 9 12.442 -2.830217835
27 10 12.8485 -3.442019376
28 10 11.7724 -4.074541935
29 10 16.1245 -1.609437912
30 11 17.6367 -3.036554268
31 11 15.571 -4.074541935
32 11 19.4956 -4.327538449
33 11 18.3907 -4.803621125
34 11 22.5039 -5.203007187
35 11 21.8553 -6.502290171
32 12 10.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.442019376 -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.912023005 -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倍,但这大部分也只是因为实验值太小,拟合值和实验值的绝对偏差除以很小的实验值,会得到很大的相对值。
拟合结果是很好的,公式很符合实验数据
总结
本文介绍了一个具有3个变量,14个参数的复杂多元函数的拟合实现,通过matlab的lsqnonlin方法实现,并分享了一些拟合的技巧心得。
中间过程的脚本和数据,以及心得技巧在此分享给有需要的人,共勉
链接:https://pan.baidu.com/s/1JO2DFQ5b1AP0GGtFErn19w?pwd=ptty
提取码:ptty