Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Matlab求解微分方程_Matlab_Ode_Ode45 - Fatal编程技术网

用Matlab求解微分方程

用Matlab求解微分方程,matlab,ode,ode45,Matlab,Ode,Ode45,我需要同时解这两个微分方程 dr^3/dt=(-3*D*Cs)/(ρ*r0^2 )*r*(1-C) dC/dt=((D*4π*r0*N*(1-C)*r)-(Af*C))/V 注:dr^3/dt是r^3对t的导数 这两个方程类似于微悬浮液溶解过程中颗粒半径(r)和浓度(C)随时间的变化及其在血液中的同时吸收。当固体溶解时,预计会发生的情况是,半径r将减小,浓度C将增加,并最终达到稳定(即达到平衡),因为溶解固体通过该Af*C项(其中Af是某种吸收速率常数)被移到血液中。这些方程式来自于我试图复

我需要同时解这两个微分方程

dr^3/dt=(-3*D*Cs)/(ρ*r0^2 )*r*(1-C)

dC/dt=((D*4π*r0*N*(1-C)*r)-(Af*C))/V
注:dr^3/dt是r^3对t的导数

这两个方程类似于微悬浮液溶解过程中颗粒半径(r)和浓度(C)随时间的变化及其在血液中的同时吸收。当固体溶解时,预计会发生的情况是,半径r将减小,浓度C将增加,并最终达到稳定(即达到平衡),因为溶解固体通过该Af*C项(其中Af是某种吸收速率常数)被移到血液中。这些方程式来自于我试图复制的这篇文章:--C随t的变化应该如图3所示(DCU示例)

我做了简化:dr^3/dt=3r^2*(dr/dt)并将方程的两边除以3r^2。颂歌变成:

function dydt=odefcnNY_v3(t,y,D,Cs,rho,r0,N,V,Af)
dydt=zeros(2,1);
dydt(1)=((-D*Cs)/(rho*r0^2*y(1)))*(1-y(2)); % dr*/dt
dydt(2)=(D*4*pi*N*r0*(1-y(2))*y(1)-(Af*y(2)))/V; % dC*/dt
end
是本文中使用的术语,是“标准化”半径和浓度

r*=r/r0 and C*=C/Cs
其中:

  • r=粒子半径(随时间变化,用dydt(1)表示)
  • r0=初始粒子半径
  • C=溶解固体的浓度(随时间变化,用dydt(2)表示)
  • Cs=饱和溶解度
代码的其余部分如下。根据作者对论文中使用的值的反馈进行更新,并将初始值修正为y0=[1 0]

我第一次尝试ode45,但代码运行时间很长,最终我出现了一些错误。然后我尝试了ode113,得到了下面的错误

Warning: Failure at t=2.112013e+00.  Unable to meet integration tolerances without reducing the step size below the smallest value allowed (7.105427e-15) at time t.
更新:为解决奇异性问题而更新的函数代码:

结果

模型的机械背景

dr/dt的推导

dC/dt的推导

模型假设


在上面,您将看到显示这些方程式推导的幻灯片。他们假设在Noyes-Whitney溶解速率方程中,dM/dt=(为原始形式的半径方程)

d(r^3)/dt = -3K*(r^3)^(1/3)*(1-C)
还是功率降低了一个

dr/dt = -K/r*(1-C)  <==> d(r^2)/dt = -2K*(1-C)
其中,符号函数可以用连续近似代替,如

x/(eps+abs(x)), x/max(eps,abs(x)), tanh(x/eps), ...
或者在简化形式中,奇点可以缓和为

dr/dt = -K*(1-C) * r/(eps^2+r^2)
或者还有其他变化

dr/dt = -K*(1-C) * 2*r/(max(eps^2,r^2)+r^2)

应用于此给出的具体案例(使用python而不是matlab)

def odefcnNY(t,y,D,Cs,rho,r0,N,V,Af):
r、 C=y;
drdt=(-D*Cs)/(rho*r0**2)*(1-C)*r/(1e-6+r**2);#dr*/dt
dCdt=(D*4*pi*N*r0*(1-C)*r-(Af*C))/V;#dC*/dt
返回[drdt,dCdt];
考虑到r=0时的近似奇异性,采用隐式方法

