2015-04-10 2 views
0

Следующий код не будет работать должным образом, так как ode45 достигает максимального предела рекурсии, кто-нибудь знает, почему? Я очень новичок в Matlab.MATLAB Максимальный предел рекурсии, достигнутый с ode45

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]) 

ответ

2

Потому что у вас есть HW8 в качестве одного из аргументов ode45, функция вызывается перед ode45 выполняется и создает бесконечную рекурсию:

  1. Execute HW8.
  2. ode45 «S первый аргумент является вызов функции HW8
  3. Выполнить HW8.
  4. ode45 «S первый аргумент является вызов функции HW8
  5. Выполнить HW8.
  6. ode45 «S первый аргумент ... (бесконечности)

Это природа штабеля и на самом деле функция так как первый вызов функции аргумент может возвратить дескриптор для использования с 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 
Смежные вопросы