Estoy tratando de ajustar el siguiente sistema ODE que describe la absorción y eliminación de fármacos.
Si $A_e$ es la cantidad de fármaco en estado de absorción y $A$ es la cantidad de droga en el cuerpo esto puede ser descrito como:
$$\begin{aligned} {dA_e \over dt} &= -k_a A_e\\ {dA \over dt} &= k_a A_e - k A\end{aligned}$$
Estoy tratando de estimar los valores de los parámetros la tasa de absorción ( $k_a$ ) y la tasa de eliminación ( $k$ ).
A continuación se muestra el código Matlab escrito para estimar los valores de los parámetros utilizando lsqnolin
. Pero estoy recibiendo avisos de RelTol
se ha aumentado a 2.2E-14
. ¿Puede alguien decirme qué es lo que falla en la forma en que lo he modelado?
Quiero saber como estimar usando un Sistema ODE (Es decir sin escribir la función objetivo como la solución de $A(t)$ ya que el modelo real tiene muchos otros estados)
time=[0.5;1;1.5;2;3;4;5;6;8;12];%time in hours
Drugdata=[0.33;1.23;1.95;2.72;3.51;3.63;3.47;3.22;2.39;1.13];
%parameters estimated:k_a and k
initial=[0.5,0.5];%initial guesses of the estimates
ODEinit=[8.48,Drugdata(1)];%initial values to the ODE.
lb=[0,0];
ub=[100,100];
[fittedVals,resnorm,~,~,~,~,~]=lsqnonlin(@(xEstimate)errorFun(xEstimate,Drugdata,ODEinit,...
time),initial,lb,ub);
fittedValues=model2(fittedVals',time,ODEinit);
close all
figure
h2=scatter(time,Drugdata,20,'b','filled');
hold on
h1=plot(time,fittedValues,'color', 'r');
ylabel('Drug')
xlabel('time')
function err=errorFun(xEstimate,DrugMeas,ODEinit,thours)
Drug_est=model2(xEstimate,thours,ODEinit);%estiamted values of drug using the ODE model
err=DrugMeas-Drug_est;
end
function Drugout= model2(xEstimate,thours,ODEinit)
options = odeset('AbsTol',1e-25,'RelTol',1e-25);
[~,values] = ode45(@(t,y)Equations(t,y),thours,ODEinit,options);
function s=Equations(~,y)
%parameters estimated:k_a, k
k=xEstimate(2);%rate of elimination
ka=xEstimate(1);%rate of drug absorption
s=zeros(2,1);
s(1)=-ka*y(1);%absorption compartment
s(2)=ka*y(1)-k*y(2);%drug
end
Drugout=values(:,2);
end