MATLAB:atan2打破ode15s

时间:2017-06-03 02:59:35

标签: matlab numerical-integration

我有一个程序运行ode15s几千次,以找到一个特定的解决方案。但是,我收到了许多集成容差错误,如下所示:

"Warning: Failure at t=5.144337e+02. Unable to meet integration tolerances without reducing the step size below the smallest value allowed (1.818989e-12) at time t."

此类警告会导致程序急剧减速,有时甚至会完全停止。以下是一些重新生成错误的测试代码:

%Simulation constants
G = 6.672e-11; %Gravitational constant
M = 6.39e23; %Mass of Mars (kg)
g = 9.81; %Gravitational acceleration on Earth (m/s^2);
T1 = 845000/3; %Total engine thrust, 1 engine (N)
Isp = 282; %Engine specific impulse (s)
mdot1 = T1/(g*Isp); %Engine mass flow rate (kg/s)
xinit_on2 = [72368.8347685214;
            3384891.40103322;
            -598.36623436025;
            -1440.49702235844;
            16330.430678033]
tspan_on2 = [436.600093957202, 520.311296453027];
[t3,x3] = ode15s(@(t,x) engine_on_2(t, x, G, g, M, Isp, T1), tspan_on2, xinit_on2)

其中函数engine_on_2包含模拟火箭下降的ODE系统,由下式给出,

function xdot = engine_on_2(t, x, G, g, M, Isp, T1)
gamma = atan2(x(4),x(3)); %flight-path angle
xdot = [x(3); %xdot1: x-velocity
        x(4); %xdot2: y-velocity
        -(G*M*x(1))/((x(1)^2+x(2)^2)^(3/2))-(T1/x(5))*cos(gamma); %xdot3: x-acceleration
        -(G*M*x(2))/((x(1)^2+x(2)^2)^(3/2))-(T1/x(5))*sin(gamma); %xdot4: y-acceleration
        -T1/(g*Isp)]; %xdot5: engine mass flow rate
end

经过一些测试后,由于在gamma = atan2(x(4),x(3))中使用atan2函数来计算火箭的飞行路径角度,似乎我得到了积分公差警告。如果我将atan2更改为另一个函数(例如cos或sin),我将不再获得任何积分容差警告(尽管由于这种改变,我的解决方案显然是不正确的)。因此,我想知道我是否错误地使用atan2,或者是否有办法以不同方式实现它,以便我不再获得集成容差错误。此外,我可能是不正确的,并且除了atan2之外还有其他原因导致错误吗?

1 个答案:

答案 0 :(得分:0)

使用odeset函数创建一个选项结构,然后将其传递给解算器。可以在ODE求解器中调整RelTolAbsTol以消除您的错误。我能够使用此添加运行您的代码而没有任何错误:

options = odeset('RelTol',1e-13,'AbsTol',1e-20)

[t3,x3] = ode15s(@(t,x) engine_on_2(t, x, G, g, M, Isp, T1), tspan_on2, xinit_on2, options)

请将options作为第4个输入参数传递给ODE求解器。请注意RelTol最大值超过1e-13,但希望这对您的应用程序来说很好。你也可以尝试任何其他ODE解算器,它可以摆脱你的错误,但从我的游戏ode15s似乎很快。