D=8.3658e-10#m2/s
rho=1300#kg/m3
r0=10.1e-6;#m dv50
Cs=0.0016;#kg/m3
V=1.5e-6;#m3
W=9e-6;#kg
N=W/(4/3*pi*r0^3*rho);
Af=0.7e-6/60;#m3/s
tspan=[0,24*3600];#24小时内秒
y0=[1.0,0.0];#相对半径从满开始,1.0
sol=solve_ivp(λt,y:odefcnNY(t,y,D,Cs,rho,r0,Af,N,V),tspan,y0,method=“Radau”,atol=1e-14);
t=sol.t;r,C=sol.y;
然后生成解决方案图


现在有了修正的参数,它看起来很接近公布的图表。

原始形式的半径方程

d(r^3)/dt = -3K*(r^3)^(1/3)*(1-C)
还是功率降低了一个

dr/dt = -K/r*(1-C)  <==> d(r^2)/dt = -2K*(1-C)
其中,符号函数可以用连续近似代替,如

x/(eps+abs(x)), x/max(eps,abs(x)), tanh(x/eps), ...
或者在简化形式中,奇点可以缓和为

dr/dt = -K*(1-C) * r/(eps^2+r^2)
或者还有其他变化

dr/dt = -K*(1-C) * 2*r/(max(eps^2,r^2)+r^2)

应用于此给出的具体案例(使用python而不是matlab)

def odefcnNY(t,y,D,Cs,rho,r0,N,V,Af):
r、 C=y;
drdt=(-D*Cs)/(rho*r0**2)*(1-C)*r/(1e-6+r**2);#dr*/dt
dCdt=(D*4*pi*N*r0*(1-C)*r-(Af*C))/V;#dC*/dt
返回[drdt,dCdt];
考虑到r=0时的近似奇异性,采用隐式方法

D=8.3658e-10#m2/s
rho=1300#kg/m3
r0=10.1e-6;#m dv50
Cs=0.0016;#kg/m3
V=1.5e-6;#m3
W=9e-6;#kg
N=W/(4/3*pi*r0^3*rho);
Af=0.7e-6/60;#m3/s
tspan=[0,24*3600];#24小时内秒
y0=[1.0,0.0];#相对半径从满开始,1.0
sol=solve_ivp(λt,y:odefcnNY(t,y,D,Cs,rho,r0,Af,N,V),tspan,y0,method=“Radau”,atol=1e-14);
t=sol.t;r,C=sol.y;
然后生成解决方案图


现在有了修正的参数,它看起来与公布的图表很接近。

d(r^3)=3*r^2*dr
,仔细检查方程是否在物理上正确并且正确执行。谢谢-我执行了建议。现在添加的第二个方程中缺少了Af*C项。我做了简化:dr^3/dt=3*r^2*(dr/dt)通过将方程两边除以3*r^2,dydt(1)现在变成:
dydt(1)=(-D*Cs)/(rho*r0^2*y(1))*(1-y(2));%dr*/dt
这是否正确?代码现在正在运行,似乎需要一段时间!是的,这看起来是正确的。对于可能是僵硬的ODE,请使用一种隐式方法,如
ode113
,该方法也会根据僵硬程度调整方法的顺序。这可能会增加步长,从而加快工作速度。我遇到了以下错误:使用horzca时出错t请求的2x528701600(7.9GB)数组超过了最大数组大小首选项。创建大于此限制的数组可能需要很长时间,并导致MATLAB无响应。有关详细信息,请参阅数组大小限制或首选项面板。ode45(第484行)中的错误yout=[yout,零(neq,块,数据类型)];谢谢-我已经执行了你提出的建议。
d(r^3)=3*r^2*dr
,仔细检查方程是否在物理上正确且正确执行。谢谢-我执行了建议。现在添加的第二个方程中缺少Af*C项。我做了简化:dr^3/dt=3*r^2*(dr/dt)通过将方程两边除以3*r^2,dydt(1)现在变成:
dydt(1)=((-D*Cs)/(rho*r0^2*y(1))*(1-y(2));%dr*/dt
这是正确的吗?代码现在正在运行,似乎需要一段时间!是的,这看起来是正确的。对于可能很僵硬的ODE,使用一种隐式方法,例如
ode113