以下代码无法正常运行,因为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])
答案 0 :(得分:2)
因为HW8
作为ode45
的参数之一,所以在执行ode45
之前调用该函数并创建无限递归:
HW8
。ode45
的第一个参数是对HW8
HW8
。ode45
的第一个参数是对HW8
HW8
。ode45
的第一个论点......( ad infinitum )这是堆栈的本质,实际上是一个特性,因为第一个参数函数调用可以返回一个句柄以供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