4月下旬深圳杯开赛后第二天就推出了完整版的论文,经过长达半个月大家再售后群的讨论分析,我们又重新对之前思路下写的代码进行了改进。本次改进的结果,我们特地参考了网上一些常见的火箭及其相关的级别分离高度:(我们的新计算结果与其高度重合)
深圳杯A题分享资料链接:链接:百度网盘 请输入提取码 提取码:sxjm
-
美国的“阿特拉斯 V”火箭:
-
助推器分离:通常在飞行后约2分钟,大约在44公里(约144,000英尺)的高度分离。
-
一级分离:约在飞行4分钟后,大约在100公里(约328,000英尺)的高度进行分离。
-
-
美国“猎鹰9”火箭:
-
助推器分离(如果使用助推器):通常在飞行后2分半钟,约在高度50公里(约164,000英尺)。
-
一级分离:在飞行约2分半到3分钟,大约在高度70公里(约230,000英尺)左右。
-
-
俄罗斯的“联盟”火箭:
-
助推器分离:通常在飞行后2分钟,大约在高度45-50公里(约150,000-164,000英尺)。
-
一级分离:大约在飞行2分半到3分钟,高度约105-120公里(约344,000-394,000英尺)。
-
-
欧洲的“阿丽亚娜5”火箭:
-
助推器分离:大约在飞行2分钟后,高度约70公里(约230,000英尺)。
-
一级分离:飞行时间约9分钟,大约在高度160公里(约525,000英尺)。
-
本次更新我们又增加了三种问题一,一种问题二三,一种问题四的matlab代码。部分结果大家可以参考一下
以下为问题一改进后的三种代码其中一种:粘贴复制 可直接运行
% 初始化数据
data = [
110.241, 27.204, 824, 100.767;
110.780, 27.456, 727, 112.220;
110.712, 27.785, 742, 188.020;
110.251, 27.825, 850, 258.985;
110.524, 27.617, 786, 118.443;
110.467, 27.921, 678, 266.871;
110.047, 27.121, 575, 163.024
];
% 距离换算因子(米)
lon_dist_per_deg = 111320; % 经度每度的距离(m)
lat_dist_per_deg = 110574; % 纬度每度的距离(m)
% 音速(米/秒)
c = 340;
% 转换经纬度到米
x = (data(:,1) - mean(data(:,1))) * lon_dist_per_deg;
y = (data(:,2) - mean(data(:,2))) * lat_dist_per_deg;
z = data(:,3);
t = data(:,4);
% 初始猜测
x0 = mean(x);
y0 = mean(y);
z0 = max(z); % 使用最高的设备高程作为初始猜测
t0 = min(t);
% 非线性最小化设置
options = optimset('Display', 'iter', 'TolFun', 1e-6, 'TolX', 1e-6);
% 优化函数
objective = @(v) sum((sqrt((x-v(1)).^2 + (y-v(2)).^2 + (z-v(3)).^2) - c * (t - v(4))).^2);
% 添加高程非负约束
lb = [-Inf, -Inf, 0, -Inf];
ub = [Inf, Inf, Inf, Inf];
% 执行优化
[v, fval, exitflag, output] = fmincon(objective, [x0 y0 z0 t0], [], [], [], [], lb, ub, [], options);
% 将结果转换回经纬度和高程
final_lon = v(1) / lon_dist_per_deg + mean(data(:,1));
final_lat = v(2) / lat_dist_per_deg + mean(data(:,2));
final_z = v(3);
final_t = v(4);
% 结果输出
fprintf('音爆发生的经度: %f°, 纬度: %f°, 高程: %f m 和时间: %f s\n', final_lon, final_lat, final_z, final_t);
% 可视化
figure;
hold on;
scatter3(x, y, z, 'filled');
plot3(v(1), v(2), v(3), 'rp', 'MarkerSize', 15, 'MarkerFaceColor', 'r');
text(v(1), v(2), v(3), sprintf(' 音爆点\n(%.2f, %.2f, %.2f)', final_lon, final_lat, final_z), 'VerticalAlignment', 'bottom');
xlabel('X (meters)');
ylabel('Y (meters)');
zlabel('Z (meters)');
title('监测设备和音爆位置');
legend('监测设备位置', '计算得到的音爆位置');
grid on;
view(3);
hold off;