以下是修改后的代码,包括打印最小误差所对应的落点距离和角度,并显示速度变化图:

% 参数设置
T = 300; % 运动时间  
Tt = 0.01; % 仿真时间间隔
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 = [];
minError = inf;
bestAngle = 0;

% 遍历发射角度  
for angle = 0:0.05:1.1

    v0 = 500; % 初始速度为500 m/s
    V = v0 * 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

    error = abs(P(1) - dist);
    if error < minError
        minError = error;
        foundMatch = true;
        bestTraj = traj;
        bestVelocities = velocities;
        bestAngle = angle;
    end
end  

% 如果未找到匹配的角度,绘制误差最小所对应的轨迹
if ~foundMatch
    traj = bestTraj;
    velocities = bestVelocities;
    angle = bestAngle;
end

% 绘制轨迹 
figure;
plot(traj(:,1), traj(:,2), '*');
axis equal; % 设置坐标轴间距相同
title('弹道轨迹');
xlabel('距离/m');
ylabel('高度/m');

% 绘制速度变化曲线
figure;
time = 0:Tt:T;
plot(time(1:length(velocities)), velocities, 'LineWidth', 1.5);
title('炮弹速度变化');
xlabel('时间/s');
ylabel('速度/m/s');

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

在修改后的代码中,我们添加了一个 bestVelocities 变量来存储速度变化数据,并修改了相关部分以显示速度变化曲线。同时,我们还打印了最小误差所对应的落点距离和角度。

请尝试运行修改后的代码,检查是否可以正确绘制轨迹、速度变化图,并打印出最小误差所对应的落点距离和角度。如果您还有其他问题,请随时提问。


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

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