问题:已知xlsx表格[X,Y,Z]的离散取值,希望用Z=C1Y^{C2}X^{C3}+C5Y^{C6}X 来拟合,用matlab求得[C1,C2,C3,C5,C6]的值

解答:

clc;
clear;
close all;
%加载数据(注意为方便读取,data.xlsx数据已经手动处理)
data = xlsread('modify_data.xlsx');
%x为时间h,y为压强Mpa,z=%
x=data(:,1);y=data(:,2);z=data(:,3);
%采用匿名函数按照离散数据以给定函数形式拟合解析式,x、y自变量,y因变量,Ci为参数
myfit=fittype( @(C1,C2,C3,C5,C6,x,y) C1.*(y.^C2).*(x.^C3)+C5.*(y.^C6).*x, ...
        'independent', {'x', 'y'}, ...
        'dependent', 'z' );
%拟合数据,特别注意'StartPoint'需要适当选取[C1,...,C6]否则不收敛,
%利用curvefittingtool工具箱不断调整得出参数起始点可取[-0.0700,0.2750,0.5450,-3.9575,0.9949],使得拟合收敛
[coe,gof] = fit([x,y],z,myfit,'StartPoint',[-0.0700,0.2750,0.5450,-3.9575,0.9949]);
coe
gof
%绘图
plot(coe, [x y], z);:

运行结果:

General model:
     coe(x,y) = C1.*(y.^C2).*(x.^C3)+C5.*(y.^C6).*x
     Coefficients (with 95% confidence bounds):
       C1 =   2.402e-06  (-9.316e-07, 5.736e-06)
       C2 =       1.915  (1.705, 2.125)
       C3 =     0.08906  (0.06933, 0.1088)
       C5 =  -9.081e-08  (-2.133e-06, 1.952e-06)
       C6 =      0.9633  (-2.509, 4.436)


gof = 

  包含以下字段的 struct:

           sse: 2.4940
       rsquare: 0.8668
           dfe: 199
    adjrsquare: 0.8641
          rmse: 0.1119

 备注:

1.rsquare=0.8668认为接近1,拟合效果不错

2.fill函数的startpoint如何设置[C1,...C6]得到一个收敛点?(我找了没找到什么设置startpoint好方法,摸索用如下方法找到了一个还可接受结果)

利用curvefitting工具箱里的custom equtation,在fit options手动改变C1到C6数值(二分法思想:先很大正数后很大负数,初步判定Ci的正负,然后除2选择中间值或再除2,观察拟合趋势决定找寻方向),观察拟合效果,并观察左边是否converge收敛和warning警告rsquare为正,差不多到收敛和requare到0.6左右之后停止手动操作。接下来可以编写循环微调参数步长,筛选出更大的rsquare,类似这样:

for i=1:100
    [coe,gof] = fit([x,y],z,myfit,'StartPoint',[0.001664,0.0231+0.0001*i,-0.007028,-0.9979,-0.0068,-0.5807,-1.013,-0.08-3.5852e-04]);
    if gof.rsquare>0.6
        fprintf('i=%d,gof.requare=%f\n',i,gof.rsquare);
    end
    
end

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