% 参数设置
T = 300; % 运动时间  
Tt = 0.05; % 仿真时间间隔
P = [0,0]; % 初始发射位置
M = 20; % 炮弹质量
C = 0.45; % 空气阻力系数
rou = 1.29; % 空气密度
D = 0.12; % 炮弹直径
S = pi*D^2/4; % 炮弹迎风面积
k = 0.5*C*rou*S/M; % 空气阻力加速度总系数
g = 9.8; % 重力加速度

% 已知落点距离
dist = 1670;

% 初始化变量
foundMatch = false;
lastTraj = [];
velocities = [];

% 遍历发射角度  
for angle = 0:0.001:20

    V = 100*sqrt(2)*[cos(angle*pi/180), sin(angle*pi/180)]; % 计算飞行速度
    P = [0,0];

    % 存储轨迹点
    traj = []; 
    
    % 存储速度变化
    velocities = [];
    
    for t = 0:Tt:T
        if P(2) < 0
            break;
        end

        af = -k*[V(1)^2, V(2)^2];
        a = af + [0, -g];

        V = V + a*Tt;
        P = P + V*Tt;
        
        % 存储轨迹点
        traj = [traj; P]; 
        
        % 存储速度变化
        velocities = [velocities; norm(V)];
    end

    if abs(P(1) - dist) < 1
        % 绘制轨迹 
        figure;
        plot(traj(:,1), traj(:,2), '*');
        axis equal; % 设置坐标轴间距相同
        title('弹道轨迹');
        xlabel('距离/m');
        ylabel('高度/m');
        
        % 绘制速度变化曲线
        figure;
        time = 0:Tt:T;
        plot(time(1:length(velocities)), velocities);
        title('炮弹速度变化');
        xlabel('时间/s');
        ylabel('速度/m/s');
        
        foundMatch = true;
        break
    end

    % 保存最后一个角度的轨迹
    lastTraj = traj;
 end  

% 如果未找到匹配的角度,绘制最后一个角度下的轨迹
if ~foundMatch
    figure;
    plot(lastTraj(:,1), lastTraj(:,2), '*');
    axis equal; % 设置坐标轴间距相同
    title('弹道轨迹');
    xlabel('距离/m');
    ylabel('高度/m');
    
    fprintf('未找到匹配的发射角度,显示最后一个角度下的轨迹。\n');
 end

% 打印结果
fprintf('落点距离:%d米;\n误差:%d米;\n对应发射角度:%d度\n.', P(1),abs(P(1)-dist),angle);

代码分析

  • 代码首先定义了炮弹运动的各项参数,包括运动时间、仿真时间间隔、初始发射位置、炮弹质量、空气阻力系数、空气密度、炮弹直径、重力加速度等。
  • 然后,代码设置了目标落点距离,并使用循环遍历不同的发射角度,计算每个角度下炮弹的飞行轨迹。
  • 在每个时间步长内,代码都会计算炮弹受到的空气阻力,并将其加到炮弹的加速度上,进而更新炮弹的速度和位置。
  • 代码还会记录每个时间步长下的炮弹速度和位置,用于后续绘制轨迹图和速度变化曲线。
  • 一旦找到满足目标落点距离的发射角度,代码就会跳出循环,并绘制该角度下的炮弹轨迹图和速度变化曲线。
  • 如果遍历完所有角度都未找到满足目标落点距离的发射角度,代码会提示用户,并绘制最后一个角度下的炮弹轨迹图。

结果分析

通过运行代码,可以得到炮弹在不同发射角度下的飞行轨迹图和速度变化曲线,从而直观地观察到空气阻力对炮弹飞行轨迹的影响。同时,也可以找到击中目标距离所需的发射角度。

改进方向

  • 可以考虑更精确的空气阻力模型,例如考虑炮弹形状、空气密度变化等因素的影响。
  • 可以加入风力影响,使模拟更加真实。
  • 可以将代码封装成函数,方便用户调用。
Matlab炮弹轨迹模拟与空气阻力分析

原文地址: https://www.cveoy.top/t/topic/ASK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录