首页 文章

matlab for ode求解器中的循环

提问于
浏览
0

我正在使用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循环?任何帮助将受到高度赞赏 . 谢谢,Mamun

1 回答

  • 2

    定义要作为函数的附加输入参数修改的参数:

    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, ...您的最后一行,可能是反应向量与化学计量矩阵的乘积 .

相关问题