已知?jiǎng)恿W(xué)模型為:
dA1dt = r1 + r2;
dA2dt = - r1-r2;
dA3dt = -r1;
dA4dt = r1 - r2;
dA5dt = r2;
r1 = k(1)*((a(3)*a(2) - (1/2.20)*a(4)*a(1)));
r2 = k(2)*(a(4)*a(2) - (1/0.40)*a(5)*a(1)));
已知的參數(shù):
時(shí)間:tspan = [0 60 120 180 240 300 360 420 600 1200 6900 7500],
活度系數(shù):KineticsData1
% 動(dòng)力學(xué)數(shù)據(jù)
% a1 a2 a3 a4 a5
ExpData=...
[0.0000 0.8122 0.3894 0.0000 0.0000
0.1827 0.6353 0.1599 0.2163 0.0444
0.2547 0.5668 0.0979 0.2485 0.0805
0.2854 0.5390 0.0788 0.2415 0.1061
0.2978 0.5258 0.0738 0.2359 0.1192
0.3019 0.5210 0.0710 0.2309 0.1288
0.3092 0.5143 0.0691 0.2264 0.1349
0.3178 0.5062 0.0680 0.2223 0.1349
0.3178 0.5062 0.0680 0.2186 0.1433
0.3211 0.5030 0.0674 0.2154 0.1478
0.3209 0.5036 0.0673 0.2140 0.1482
0.3205 0.5045 0.0674 0.2136 0.1476 ]
下面是寫的matlab程序:
function Kinetic2
% 動(dòng)力學(xué)ODE方程模型的參數(shù)估計(jì)
clear all
clc
k0 = [900000 50000]; % 參數(shù)初值
lb = [0 0]; % 參數(shù)下限
ub = [+inf +inf ]; % 參數(shù)上限
a0 = [0.0000 0.8122 0.3894 0.0000 0.0000];
KineticsData1;
yexp = ExpData(:,1:5); % yexp: 實(shí)驗(yàn)數(shù)據(jù)[a1 a2 a3 a4 a5]
% 使用函數(shù)fmincon()進(jìn)行參數(shù)估計(jì)
[k,fval,flag] = fmincon(@ObjFunc4Fmincon,k0,[],[],[],[],lb,ub,[],[],a0,yexp);
fprintf('\n使用函數(shù)fmincon()估計(jì)得到的參數(shù)值為:\n')
fprintf('\tk1 = %.4f\n',k(1))
fprintf('\tk2 = %.4f\n',k(2))
fprintf(' The sum of the squares is: %.1e\n\n',fval)
k_fmincon = k;
% 使用函數(shù)lsqnonlin()進(jìn)行參數(shù)估計(jì)
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],a0,yexp);
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函數(shù)lsqnonlin()估計(jì)得到的參數(shù)值為:\n')
fprintf('\tk1 = %.4f\n',k(1))
fprintf('\tk2 = %.4f\n',k(2))
fprintf(' The sum of the squares is: %.1e\n\n',resnorm)
exitflag
% 以函數(shù)fmincon()估計(jì)得到的結(jié)果為初值,使用函數(shù)lsqnonlin()進(jìn)行參數(shù)估計(jì)
k0 = k_fmincon;
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[1e-15],a0,yexp);
ci = nlparci(k,residual,jacobian);
fprintf('\n\n以fmincon()的結(jié)果為初值,使用函數(shù)lsqnonlin()估計(jì)得到的參數(shù)值為:\n')
fprintf('\tk1 = %.4f\n',k(1))
fprintf('\tk2 = %.4f\n',k(2))
fprintf(' The sum of the squares is: %.1e\n\n',resnorm)
exitflag
function f = ObjFunc4Fmincon(k,a0,yexp)
tspan = [0 60 120 180 240 300 360 420 600 1200 6900 7500];
[t a] = ode23s(@KineticEqs,tspan,a0,[],k);
y(:,1:5) = a(:,1:5);
f = sum(((y(:,1)-yexp(:,1))/0.01).^2) + sum(((y(:,2)-yexp(:,2))/0.01).^2) ...
+ sum(((y(:,3)-yexp(:,3))/0.005).^2) + sum(((y(:,4)-yexp(:,4))/0.01).^2) ...
+ sum(((y(:,5)-yexp(:,5))/0.01).^2);
function f = ObjFunc4LNL(k,a0,yexp)
tspan = [0 60 120 180 240 300 360 420 600 1200 6900 7500];
[t a] = ode23s(@KineticEqs,tspan,a0,[],k);
y(:,1:5) = a(:,1:5);
f1 = (y(:,1) - yexp(:,1))/0.01;
f2 = (y(:,2) - yexp(:,2))/0.01;
f3 = (y(:,3) - yexp(:,3))/0.005;
f4 = (y(:,4) - yexp(:,4))/0.01;
f5 = (y(:,5) - yexp(:,5))/0.01;
f = [f1; f2; f3; f4; f5];
plot(tspan,yexp(:,1), 'b^',tspan,yexp(:,2), 'ro',tspan,yexp(:,3),'y*',...
tspan,yexp(:,4), 'go',tspan,yexp(:,5), 'cs')
hold on
plot(tspan,y(:,1), 'b-',tspan,yexp(:,2), 'r-',tspan,yexp(:,3),'y-', ...
tspan,yexp(:,4), 'g-',tspan,yexp(:,5), 'c-')
axis([0 800 0 1])
%動(dòng)力學(xué)模型-----------------------------------------------------------------------
function dadt = KineticEqs(t,a ,k)
Keq=[2.20 0.40];
dadt=...
[((k(1)*(a(3)*a(2)-(1/Keq(1))*a(4)*a(1))) + (k(2)*(a(4)*a(2)-(1/Keq(2))*a(5)*a(1))));
-((k(1)*(a(3)*a(2)-(1/Keq(1))*a(4)*a(1))) + (k(2)*(a(4)*a(2)-(1/Keq(2))*a(5)*a(1))));
-(k(1)*(a(3)*a(2)-(1/Keq(1))*a(4)*a(1)));
((k(1)*(a(3)*a(2)-(1/Keq(1))*a(4)*a(1))) - (k(2)*(a(4)*a(2)-(1/Keq(2))*a(5)*a(1))));
(k(2)*(a(4)*a(2)-(1/Keq(2))*a(5)*a(1)))];
大家?guī)兔匆豢矗睦镉袉栴},從做出的圖可以看出,處理的結(jié)果很差啊。
無(wú)論K初值給出怎么樣,都是擬合出來的a1和實(shí)驗(yàn)值a1相差很遠(yuǎn),而其他值都擬合很好。
![]()
[ Last edited by 楚天湘水 on 2012-5-1 at 00:44 ] |