[未答复] GA辨识微分方程参数问题

[复制链接]
ybw1997 发表于 5 天前
本帖最后由 ybw1997 于 2021-1-14 09:37 编辑

clear;
clc;
%ga
options = optimoptions('ga','MaxGenerations',200,'MaxStallGenerations',50,...
     'MaxStallTime',inf,'FunctionTolerance',1e-12,'ConstraintTolerance',1e-6);
[a0,fval,exitflag,output]=ga(@my_fitnessfun,15,[],[],[],[],...
    [],[],[],options)


运行后报错:

警告: 在 t=2.888835e+00 处失败。在时间 t 处,步长大小必须降至所允许的最小值(7.105427e-15)以下,才能达到积分容差要求。
位置 1 处的索引超出数组边界(不能超出 1)。

出错 my_fitnessfun (line 25)
    ff(l)=((ycal(l,1)-Sreal(l))/max(Sreal))^2 + ...

出错 createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});

出错 makeState (line 52)
            firstMemberScore = FitnessFcn(state.Population(initScoreProvided+1,:));

出错 gaunc (line 40)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);

出错 ga (line 398)
            [x,fval,exitFlag,output,population,scores] = gaunc(FitnessFcn,nvars, ...

原因:
    Failure in initial user-supplied fitness function evaluation. GA cannot continue.





以下是适应度函数
function [Sfit] = my_fitnessfun(a)

% t取值区间
tspan=[0 10 20 30 40 50 60 70 80 90 100 110 120 130];

% 实验真实值
Sreal=[28.5 27.1 23.2 20.0 16.6 14.3 11.5 9.2 7.9 6.9 5.2 3.6 2.0 1.5];
Ereal=[0 0.24 1.06 2.20 3.10 4.06 5.26 6.31 7.23 7.82 7.94 8.09 8.18 8.20];
Xreal=[0.14 0.24 0.54 1.05 1.34 1.64 1.97 2.31 2.82 3.04 3.13 3.22 3.12 3.09];
Greal=[0 0.423 0.184 0.174 0.153 0.146 0.136 0.133 0.127 0.123 0.117 0.108 0.103 0.095];

% 初始值
S0(1)=Sreal(1);
S0(2)=Ereal(1);
S0(3)=Xreal(1);
S0(4)=Greal(1);

% 解微分方程,引入微分方程函数@myfun
options = odeset('RelTol',1e-3,'AbsTol',1e-6);
[t,ycal]=ode15s(@myfunn,tspan,S0,options,a);

% minf(l)
n=length(tspan);
for l=1:n
    ff(l)=((ycal(l,1)-Sreal(l))/max(Sreal))^2 + ...
        ((ycal(l,2)-Ereal(l))/max(Ereal))^2 + ...
        ((ycal(l,3)-Xreal(l))/max(Xreal))^2 + ...
        ((ycal(l,4)-Greal(l))/max(Greal))^2;
end
Sfit=sum(ff(l));
end
以下是微分方程
function [dydt] = myfunn(t,y,a)

%18个参数
Kh = a(1);%速率常数
Km = a(2);%米氏常数
KG = a(3);%葡萄糖抑制常数
Kstarch = a(4);%淀粉抑制常数
qm = a(5);%最大产率
Ksp = a(6);%饱和生产常数
Kssp = a(7);%底物抑制常数
Kex = a(8);%产物抑制常数
mium= a(9);%最大比生长速率
Ks = a(10);%饱和生长常数
Kss = a(11);%底物抑制常数
Kxx = a(12);%产物抑制常数
Kd = a(13);%细胞死亡常数
YXG = a(14);%生物量生长产率系数
YEG = a(15);%乙醇产率系数
% beta = a(16);%酶降解率
% Kenz = a(17);%酶抑制常数
% Enzm = a(18);%最大酶浓度

%S,E,X,G,Enz分别为淀粉,乙醇,细胞,酶的浓度
S=y(1);
E=y(2);
X=y(3);
G=y(4);
% Enz=y(5);
Enz=1;

dydt = zeros(4,1);
%淀粉利用
dydt(1) = -Kh*Enz*S/(Km*(1 + G/KG) + S^2/Kstarch + S);

%乙醇动力学
dydt(2) = qm*G*X*exp(-E/Kex)/(Ksp + G + G^2/Kssp);

%细胞生长动力学
dydt(3) = mium*G*exp(-E/Kxx)*X/(Ks + G + G^2/Kss) - Kd*X;

%葡萄糖利用
dydt(4) = 1.111*Kh*Enz/(Km*(1 + G/KG) + S^2/Kstarch + S) - ...
    (1/YXG)*mium*G*exp(-E/Kxx)/(Ks + G + G^2/Kss) - ...
    (1/YEG)*qm*G*X*exp(-E/Kex)/(Ksp + G + G^2/Kssp);

%酶动力学
% dydt(5) = (mium + beta)*Enzm*S/(Kenz + S) - ...
%     (mium*G*exp(-E/Kxx)/(Ks + G + G^2/Kss) + beta)*Enz;
end



真的是弄的我焦头烂额。。。有没有大佬教教我小菜鸟,有偿也可以。。。拜托了





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

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表