ode 求解器中的 matlab for 循环
matlab for loop within ode solver
我正在使用 ODE 求解器来求解我的 ODE 系统。现在我还想通过改变它们来计算各种参数的灵敏度。
我的基本 ODE 求解器程序类似于:
函数:
function F = ODE_site(t,y)
%%Parameter block
k1f=1e8;
k1b=1e5; %%and so on
%%Elementary rate block
r1=k1f*y(1)-k1b*P*y(5);
and so on
%%Mass balance block
F=[ r1-r5-r78+r86 ;
and so on ];
%% End of function
主要的 ODE 求解器如下所示:
optode = odeset('NonNegative',1:41,'Abstol',1E-20,'RelTol',1E-20);
y0=zeros(41,1);
y0(41) = 1;
[t,y]=ode15s(@ODE_site,[0,50000000000],y0,optode);
%% Plus some other lines to plot the solution
%% End of ODE solver
现在,我想在主求解器中引入一个 for 循环,但问题是如果我在主求解器中使用 for 循环,它无法将命令传递给函数。我尝试使用 global 将变量分配给整个环境,但它没有用。如何为 ODE 求解器代码和函数分配 for 循环?
任何帮助将不胜感激。
谢谢,
马蒙
定义要修改为函数的附加输入参数的参数:
function F = ODE_site(t,y,param)
%%Parameter block
k1f=param(1);
k1b=param(2); %%and so on
%%Elementary rate block
r1=k1f*y(1)-k1b*P*y(5);
and so on
%%Mass balance block
F=[ r1-r5-r78+r86 ;
and so on ];
%% End of function
您可以在优化后的ode15()中将参数交给您的函数参数:
optode = odeset('NonNegative',1:41,'Abstol',1E-20,'RelTol',1E-20);
y0=zeros(41,1);
y0(41) = 1;
para=[1e5, 1e8]
[t,y]=ode15s(@ODE_site,[0,50000000000],y0,optode,para);
两个注意事项:
*) 代码未经测试。由于您的示例不可执行,因此我也不想制作 运行 示例。
*) 看起来你在解决化学反应动力学问题。您很可能可以通过使用矩阵和向量运算进一步优化您的代码。
因此,与其使用单独的变量 r1, r2, r3,
.. 你可以将它存储在一个向量中 r(1), r(2), r(3),
...
你的最后一行,可以写成反应向量与化学计量矩阵的乘积。
我正在使用 ODE 求解器来求解我的 ODE 系统。现在我还想通过改变它们来计算各种参数的灵敏度。 我的基本 ODE 求解器程序类似于: 函数:
function F = ODE_site(t,y)
%%Parameter block
k1f=1e8;
k1b=1e5; %%and so on
%%Elementary rate block
r1=k1f*y(1)-k1b*P*y(5);
and so on
%%Mass balance block
F=[ r1-r5-r78+r86 ;
and so on ];
%% End of function
主要的 ODE 求解器如下所示:
optode = odeset('NonNegative',1:41,'Abstol',1E-20,'RelTol',1E-20);
y0=zeros(41,1);
y0(41) = 1;
[t,y]=ode15s(@ODE_site,[0,50000000000],y0,optode);
%% Plus some other lines to plot the solution
%% End of ODE solver
现在,我想在主求解器中引入一个 for 循环,但问题是如果我在主求解器中使用 for 循环,它无法将命令传递给函数。我尝试使用 global 将变量分配给整个环境,但它没有用。如何为 ODE 求解器代码和函数分配 for 循环? 任何帮助将不胜感激。 谢谢, 马蒙
定义要修改为函数的附加输入参数的参数:
function F = ODE_site(t,y,param)
%%Parameter block
k1f=param(1);
k1b=param(2); %%and so on
%%Elementary rate block
r1=k1f*y(1)-k1b*P*y(5);
and so on
%%Mass balance block
F=[ r1-r5-r78+r86 ;
and so on ];
%% End of function
您可以在优化后的ode15()中将参数交给您的函数参数:
optode = odeset('NonNegative',1:41,'Abstol',1E-20,'RelTol',1E-20);
y0=zeros(41,1);
y0(41) = 1;
para=[1e5, 1e8]
[t,y]=ode15s(@ODE_site,[0,50000000000],y0,optode,para);
两个注意事项:
*) 代码未经测试。由于您的示例不可执行,因此我也不想制作 运行 示例。
*) 看起来你在解决化学反应动力学问题。您很可能可以通过使用矩阵和向量运算进一步优化您的代码。
因此,与其使用单独的变量 r1, r2, r3,
.. 你可以将它存储在一个向量中 r(1), r(2), r(3),
...
你的最后一行,可以写成反应向量与化学计量矩阵的乘积。