MATLAB使用ode45达到的最大递归限制

时间:2015-04-10 22:53:58

标签: matlab recursion

以下代码无法正常运行,因为ode45达到其最大递归限制有人知道原因吗?我是matlab的新手。

   function hw8 = HW8(~,t,x)
x = [0,0]
Tbar = [294.4266 429.9139 582.6765]
CAbar = [.9422 .7661 .5675]
DHp=-1000;
k0tau=10.;
Ep=1500;
Chi=0.3;
Tc=250;
Cai=0;
Ca=x(1);
T=x(2);
r=k0tau*exp(-Ep/T)*Ca;
dCa = (Cai-Ca)-r;
dT = -(1+Chi)*(T-Tc)+DHp*r;
hw8 = [dCa;dT]

[t,x] = ode45(HW8,[0 1],[.1 250])

1 个答案:

答案 0 :(得分:2)

因为HW8作为ode45的参数之一,所以在执行ode45之前调用该函数并创建无限递归:

  1. 执行HW8
  2. ode45的第一个参数是对HW8
  3. 的函数调用
  4. 执行HW8
  5. ode45的第一个参数是对HW8
  6. 的函数调用
  7. 执行HW8
  8. ode45的第一个论点......( ad infinitum
  9. 这是堆栈的本质,实际上是一个特性,因为第一个参数函数调用可以返回一个句柄以供ode45使用。但不是在这种情况下,因为它是无限递归,没有被检测到。

    解决方法是将调用ode45的函数与计算赋予ode45的右侧句柄的函数分开:

    function [t,x] = HW8()
    
        [t,x] = ode45(@(t,x) rhs(t,x),[0 1],[.1 250]);
    
    end
    
    function dxdt = rhs(~,x)
        Tbar = [294.4266 429.9139 582.6765];
        CAbar = [.9422 .7661 .5675];
        DHp=-1000;
        k0tau=10.;
        Ep=1500;
        Chi=0.3;
        Tc=250;
        Cai=0;
        Ca=x(1);
        T=x(2);
        r=k0tau*exp(-Ep/T)*Ca;
        dCa = (Cai-Ca)-r;
        dT = -(1+Chi)*(T-Tc)+DHp*r;
        dxdt = [dCa;dT];
    end