笔记整理来自《清风数学建模》
目录
一、打开matlab拟合工具箱
二、拟合工具箱的使用
三、自定义拟合函数——Custom Equation(建模用的较多)
四、多项式拟合(建模用的较多)
五、如何导出拟合的高清图像
六、调用拟合工具箱自动生成的代码
七、利用拟合工具箱预测美国人口
1. 题目
2. 使用拟合工具箱进行拟合
3. 自动生成拟合的代码
4. 预测未来的人口数
八、优秀论文中cftool的应用
一、打开matlab拟合工具箱
方法1:直接输入“cftool”
方法2:选择“apps”"curve fitting"
拟合工具箱:
二、拟合工具箱的使用数据:
x4.25.92.73.83.85.66.93.53.62.94.26.15.56.62.93.35.965.6y8.411.74.26.17.910.213.26.664.68.41210.313.34.66.710.811.59.9(1)导入数据:load data1.mat
(2) 选择合适的函数进行拟合。
参数解释:
Linear model Poly1:
f(x) = p1*x + p2
Coefficients (with 95% confidence bounds):
p1 = 2.095 (1.886, 2.304) %表明p1有95%的可能性落在[1.886,2.304]这个区间
p2 = -1.055 (-2.072, -0.03775)
Goodness of fit:
SSE: 5.728%误差平方和
R-square: 0.9635%拟合优度
Adjusted R-square: 0.9613%调整后的拟合优度
RMSE: 0.5805%均方误差
在拟合里面,最重要的两个参数是误差平方和SSE和拟合优度R^2,拟合优度越接近于1,说明误差越小,拟合效果越好。
三、自定义拟合函数——Custom Equation(建模用的较多)在matlab拟合工具箱中,可以自定义函数的参数和表达式,matlab会自动计算出参数的值。
当拟合函数设置成一元二次函数时,可以发现拟合优度变大了,这是不是说明该二次函数比一次函数更好呢?
实际上,二次函数和一次函数的SSE和R^2的值都相差不大。在这种情况下,尽量拟合函数越简单越好,否则很可能出现龙格现象(过拟合)。
四、多项式拟合(建模用的较多)多项式拟合可以自定义函数的阶数。
五、如何导出拟合的高清图像(1)选择“打印图像”
(2) 选择“导出设置”“导出”或者选择“编辑”“复制图片”
分辨率可以改成“600”,这样图像的清晰度会更高一些。
六、调用拟合工具箱自动生成的代码
第一步:选择“文件”“自动生成代码”
第二步:点击保存,保存为函数格式.m的文件
第三步:点击下面的代码执行即可。
[fitresult, gof] = createFit(x, y)通过生成的代码,可以更改坐标轴、图像标题等信息。
七、利用拟合工具箱预测美国人口 1. 题目下表给出了近2个世纪的美国人口统计数据(单位:百万人),请使用最下面给定的拟合函数预测后30年的美国人口。
2. 使用拟合工具箱进行拟合导入数据,调出拟合工具箱:
year = 1790:10:2000;population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];cftool输入自定义的拟合函数:(需要将f(x)改为f(t))
xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))发现拟合函数图像有问题,提示:
Fit computation did not converge:拟合计算未收敛:
Fitting stopped because the number of iterations or function evaluations exceeded the specified maximum.拟合停止,因为迭代次数或函数求值次数超过了指定的最大值。
说明拟合参数xm和r的初始值设置有问题,这就需要我们更改拟合参数xm和r的值,我们可以一个个数去试
【结果】:
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.4 (311, 373.8)
Goodness of fit:
SSE: 1225
R-square: 0.9924
Adjusted R-square: 0.992
RMSE: 7.826
在这里,由于该函数不是线性函数,所以不用拟合优度解释拟合的效果,而应该用误差平方和SSE进行解释。这里SSE=1225,说明误差还比较小。
3. 自动生成拟合的代码和第五点的操作方法一样,自动生成代码,改变一些标题等。
自动生成的代码:
function [fitresult, gof] = createFit(year, population)%% Fit: 'untitled fit 1'.[xData, yData] = prepareCurveData( year, population );% Set up fittype and options.ft = fittype( 'xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))', 'independent', 't', 'dependent', 'y' );opts = fitoptions( ft );opts.Display = 'Off';opts.Lower = [-Inf -Inf];opts.StartPoint = [0.757740130578333 41];opts.Upper = [Inf Inf];% Fit model to data.[fitresult, gof] = fit( xData, yData, ft, opts );% Plot fit with data.figure( 'Name', '拟合函数图像' );h = plot( fitresult, xData, yData );legend( h, '样本点', '拟合曲线', 'Location', 'NorthEast' );% Label axesxlabel( '年份' );ylabel( '人口数(百万人)' );grid on图像:
4. 预测未来的人口数【分析】指导预测人口y=f(x)的函数关系式后,可以根据年份算出人口数。需要注意的时,计算预测的人口数时需要用点乘/除的形式,保证一个x对应一个唯一的y值,按照对应的值进行计算。
t = 2001:2030;xm = 342.4; r = 0.02735;predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)计算结果:(predictions即为预测的人口数)
年份200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030人口269.4898271.047272.5795274.0874275.5707277.0295278.4638279.8738281.2595282.621283.9585285.2722286.5621287.8285289.0715290.2913291.4881292.6621293.8136294.9428296.0498297.135298.1986299.2408300.2619301.2622302.2419303.2013304.1407305.0603plot(year,population,'o',t,predictions,'.') % 绘制预测结果图 八、优秀论文中cftool的应用快三大小单双计划qq群ber of iterations or function evaluations exceeded the specified maximum.拟合停止,因为迭代次数或函数求值次数超过了指定的最大值。
说明拟合参数xm和r的初始值设置有问题,这就需要我们更改拟合参数xm和r的值,我们可以一个个数去试
【结果】:
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.4 (311, 373.8)
Goodness of fit:
SSE: 1225
R-square: 0.9924
Adjusted R-square: 0.992
RMSE: 7.826
在这里,由于该函数不是线性函数,所以不用拟合优度解释拟合的效果,而应该用误差平方和SSE进行解释。这里SSE=1225,说明误差还比较小。
3. 自动生成拟合的代码和第五点的操作方法一样,自动生成代码,改变一些标题等。
自动生成的代码:
function [fitresult, gof] = createFit(year, population)%% Fit: 'untitled fit 1'.[xData, yData] = prepareCurveData( year, population );% Set up fittype and options.ft = fittype( 'xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))', 'independent', 't', 'dependent', 'y' );opts = fitoptions( ft );opts.Display = 'Off';opts.Lower = [-Inf -Inf];opts.StartPoint = [0.757740130578333 41];opts.Upper = [Inf Inf];% Fit model to data.[fitresult, gof] = fit( xData, yData, ft, opts );% Plot fit with data.figure( 'Name', '拟合函数图像' );h = plot( fitresult, xData, yData );legend( h, '样本点', '拟合曲线', 'Location', 'NorthEast' );% Label axesxlabel( '年份' );ylabel( '人口数(百万人)' );grid on图像:
4. 预测未来的人口数【分析】指导预测人口y=f(x)的函数关系式后,可以根据年份算出人口数。需要注意的时,计算预测的人口数时需要用点乘/除的形式,保证一个x对应一个唯一的y值,按照对应的值进行计算。
t = 2001:2030;xm = 342.4; r = 0.02735;predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)计算结果:(predictions即为预测的人口数)
年份200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030人口269.4898271.047272.5795274.0874275.5707277.0295278.4638279.8738281.2595282.621283.9585285.2722286.5621287.8285289.0715290.2913291.4881292.6621293.8136294.9428296.0498297.135298.1986299.2408300.2619301.2622302.2419303.2013304.1407305.0603plot(year,population,'o',t,predictions,'.') % 绘制预测结果图 八、优秀论文中cftool的应用