一下代码直接复制到m文件中即可。拟合结果以及相关性系数R^2见附图1。
%-------------------Start--------------------------------------------
function feixianxingnihe1
clear all;clc
format long
tspan=[0.0833 0.5 1 2 4 8]; %t的数据,在此输入
xexp=[2.2505 1.6489 0.2789 0.2412 0.1077 0.1035]; %c的数据,在此输入
k0=[2.6 1.45 0.022 0]; %这里设定A1~A4的初值
lb=-[1 0 1 0]*1e5; %分别设定A1~A4的取值下限,A2和A4已经设为大于等于0了
ub=[1 1 1]*1e5; %A1~A4的取值上限
%-------------------------------------------------------------------------
% 使用函数lsqnonlin()进行参数估计
OPTIONS=optimset('MaxFunEvals',1000);
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
lsqnonlin(@ObjFunc,k0,lb,ub,OPTIONS,tspan,xexp);
ci = nlparci(k,residual,jacobian);
%residual;
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\n\t参数 A1 = %.16f',k(1))
fprintf('\n\t参数 A2 = %.16f',k(2))
fprintf('\n\t参数 A3 = %.16f',k(3))
fprintf('\n\t参数 A4 = %.16f',k(4))
y=KineticsEqs(tspan,k);
R2=1-sum((xexp-y).^2)./sum((xexp-mean(y)).^2);
fprintf('\n\t相关系数之平方R^2 = %.16f',R2);
figure
plot(tspan,KineticsEqs(tspan,k),'b',tspan,xexp,'or'),legend('计算值','实验值','Location','Best')
%-------------------------------------------------------------------------
function f = ObjFunc(k,tspan,xexp)
f=KineticsEqs(tspan,k)-xexp;
%------------------------------------------------------------------------
function xt = KineticsEqs(t,k)
xt=k(1)*exp(-k(2)*t)+k(3)*exp(-k(4)*t);
%-----------------------------------The end -----------------------------
在代码赋于初值的那一部分,可以根据各参数的物理意义输入具体数值,最后的拟合结果与初值关系很大。
另外用1stopt可以得到R^2=0.993409615207485的拟合结果:
A1 -17577.3242768536
A2 99.2632248231063
A3 8.9625935335228
A4 3.38938238943609
以及若干组R^2=0.993409615207485的拟合结果:
A1 8.96259352762256
A2 3.38938238846346
A3 -25330.6623331322
A4 103.649850688563
分析选定的方程形式可知,其实A1,A2,A3,A4具有对称性A(i)=8.96259352762256, 3.38938238846346是数值稳定的,剩余的两个A(i)只要一个数值较大,即会使得那一整项为0。
当然,R^2大的,不一定具有物理意义。
附图1.jpg
,