⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biokineticsest.m

📁 本代码为黄华江编著《实用化工计算机模拟—MATLAB在化学工程中的应用》的配套车程序
💻 M
字号:
function BioKineticsEst
% 生化反应动力学参数估计
%
%   Author: HUANG Huajiang
%   Copyright 2003 UNILAB Research Center, 
%   East China University of Science and Technology, Shanghai, PRC
%   $Revision: 1.0 $  $Date: 2003/07/10 $
%
%   [Ref]: J. R. Backhurst and J. H. Harker, Chemical Engineering Vol. 5, 
%   2nd ed., Butterworth-heinemann, 1997, 世界图书出版公司1999年重印

clear all
clc
global Y kd mum Ks D X0
% Experimental data:
%           F (l/h)  S (mg/l) X (mg/l)
ExpData = [ 0.7900   36.9000  487.0000
            1.0300   49.1000  490.0000
            1.3100   64.4000  489.0000
            1.7800   93.4000  482.0000
            2.3900  138.8000  466.0000
            2.6800  164.2000  465.0000  ];
V = 9.8;    % liter
S0 = 1200;  % limiting substrate concentration
X0 = 0;
F = ExpData(:,1);
S = ExpData(:,2);
X = ExpData(:,3);
D = F/V

% 用多变量线性回归方法估计动力学参数
% 对方程(5)进行线性回归
y = X./D./(S0 - S);
XX = [ones(size(y)) 1./S];
[a,aint] = regress(y,XX,0.05); 
Ks = a(2)/a(1)
Y2mum = a(1);
% 对方程(6)进行线性回归
y = (S0 - S)./X;
XX = [ones(size(y)) 1./D];
[b,bint] = regress(y,XX,0.05); 
Y = 1/b(1)
kd = Y*b(2)
mum = Y/a(1)
fprintf('\nEstimated Parameters by Regress():\n')
fprintf('\tY = %.3f\n',Y)
fprintf('\tkd = %.3f\n',kd)
fprintf('\tmum = %.2f\n',mum)
fprintf('\tKs = %.0f\n',Ks)

% 用lsqnonlin()--求解非线性最小二乘法(非线性数据拟合)问题
lb = [0  0  0  0];
beta0 = [Y, kd, mum, Ks];
[beta,resnorm,resid,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFun,beta0,lb,[],[],S,X,D,S0,X0);
ci = nlparci(beta,resid,jacobian);

% 参数辨识结果
fprintf('\nEstimated Parameters by Lsqnonlin():\n')
fprintf('\tY = %.3f ± %.3f\n',beta(1),ci(1,2)-beta(1))
fprintf('\tkd = %.3f ± %.3f\n',beta(2),ci(2,2)-beta(2))
fprintf('\tmum = %.2f ± %.2f\n',beta(3),ci(3,2)-beta(3))
fprintf('\tKs = %.0f ± %.0f\n',beta(4),ci(4,2)-beta(4))
fprintf('  The sum of the squares is: %.1e\n\n',sum(resid.^2))

% 绘图比较实验值与模拟值
for i=1:length(D)
    x = fsolve(@Eqs,[S(1),X(1)],[],beta(1),beta(2),beta(3),beta(4),D(i),S0,X0);
    Scal(i) = x(1);
    Xcal(i) = x(2);
end
plot(F,S,'o',F,Scal,'*');
xlabel('Feed Flowrate (l/h)')
ylabel('Substrate Conc.(mg/l)')
figure
plot(F,X,'o',F,Xcal,'*');
xlabel('Feed Flowrate (l/h)')
ylabel('Cell Density (mg/l)')

% 残差关于拟合值的残差图
plot(Scal,S'-Scal,'*')
xlabel('底物浓度拟合值, mg/l')
ylabel('底物浓度残差R, mg/l')
refline(0,0)
figure
plot(Xcal,X'-Xcal,'*')
xlabel('干细胞密度拟合值, mg/l')
ylabel('干细胞密度残差R, mg/l')
refline(0,0)

% ------------------------------------------------------------------
function f = ObjFun(beta,S,X,D,S0,X0)               % 目标函数
Y = beta(1);
kd = beta(2);
mum = beta(3);
Ks = beta(4);
for i=1:length(D)
    x = fsolve(@Eqs,[S(1),X(1)],[],Y,kd,mum,Ks,D(i),S0,X0);
    Scal(i) = x(1);
    Xcal(i) = x(2);
end
f = [S - Scal'; X - Xcal'];

% ------------------------------------------------------------------
function f = Eqs(x,Y,kd,mum,Ks,D,S0,X0)             % 模型方程
S = x(1);
X = x(2);
tmp = mum*S*X/(Ks + S);
f1 = D*(X - X0) - tmp + kd*X;
f2 = D*Y*(S0 - S) - tmp;
f = [f1; f2];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -