电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1480|回复: 0
收起左侧

反应动力学,ode45求助!

[复制链接]

587

主题

981

帖子

5126

积分

四级会员

Rank: 4

积分
5126
发表于 2022-9-20 19:54:18 | 显示全部楼层 |阅读模式
clear all
clc
DATA1=[
1    0.1578    0.3888    0.6673    0.7643;
4 0.1202    0.2235    1.1420    1.1303;
7 0.1136    0.2287    1.1510    1.1419;
10 0.1027    0.2172    1.2187    1.1922;
30  0.0701    0.2235    1.3194    1.2827;
60   0.0594    0.2472    1.2912    1.2790;
90   0.0538    0.3108    1.1387    1.1946];


k0 = [0.5  0.5];         % 参数初值                                                                                                
lb = [0  0 ];                   % 参数下限
ub = [+inf  +inf  ];    % 参数上限
x0 = [0.0625 0.09375 0 0]';                                                                                                                                          
yexp = DATA1(:,2:5);                  % yexp: 实验数据[x1x2x3x4]
% 使用函数fmincon()进行参数估计
[k,fval,flag] = fmincon(@ObjFunc4Fmincon,k0,[],[],[],[],lb,ub,[],[],x0,yexp);
fprintf('\n使用函数fmincon()估计得到的参数值为:\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;


% 使用函数lsqnonlin()进行参数估计
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
Output


% 以函数fmincon()估计得到的结果为初值,使用函数lsqnonlin()进行参数估计
k0 = k_fmincon;
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n以fmincon()的结果为初值,使用函数lsqnonlin()估计得到的参数值为:\n')
Output




% ------------------------------------------------------------------
function f = ObjFunc4Fmincon(k,x0,yexp)
tspan = [1 4 7 10 30 60 90];
[t x] = ode45(@KineticEqs,tspan,x0,[],k);   
y(:,1) = x(:,1);
y(:,2:4) = x(:,2:4);
f = sum((y(:,1)-yexp(:,1)).^2) + sum((y(:,2)-yexp(:,2)).^2)   ...
    + sum((y(:,3)-yexp(:,3)).^2) + sum((y(:,4)-yexp(:,4)).^2);


% ------------------------------------------------------------------
function f = ObjFunc4LNL(k,x0,yexp)
tspan = [1 4 7 10 30 60 90];
[t x] = ode45(@KineticEqs,tspan,x0,[],k);   
y(:,1) = x(:,1);
y(:,2:4) = x(:,2:4);
f1 = y(:,1) - yexp(:,1);
f2 = y(:,2) - yexp(:,2);
f3 = y(:,3) - yexp(:,3);
f4 = y(:,4) - yexp(:,4);
f = [f1; f2; f3; f4];


% ------------------------------------------------------------------
function dxdt = KineticEqs(t,x,k)
dxdt =1.17855*(1.6649E-05^2)*(k(1)*x(1)*x(2)-k(2)*x(3)*x(4));
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


联系客服 关注微信 下载APP 返回顶部 返回列表