个人技术分享

4月下旬深圳杯开赛后第二天就推出了完整版的论文,经过长达半个月大家再售后群的讨论分析,我们又重新对之前思路下写的代码进行了改进。本次改进的结果,我们特地参考了网上一些常见的火箭及其相关的级别分离高度:(我们的新计算结果与其高度重合)

深圳杯A题分享资料链接:链接:百度网盘 请输入提取码 提取码:sxjm

  1. 美国的“阿特拉斯 V”火箭:

    • 助推器分离:通常在飞行后约2分钟,大约在44公里(约144,000英尺)的高度分离。

    • 一级分离:约在飞行4分钟后,大约在100公里(约328,000英尺)的高度进行分离。

  2. 美国“猎鹰9”火箭:

    • 助推器分离(如果使用助推器):通常在飞行后2分半钟,约在高度50公里(约164,000英尺)。

    • 一级分离:在飞行约2分半到3分钟,大约在高度70公里(约230,000英尺)左右。

  3. 俄罗斯的“联盟”火箭:

    • 助推器分离:通常在飞行后2分钟,大约在高度45-50公里(约150,000-164,000英尺)。

    • 一级分离:大约在飞行2分半到3分钟,高度约105-120公里(约344,000-394,000英尺)。

  4. 欧洲的“阿丽亚娜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;