CODE:
function KineticsEst1_Int_modified_by_Yuezhilan
clear all;clc
format long
tspan=[31 32 33 34 35 36 37 38 39 40 41 42 43 44 45]-31;
yexp=[22.73032 24.55624 25.88679 26.69019 27.16334 27.45866 27.64919 27.57615 27.70635 27.77303 27.86195 27.91911 27.95721 27.98897]';
beta0=[100 10 0.1 ];
y0=20.4122;
lb=[-1 -1 -1]*1e6;
ub=[1e9 1e9 1e2];
yy=[y0 yexp'];
k0=beta0;
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,y0,yexp);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\t待拟合参数 k1 = %.6f\n',k(1))
fprintf('\t待拟合参数 k2 = %.6f\n',k(2))
fprintf('\t待拟合参数 k3 = %.6f\n',k(3))
fprintf(' 残差平方和= %.6f\n\n',resnorm)
ts=0:1:max(tspan);
[ts ys]=ode45(@KineticsEqs,ts,y0,[],k);
[ttt XXsim] = ode45(@KineticsEqs,tspan,y0,[],k);
y=XXsim(2:end);
xexp=yexp;
R2=1-sum((xexp-y).^2)./sum((xexp-mean(y)).^2);
fprintf('\n\t决定系数R-Square = %.6f',R2);
figure(1)
plot(ts,ys,'b',tspan,yy,'or'),legend('计算值','实验值','Location','best');
yr=y-yexp;
figure(2)
plot(tspan(2:end),yr,'r*',[-1 15],[0 0]),axis([-1 15 -0.5 0.5]);
figure(3)
plot(yexp,y,'ro',[21 29],[21 29],'b-');
%---------------------------------------------------------
function f = ObjFunc(k,tspan,y0,yexp) % 目标函数
[t Xsim] = ode45(@KineticsEqs,tspan,y0,[],k) ;
ysim = Xsim(2:end);
size(ysim);
size(yexp);
f=ysim-yexp;
%----------------------------------------------------------
function dydt = KineticsEqs(t,y,k)
beta(1)=k(1);
beta(2)=k(2);
beta(3)=k(3);
dydt = 0.001414/(1/(4.5727*10^4*beta(1)*(1-0.02119*y)^beta(2))+1/beta(3)/45727);