ode45达到MATLAB最大递归极限

ode45达到MATLAB最大递归极限,matlab,recursion,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; d

以下代码将无法正常运行,因为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])

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

  • 执行
    HW8
  • ode45
    的第一个参数是对
    HW8
  • 执行
    HW8
  • ode45
    的第一个参数是对
    HW8
  • 执行
    HW8
  • ode45
    的第一个参数。。。(无限)
  • 这是堆栈的本质,实际上是一个特性,因为第一个参数函数调用可以返回一个句柄,用于
    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