matlab曲线拟合工具箱
文章内容部分参考自【数模国赛救急】13分钟学会matlab曲线拟合工具箱哔哩哔哩bilibili
题目
题目摘自司守奎老师的《数学建模算法与应用(第2版)》
![](https://i-blog.csdnimg.cn/blog_migrate/ad4ea2adddf5efb74ab5fa78b1dbd089.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5430eba34d895717ffbe8b23a84b3b42.png)
首先我们对数据做一个散点图,来观察一下初步的形状,得到一条曲线
plot(X,Y,'o');
X=[1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000]
Y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 106.5 123.2 131.7 150.7 179. 204 226.5 251.4 281.4]
![](https://i-blog.csdnimg.cn/blog_migrate/8c963b8ce4f308b8db877d6f953c4872.png)
分析
用拟合工具箱进行对xm和r的参数拟合
可以在APP中找到curve fitting tool或者直接在命令行中输入cftool,都是可以打开的
拟合工具箱的左侧是让我们选择数据的窗口,可以看到有X/Y/Z三个数据选项
![](https://i-blog.csdnimg.cn/blog_migrate/8033f8098d4550be7cc8f9246c205383.png)
意思是说,我们的拟合工具箱最多可以用来处理一个变量或者两个变量的拟合问题
如果是多维的拟合,我们可以用粒子群算法
在数模比赛中,我们最常用的拟合算法有两种:Custom Equation和Polymial(多项式拟合)
Custom Equation
Custom Equation是用户自定义函数拟合,比如这道题,题目要求我们用指定的函数拟合
就可以选择这种方法,x是关于t的函数,然后对应函数的形式把函数输入到框中xm/(1+(xm/3.9-1)exp(-r(t-1790)))
![](https://i-blog.csdnimg.cn/blog_migrate/96df0d161d09e82a9c255830db1de050.png)
此时我们已经得到了一条拟合曲线,但是效果非常的差
导致这种现象发生的原因是:在拟合的时候matlab会自动为我们选择xm和r的初值
但如果初值的选取不合理,就会造成这种现象,方法是我们在选项中对初值进行调试
![](https://i-blog.csdnimg.cn/blog_migrate/1fbb00ff40f6f486c6bbc02275152930.png)
现在就得到了一条正常的曲线
对结果参数的解释
General model:
f(t) = xm/(1+(xm/3.9-1)exp(-r(t-1790)))
Coefficients (with 95% confidence bounds):
r = 0.02735 (0.0265, 0.0282)
xm = 342.5 (311, 374)
Goodness of fit:
SSE: 1230
R-square: 0.9924
Adjusted R-square: 0.992
RMSE: 7.841
由结果我们可以看到,拟合参数xm=342.5,r=0.02735
区间的意思是,r的值有95%的几率落在[0.0265,0.0282],xm同理
对于下面的参数,最重要的是SSE和R-SQUARE(即R²)
但是这里需要注意,如果函数是线性的,那么需要关注的有SSE和R²
如果函数是非线性的,那么需要关注的只有SSE
如何理解线性?
这里的线性指的是对参数的线性,如y(x)=ax+bx²,它是一个线性函数,a和b是我们要预测的参数且都为一次
再如y(x)=acx+bx²,此时就不再满足线性,y(x)=e^(ax+bx),同样也是线性函数哟
本题显然就是一个非线性的函数,所以我们关注其SSE=1230,看起来是一个非常大的数
但是别忘了,Y里面的值本来就偏大,更何况平方和,所以1230是一个比较理想的数据了
文件选项中的Generate Code可以用于生成代码,保存后就可以使用了
createFit(X,Y)
![](https://i-blog.csdnimg.cn/blog_migrate/04d94d706c09a8c04be410c1ffb0f0a7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cec42a18c4d06e20c81265b53b716cee.png)
并可在代码对应的地方进行修改
![](https://i-blog.csdnimg.cn/blog_migrate/dae8ad78163f5e337938e13d8b410acc.png)
Polymial
polymial是多项式拟合,我们可以选择多项式的次数
Center and scale可以选项,表示对数据进行标准化
随着次数越来越高,SSE貌似在逐渐降低,说明次数越高,误差越小,越值得被我们选作模型吗?
其实不然,在选择模型的时候,并不是越复杂越好,在牺牲一部分精确度的代价下模型是越简单越好的,重要的是看你有没有在模型上进行改进和创新
所以这里用二次拟合即可
f(x)=p1x²+p2x+p3
p1=28.4,p2=83.87,p3=67.65
![](https://i-blog.csdnimg.cn/blog_migrate/f620281cefc8b73fe7fb0bd7e983190a.png)
预测
对2001年到2030年的美国人口数量进行预测:
t=2001:1:2030;
xm=342.5;
r=0.02735;
predict=xm./(1+(xm/3.9-1)exp(-r(t-1790)));
plot(X,Y,'b-o',t,predict,'*'); %作图对比一下
![](https://i-blog.csdnimg.cn/blog_migrate/517553c7e0b73ea1094b826f8fb666fe.png)
拟合算法介绍
Custom Equations:用户自定义的函数类型
Polynomial:多项式逼近,其最高次数为9
Smoothing Spline:平滑逼近
Interpolant:插值逼近,有4种类型,nearest neighbor、linear、cubic、shape-perserving(PCHIP)
Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8种类型,基础型是 a1*exp(-((x-b1)/c1)^2)
Exponential:指数逼近,有2种类型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x)
Power:幂逼近,有2种类型,a*x^b 、a*x^b + c
Rational:有理数逼近
Sum of Sine:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1)
Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)