問題:已知xlsx表格[X,Y,Z]的離散取值,希望用
?來擬合,用matlab求得[C1,C2,C3,C5,C6]的值
解答:
clc; clear; close all; %加載數(shù)據(jù)(注意為方便讀取,data.xlsx數(shù)據(jù)已經(jīng)手動處理) data = xlsread('modify_data.xlsx'); %x為時間h,y為壓強(qiáng)Mpa,z=% x=data(:,1);y=data(:,2);z=data(:,3); %采用匿名函數(shù)按照離散數(shù)據(jù)以給定函數(shù)形式擬合解析式,x、y自變量,y因變量,Ci為參數(shù) myfit=fittype( @(C1,C2,C3,C5,C6,x,y) C1.*(y.^C2).*(x.^C3)+C5.*(y.^C6).*x, ... ? ? ? ? 'independent', {'x', 'y'}, ... ? ? ? ? 'dependent', 'z' ); %擬合數(shù)據(jù),特別注意'StartPoint'需要適當(dāng)選取[C1,...,C6]否則不收斂, %利用curvefittingtool工具箱不斷調(diào)整得出參數(shù)起始點(diǎn)可取[-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);:
運(yùn)行結(jié)果:
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認(rèn)為接近1,擬合效果不錯
2.fill函數(shù)的startpoint如何設(shè)置[C1,...C6]得到一個收斂點(diǎn)?(我找了沒找到什么設(shè)置startpoint好方法,摸索用如下方法找到了一個還可接受結(jié)果)文章來源:http://www.zghlxwxcb.cn/news/detail-509873.html
利用curvefitting工具箱里的custom equtation,在fit options手動改變C1到C6數(shù)值(二分法思想:先很大正數(shù)后很大負(fù)數(shù),初步判定Ci的正負(fù),然后除2選擇中間值或再除2,觀察擬合趨勢決定找尋方向),觀察擬合效果,并觀察左邊是否converge收斂和warning警告rsquare為正,差不多到收斂和requare到0.6左右之后停止手動操作。接下來可以編寫循環(huán)微調(diào)參數(shù)步長,篩選出更大的rsquare,類似這樣:文章來源地址http://www.zghlxwxcb.cn/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
到了這里,關(guān)于Matlab數(shù)據(jù)處理:用離散數(shù)據(jù)根據(jù)自定義多變量非線性方程擬合解析方程求取參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!