在 Matlab 中求解微分方程 - 体外溶出度
Solving differential equations in Matlab - In-Vitro Dissolution
我正在尝试解决与此类似的问题:
然而,这次的场景不是将药物注射到皮下组织并随后溶解,而是允许悬浮液溶解在体积为 900 毫升的溶解浴中的更简单的情况。
function dydt=odefcnNY_v12(t,y,D,Cs,rho,r0,N,V)
dydt=zeros(2,1);
dydt(1)=(-D*Cs)/(rho*r0^2)*(1-y(2))*y(1)/(1e-6+y(1)^2); % dr*/dt
dydt(2)=(D*4*pi*N*r0*(1-y(2))*y(1))/V; %dC*/dt
end
即删除了上一个问题的吸收项:
Absorption term: Af*y(2)
化合物也不一样,所以MW、Cs和r0不一样,实验装置也不一样,所以现在改变了W和V。为了允许这些更改,ode113 调用更改为:
MW=336.43; % molecular weight
D=9.916e-5*(MW^-0.4569)*60/600000 %m2/s - [D(cm2/min)=9.916e-5*(MW^-0.4569)*60], divide by 600,000 to convert to m2/s
rho=1300; %kg/m3
r0=9.75e-8; %m dv50
Cs=0.032; %kg/m3
V=0.0009;%m3 900 mL dissolution bath
W=18e-6; %kg 18mg
N=W/((4/3)*pi*r0^3*rho); % particle number
tspan=[0 200*3600]; %s in 200 hours
y0=[1 0];
[t,y]=ode113(@(t,y) odefcnNY_v12(t,y,D,Cs,rho,r0,N,V), tspan, y0);
plot(t/3600,y(:,1),'-o') %plot time in hr, and r*
xlabel('time, hr')
ylabel('r*, (rp/r0)')
legend('DCU')
title ('r*');
plot(t/3600,y(:,1)*r0*1e6); %plot r in microns
xlabel('time, hr');
ylabel('r, microns');
legend('DCU');
title('r');
plot(t/3600,y(:,2),'-') %plot time in hr, and C*
xlabel('time, hr')
ylabel('C* (C/Cs)')
legend('DCU')
title('C*');
目前的问题是这段代码已经运行 3 个小时了,仍然没有完成。现在与上面 link 中的前一个问题有什么不同,这使得它需要这么长时间?
谢谢
我无法真正重现你的问题。我使用 "standard" python 模块 numpy 和 scipy,复制了参数块,
MW=336.43; # molecular weight
D=9.916e-5*(MW**-0.4569)*60/600000 #m2/s - [D(cm2/min)=9.916e-5*(MW^-0.4569)*60], divide by 600,000 to convert to m2/s
rho=1300.; #kg/m3
r0=9.75e-8; #m dv50
Cs=0.032; #kg/m3
V=0.0009;#m3 900 mL dissolution bath
W=18e-6; #kg 18mg
N=W/((4./3)*pi*r0**3*rho); # particle number
Af = 0; # bath is isolated
使用与之前相同的 ODE 函数 post(记住 Af=0
)
def odefcnNY(t,y,D,Cs,rho,r0,N,V,Af):
r,C = y;
drdt = (-D*Cs)/(rho*r0**2)*(1-C) * r/(1e-10+r**2); # dr*/dt
dCdt = (D*4*pi*N*r0*(1-C)*r-(Af*C))/V; # dC*/dt
return [ drdt, dCdt ];
并解决了 ODE
tspan=[0, 1.0]; #1 sec
#tspan=[0, 200*3600]; #s in 200 hours
y0=[1.0, 0.0];
method="Radau"
sol=solve_ivp(lambda t,y: odefcnNY(t,y,D,Cs,rho,r0,N,V,Af), tspan, y0, method=method, atol=1e-8, rtol=1e-11);
t = sol.t; r,C = sol.y;
print(sol.message)
print("C*=",C[-1])
这工作很快,第一秒使用 235 个步骤,然后使用 6 个步骤来覆盖 200 小时剩余时间内的恒定行为。
我只能通过将公差增加到不合理的大值(如 1e-4)来搞砸它,并且只有在缓和中使用的 epsilon 是 1e-12 时。那么当半径为零时的硬转弯太难了,步长控制器陷入了一个循环。这更多是步长控制器粗略实现的错误,在Matlab例程中不应该是这样。
我正在尝试解决与此类似的问题:
然而,这次的场景不是将药物注射到皮下组织并随后溶解,而是允许悬浮液溶解在体积为 900 毫升的溶解浴中的更简单的情况。
function dydt=odefcnNY_v12(t,y,D,Cs,rho,r0,N,V)
dydt=zeros(2,1);
dydt(1)=(-D*Cs)/(rho*r0^2)*(1-y(2))*y(1)/(1e-6+y(1)^2); % dr*/dt
dydt(2)=(D*4*pi*N*r0*(1-y(2))*y(1))/V; %dC*/dt
end
即删除了上一个问题的吸收项:
Absorption term: Af*y(2)
化合物也不一样,所以MW、Cs和r0不一样,实验装置也不一样,所以现在改变了W和V。为了允许这些更改,ode113 调用更改为:
MW=336.43; % molecular weight
D=9.916e-5*(MW^-0.4569)*60/600000 %m2/s - [D(cm2/min)=9.916e-5*(MW^-0.4569)*60], divide by 600,000 to convert to m2/s
rho=1300; %kg/m3
r0=9.75e-8; %m dv50
Cs=0.032; %kg/m3
V=0.0009;%m3 900 mL dissolution bath
W=18e-6; %kg 18mg
N=W/((4/3)*pi*r0^3*rho); % particle number
tspan=[0 200*3600]; %s in 200 hours
y0=[1 0];
[t,y]=ode113(@(t,y) odefcnNY_v12(t,y,D,Cs,rho,r0,N,V), tspan, y0);
plot(t/3600,y(:,1),'-o') %plot time in hr, and r*
xlabel('time, hr')
ylabel('r*, (rp/r0)')
legend('DCU')
title ('r*');
plot(t/3600,y(:,1)*r0*1e6); %plot r in microns
xlabel('time, hr');
ylabel('r, microns');
legend('DCU');
title('r');
plot(t/3600,y(:,2),'-') %plot time in hr, and C*
xlabel('time, hr')
ylabel('C* (C/Cs)')
legend('DCU')
title('C*');
目前的问题是这段代码已经运行 3 个小时了,仍然没有完成。现在与上面 link 中的前一个问题有什么不同,这使得它需要这么长时间?
谢谢
我无法真正重现你的问题。我使用 "standard" python 模块 numpy 和 scipy,复制了参数块,
MW=336.43; # molecular weight
D=9.916e-5*(MW**-0.4569)*60/600000 #m2/s - [D(cm2/min)=9.916e-5*(MW^-0.4569)*60], divide by 600,000 to convert to m2/s
rho=1300.; #kg/m3
r0=9.75e-8; #m dv50
Cs=0.032; #kg/m3
V=0.0009;#m3 900 mL dissolution bath
W=18e-6; #kg 18mg
N=W/((4./3)*pi*r0**3*rho); # particle number
Af = 0; # bath is isolated
使用与之前相同的 ODE 函数 post(记住 Af=0
)
def odefcnNY(t,y,D,Cs,rho,r0,N,V,Af):
r,C = y;
drdt = (-D*Cs)/(rho*r0**2)*(1-C) * r/(1e-10+r**2); # dr*/dt
dCdt = (D*4*pi*N*r0*(1-C)*r-(Af*C))/V; # dC*/dt
return [ drdt, dCdt ];
并解决了 ODE
tspan=[0, 1.0]; #1 sec
#tspan=[0, 200*3600]; #s in 200 hours
y0=[1.0, 0.0];
method="Radau"
sol=solve_ivp(lambda t,y: odefcnNY(t,y,D,Cs,rho,r0,N,V,Af), tspan, y0, method=method, atol=1e-8, rtol=1e-11);
t = sol.t; r,C = sol.y;
print(sol.message)
print("C*=",C[-1])
这工作很快,第一秒使用 235 个步骤,然后使用 6 个步骤来覆盖 200 小时剩余时间内的恒定行为。
我只能通过将公差增加到不合理的大值(如 1e-4)来搞砸它,并且只有在缓和中使用的 epsilon 是 1e-12 时。那么当半径为零时的硬转弯太难了,步长控制器陷入了一个循环。这更多是步长控制器粗略实现的错误,在Matlab例程中不应该是这样。