本博文源于《数学建模》,旨在讲解非线性最小二乘拟合的MATLAB实现。谈到matlab中非线性最小二乘拟合,就不得不提到lsqcurvefit与lsqnonlin。博文就讲解一下lsqcurvefit如何使用
一、函数基本用法讲解
x = lsqcurvefit('fun', x0, xdata, ydata,option)
- fun是一个预先定义的函数F(x,xdata),自变量为x和data
- x0是非线性最小二乘法的迭代初值
- xdata 是已知数据点
- ydata 是已知数据点
- option是指定具体的非线性优化方法
二、例子讲解
当提到这个函数使用时,我们可能会不知道如何在现实中操作。那么接下来就以一个例子来进行讲解
我们主要任务确定参数a,b,k。
2.1 确定函数fun
在matlab本地目录下右击创建curvefun1.m,比如这样
点击文件,进行编辑,将
c
(
t
)
=
a
+
b
e
−
0.2
k
t
c(t)=a+be^{-0.2kt}
c(t)=a+be−0.2kt
输入进去,代码应该是这样子的
function f=curvefun1(x,tdata)
f = x(1)+x(2)*exp(-0.02*x(3)*tdata)
% 其中x(1)=a,x(2)=b,x(3)=k
2.2 编写主程序
>> tdata = 100:100:1000;
>> cdata = 1e-03*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];
>> x0 = [2.3,9.09,0.05];
>> x = lsqcurvefit('curvefun1',x0,tdata,cdata)
>> f=curvefun1(x,tdata)
>> plot(tdata,cdata,'rp',tdata,f)
可以计算出
x =
0.0070 -0.0030 0.1032
f =
1 至 5 列
0.0045 0.0050 0.0054 0.0057 0.0059
6 至 10 列
0.0061 0.0063 0.0064 0.0065 0.0066
x三个值分别代表拟合的a,b,k,也就是a=0.0070 b=-0.0030 k=0.1032.函数式为:
c
(
t
)
=
0.007
+
0.003
∗
e
−
0.2
∗
0.1032
∗
t
c(t)=0.007+0.003*e^{-0.2*0.1032*t}
c(t)=0.007+0.003∗e−0.2∗0.1032∗t
下面进行图形查看
2.3 观察拟合图形
可以看见函数图形完美经过点,说明拟合效果非常棒
三、总结
非线性二乘拟合是拟合当中一个描述函数表达式的方法。在使用lsqcurvefit有两个注意点,一个是函数图形再函数文件表示,另一个是初始化迭代参数需要合理选择。参数没选对,拟合效果可能不尽人意。但是在本例中参数调整良好,迭代快速完成,效果如图可见。真是不错的一篇文章,有这方面需求可尽管收藏!