哈喽大家好,欢迎来到塞纳斯环境,今天是小科的第三期软件教学分享!
这一期的内容是在上一期的基础上进行升级,MATLAB如何利用代码实现自动拟合(多个函数、多个参数同时拟合多组数据),下面表格中的内容为本次用到的数据:
X | Y1 | Y2 | Y3 |
0 | 1 | 1 | 1 |
3 | 0.926 | 0.855 | 0.863 |
7 | 0.850 | 0.814 | 0.863 |
13 | 0.813 | 0.644 | 0.820 |
115 | 0.719 | 0.512 | 0.781 |
148 | 0.713 | 0.553 | 0.721 |
178 | 0.596 | 0.352 | 0.682 |
207 | 0.422 | 0.287 | 0.636 |
270 | 0.385 | 0.248 | 0.580 |
话不多说,开始本次的分享:
1、从excel导入数据至matlab的工作区中(图1、图2); 2、新建脚本(.m),输入代码,保存,运行(图3、图4)(代码见附录); 3、得到运行结果,拟合图像、拟合度(图5);4、第2步中的代码还可以放在实时编辑器中(.mlx),方便(高版本才支持该功能)(图6);
图1
图2
图3
图4
图5
图6
代码附录:%注意,%是matlab的注释符号,运行过程中不会被读取(control+R代表加注释,control+T代表取消注释)
%目的:基于多组数据,进行多个方程、多个参数组拟合
%代码如下:
%首先需要将excel中的数据导入工作区内,并对导入的变量进行重命名,旨在方便下面的程序输入
set(groot,'defaultlinelinewidth',1.5);%设置默认线宽1.5
%输入第1个方程
f1=fittype('a*exp(-m1*x)+(1-a)*exp(-m2*x)','independent','x');%待拟合的函数方程,a、m1、m2是参数
%输入第2个方程
f2=fittype('a*exp(-m1*x)','independent','x');% a、m1是参数
%输入第3个方程
f3=fittype('exp(-m1*x)','independent','x');% m1是参数
%逐一给上面的3个方程进行初始参数赋值
%给第1个方程的参数赋3组不同的初值
fo11=fitoptions(f1);%拟合方程的选项,下同
fo11.startpoint=[0.1 0.005 0.001];%3个参数的初值:0.1, 0.005, 0.001,下同
fo12=fitoptions(f1);
fo12.startpoint=[0.2 0.05 0.001];
fo13=fitoptions(f1);
fo13.startpoint=[0.3 0.05 0.01];
%给第2个方程的参数赋3组不同的初值
fo21=fitoptions(f2);
fo21.startpoint=[0.2 0.001];
fo22=fitoptions(f2);
fo22.startpoint=[0.1 0.005];
fo23=fitoptions(f2);
fo23.startpoint=[0.1 0.05];
%给第3个方程的参数赋3组不同的初值
fo31=fitoptions(f3);
fo31.startpoint=[0.001];
fo32=fitoptions(f3);
fo32.startpoint=[0.05];
fo33=fitoptions(f3);
fo33.startpoint=[0.1];
%开始对数值、方程、初始参数进行拟合
[f11,gof11]=fit(X,Y1,f1,fo11);%f11表示拟合后的函数,gof11是拟合程度(goodness of fit),下同
[f12,gof12]=fit(X,Y1,f1,fo12);%control+F可以批量替换X,Y
[f13,gof13]=fit(X,Y1,f1,fo13);
[f21,gof21]=fit(X,Y2,f2,fo21);
[f22,gof22]=fit(X,Y2,f2,fo22);
[f23,gof23]=fit(X,Y2,f2,fo23);
[f31,gof31]=fit(X,Y3,f3,fo31);
[f32,gof32]=fit(X,Y3,f3,fo32);
[f33,gof33]=fit(X,Y3,f3,fo33);
%出第一组图(f1i,gof1i)
figure
%绘制散点图
sz=75%散点图点的大小
scatter(X,Y1,sz,'filled')%绘制坐标点(X,Y1),filled为实心点
hold on%保持绘图窗口,使所有图都放在一张图中
plot(f11,'r');%用红色(r)的线绘制拟合结果f11
hold on
plot(f12,'b');%用蓝色(b)的线绘制拟合结果f12
hold on
plot(f13,'m');%用黑色(m)的线绘制拟合结果f13
legend('datapoint','f11','f12','f13');%图例说明
xlabel('X');%横坐标名称
ylabel('Y1');%纵坐标名称
%出第二组图(f2i,gof2i)
figure
sz=75
scatter(X,Y2,sz,'filled')%绘制坐标点(X,Y2)
hold on%保持绘图窗口,使所有图都放在一张图中
plot(f21,'r');%用红色(r)的线绘制拟合结果f21
hold on
plot(f22,'b');%用蓝色(b)的线绘制拟合结果f22
hold on
plot(f23,'m');%用黑色(m)的线绘制拟合结果f23
legend('datapoint','f21','f22','f23');%图例说明
xlabel('X');%横坐标名称
ylabel('Y2');%纵坐标名称
%出第三组图(f3i,gof3i)
figure
sz=75
scatter(X,Y3,sz,'filled')%绘制坐标点(X,Y3)
hold on%保持绘图窗口,使所有图都放在一张图中
plot(f31,'r');%用红色(r)的线绘制拟合结果f31
hold on
plot(f32,'b');%用蓝色(b)的线绘制拟合结果f32
hold on
plot(f33,'m');%用黑色(m)的线绘制拟合结果f33
legend('datapoint','f31','f32','f33');%图例说明
xlabel('X');%横坐标名称
ylabel('Y3');%纵坐标名称
%下面则是生成对应的拟合结果参数
f11
gof11
f12
gof12
f13
gof13
f21
gof21
f22
gof22
f23
gof23
f31
gof31
f32
gof32
f33
gof33
%代码结束
运行结果附录:sz = 75
sz = 75
sz = 75
f11 = Generalmodel:
f11(x) =a*exp(-m1*x)+(1-a)*exp(-m2*x)
Coefficients (with95% confidence bounds):
a= -5.642 (-5.716e+04, 5.715e+04)
m1= 0.005737 (-2.358, 2.37)
m2= 0.005283 (-1.894, 1.904)
gof11 = sse: 0.0605
rsquare: 0.8335
dfe: 6
adjrsquare: 0.7780
rmse:0.1004
f12 = Generalmodel:
f12(x) =a*exp(-m1*x)+(1-a)*exp(-m2*x)
Coefficients (with95% confidence bounds):
a= 0.1139 (-0.05397, 0.2818)
m1= 0.4201 (-1.947, 2.787)
m2= 0.002582 (0.001245, 0.003919)
gof12 = sse: 0.0323
rsquare: 0.9112
dfe: 6
adjrsquare: 0.8816
rmse:0.0733
f13 = Generalmodel:
f13(x) =a*exp(-m1*x)+(1-a)*exp(-m2*x)
Coefficients (with95% confidence bounds):
a= 0.1142 (-0.05505, 0.2835)
m1= 0.4129 (-1.897, 2.722)
m2= 0.00258 (0.001236, 0.003924)
gof13 = sse: 0.0323
rsquare: 0.9112
dfe: 6
adjrsquare: 0.8816
rmse:0.0733
f21 = Generalmodel:
f21(x) =a*exp(-m1*x)
Coefficients (with95% confidence bounds):
a= 0.8596 (0.7408, 0.9783)
m1= 0.004549 (0.002781, 0.006317)
gof21 = sse: 0.0641
rsquare: 0.8866
dfe: 7
adjrsquare: 0.8704
rmse:0.0957
f22 = Generalmodel:
f22(x) =a*exp(-m1*x)
Coefficients (with95% confidence bounds):
a= 0.8596 (0.7408, 0.9783)
m1= 0.004549 (0.002781, 0.006317)
gof22 = sse: 0.0641
rsquare: 0.8866
dfe: 7
adjrsquare: 0.8704
rmse:0.0957
f23 = Generalmodel:
f23(x) =a*exp(-m1*x)
Coefficients (with95% confidence bounds):
a= 0.8596 (0.7408, 0.9783)
m1= 0.004549 (0.002781, 0.006317)
gof23 = sse: 0.0641
rsquare: 0.8866
dfe: 7
adjrsquare: 0.8704
rmse:0.0957
f31 = Generalmodel:
f31(x) =exp(-m1*x)
Coefficients (with95% confidence bounds):
m1= 0.002166 (0.00153, 0.002801)
gof31 = sse: 0.0453
rsquare: 0.6929
dfe: 8
adjrsquare: 0.6929
rmse:0.0753
f32 = Generalmodel:
f32(x) =exp(-m1*x)
Coefficients (with95% confidence bounds):
m1= 0.002166 (0.00153, 0.002801)
gof32 = sse: 0.0453
rsquare: 0.6929
dfe: 8
adjrsquare: 0.6929
rmse:0.0753
f33 = Generalmodel:
f33(x) =exp(-m1*x)
Coefficients (with95% confidence bounds):
m1= 0.002166 (0.00153, 0.002801)
gof33 = sse: 0.0453
rsquare: 0.6929
dfe: 8
adjrsquare: 0.6929
rmse:0.0753
好了,以上就是小科的第三期软件教学分享,我们下期再见,拜拜!