炮弹发射轨迹仿真:计算最小误差对应的落点距离和角度,并绘制速度变化曲线
以下是修改后的代码,包括打印最小误差所对应的落点距离和角度,并显示速度变化图:
% 参数设置
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 著作权归作者所有。请勿转载和采集!