多元函數多參數擬合lsqcurvefit


多元函數多參數擬合lsqcurvefit

根據已有數據,要擬合已知模型的多元函數參數。

例如二元函數

\[z = f\left( {x,y} \right) = C{x^m}{y^n} \]

根據已有數據擬合\(C\quad m\quad n\)三個參數。

MATLAB采用lsqcurvefit需要注意語法,經常寫錯,特別注意。


lsqcurvefit函數語法

x = lsqcurvefit(fun,x0,xdata,ydata)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)

[x,resnorm] = lsqcurvefit(…)
[x,resnorm,residual] = lsqcurvefit(…)
[x,resnorm,residual,exitflag] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)
參數說明:
x0為初始解向量;xdata,ydata為滿足關系ydata=F(x, xdata)的數據;
lb、ub為解向量的下界和上界lb≤x≤ub,若沒有指定界,則lb=[ ],ub=[ ];
options為指定的優化參數;
fun為待擬合函數,計算x處擬合函數值,其定義為 function F = myfun(x,xdata)
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x處殘差的平方和;
residual=fun(x,xdata)-ydata,即在x處的殘差;
exitflag為終止迭代的條件;
output為輸出的優化信息;
lambda為解x處的Lagrange乘子;
jacobian為解x處擬合函數fun的jacobian矩陣。

下面這個例子是擬合一個二元函數的三個參數。

clc;clear;
q_data = [1.962 3.488 3.924 6.976];
d_data = [4.45	8.01	5.34	9.81];
T_data = [538.82604	560.74205	564.13515	577.05757];
T_data = T_data+273;
QR = -146000/8.314;
k10 = 8.725e9;
alpha10 = -0.08637;
beta10 = 0.008683;

%擬合
m0 = [k10,alpha10,beta10];
mmin = 0.01*m0;
mmax = 100*m0;
f = @(m,x)( m(1)*(1./(x(1,:)).^m(2)).*exp(m(3)./x(1,:)).*exp(QR./x(2,:)) );
Xdata = [q_data;T_data];
[m,resnorm,residual] = lsqcurvefit(f,m0,Xdata,d_data,mmin,mmax);
d_yb = f(m,Xdata);
plot(q_data,d_data,'b*');
hold on
plot(q_data,d_yb,'r-');
% plot(d_data,d_yb);
% fun = 8.725e9*(1./q_data).^(-0.08637).*exp(0.008683./q_data).*exp(QR./T_data);
% plot(d_data,fun);

上面這個例子數據太少,擬合效果不好。

  • lsqcurvefit的第三個參數xdata只能是一個,因此要多元函數自變量寫成向量形式。擬合的參數有多個,也寫成向量形式即可。

  • 有時候發現lsqcurvefit找不到合適的擬合參數,或許是模型問題,也有可能是參數范圍有問題。

  • 如果模型沒問題的話,可以先假定一組擬合參數值看看曲線形狀,與原始數據進行對比。

  • 如果模型有問題,獲得無量綱數,通過遺傳編程獲得比較好的模型。


復雜的擬合問題有時候還是用軟件來得快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM