问题:已知xlsx表格[X,Y,Z]的离散取值,希望用
来拟合,用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好方法,摸索用如下方法找到了一个还可接受结果)文章来源:https://www.toymoban.com/news/detail-509873.html
利用curvefitting工具箱里的custom equtation,在fit options手动改变C1到C6数值(二分法思想:先很大正数后很大负数,初步判定Ci的正负,然后除2选择中间值或再除2,观察拟合趋势决定找寻方向),观察拟合效果,并观察左边是否converge收敛和warning警告rsquare为正,差不多到收敛和requare到0.6左右之后停止手动操作。接下来可以编写循环微调参数步长,筛选出更大的rsquare,类似这样:文章来源地址https://www.toymoban.com/news/detail-509873.html
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
到了这里,关于Matlab数据处理:用离散数据根据自定义多变量非线性方程拟合解析方程求取参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!