在Matlab中使用ode45实现弹丸运动

在Matlab中使用ode45实现弹丸运动,matlab,ode,projectile,Matlab,Ode,Projectile,我试图在Matlab中用阻力来模拟弹丸的运动。一切都很完美……除了我不知道如何在“子弹”落地时让它停下来 我最初尝试了一个迭代循环,定义了一个数据数组,并在y值为负值时清空该数组的单元格……不幸的是,ode解算器不太喜欢这样 这是我的密码 function [ time , x_position , y_position ] = shell_flight_simulator(m,D,Ve,Cd,ElAng) rho=1.2; % kg/m^3 g=9.84; % accelerat

我试图在Matlab中用阻力来模拟弹丸的运动。一切都很完美……除了我不知道如何在“子弹”落地时让它停下来

我最初尝试了一个迭代循环,定义了一个数据数组,并在y值为负值时清空该数组的单元格……不幸的是,ode解算器不太喜欢这样

这是我的密码

      function [ time , x_position , y_position ] = shell_flight_simulator(m,D,Ve,Cd,ElAng)

rho=1.2; % kg/m^3
g=9.84; % acceleration due to gravity
A = pi.*(D./2).^2; % m^2, shells cross-sectional area (area of circle)

    function [lookfor,stop,direction] = linevent(t,y);
        % stop projectile when it hits the ground
        lookfor = y(1); %Sets this to 0
        stop = 1; %Stop when event is located
        direction = -1; %Specify downward direction

        options = odeset('Events',@event_function); % allows me to stop integration at an event
        function fvec = projectile_forces(x,y)
            vx=y(2);
            vy=y(4);
            v=sqrt(vx^2+vy^2);

            Fd=1/2 * rho * v^2 * Cd * A;

            fvec(1) = y(2);
            fvec(2) = -Fd*vx/v/m;
            fvec(3) = y(4);
            fvec(4) = -g -Fd*vy/v/m;
            fvec=fvec.';
        end

        tspan=[0, 90]; % time interval of interest

        y0(1)=0;   % initial x position
        y0(2)=Ve*cos(ElAng); % vx
        y0(3)=0;   % initial y position
        y0(4)=Ve*sin(ElAng); % vy

        % using matlab solver
        [t,ysol] = ode45(@projectile_forces, tspan, y0);
    end
end
x =  ysol(:,1);
vx = ysol(:,2);
y =  ysol(:,3);
vy = ysol(:,4);


plot(x,y, 'r-');
xlabel('X Position (m)');
ylabel('Y Position (m)');
title ('Position Over Time');

end

我以为这会定义一个事件,当y=0时,停止抛射,但它没有做任何事情。我做错了什么?

当试图找到ODE的解决方案达到某个级别的时间时,您应该使用
Events函数-请参阅演示,了解当解决方案的一个组件达到0时停止解决方案过程的示例。

谢谢,我查看了该示例并进行了尝试。不幸的是,我还是没能得到它。我用我的新尝试更新了我的问题。你不应该在events函数中使用
lookfor=y(3)
作为条件吗?y(3)代表y轴,当弹丸撞击地面时,y轴归零…哦!哇,真是个愚蠢的错误。谢谢