> 技术文档 > 深圳杯数学建模挑战赛2024A题——多个火箭残骸的准确定位_多个火箭残骸的准确定位数学建模

深圳杯数学建模挑战赛2024A题——多个火箭残骸的准确定位_多个火箭残骸的准确定位数学建模

问题一分析与建模过程

1. 问题需求解析

问题一包含两个核心部分:

  • 理论分析: 确定精准定位空中单个音爆源所需的最少监测设备数量。精准定位意味着确定音爆源的三维空间坐标 (经度, 纬度, 高程) 以及音爆发生的精确时间 (t₀)

  • 数据应用: 利用附件表格中提供的7台监测设备的具体位置信息和各自记录的音爆抵达时间数据,计算出该次火箭残骸发生音爆时的具体位置和时间。

2. 最少监测设备数量分析

为了唯一确定一个事件在三维空间中的位置 (x, y, z) 和发生时间 t₀,我们总共需要确定4个未知数。声波从音爆源传播到各个监测设备遵循物理规律:

  • 设音爆源的位置为 P = (x, y, z),音爆发生的真实时间为 t₀

  • 设第 i 台监测设备的位置为 Sᵢ = (xᵢ, yᵢ, zᵢ),其记录的音爆抵达时间为 tᵢ

  • 声波在大气中(近地表)的传播速度近似为常数 v (题目背景信息未直接给出,但根据常识及前述分析,通常取 v = 340 m/s。这里需要明确指出,我们将采用标准声速340 m/s作为计算依据,这是基于一般物理常识,如果题目附件或背景中有明确说明则以题目为准。在此我们使用 v = 340 m/s)。

  • 声波传播距离 dᵢ 为音爆源 P 到监测设备 Sᵢ 的欧氏距离: dᵢ = ||P - Sᵢ|| = sqrt((x - xᵢ)² + (y - yᵢ)² + (z - zᵢ)²) (1)

  • 声波从源传播到设备 i 所需时间为 Δtᵢ = dᵢ / v

  • 因此,设备 i 记录的抵达时间 tᵢ 与音爆发生时间 t₀ 和传播时间 Δtᵢ 的关系为: tᵢ = t₀ + dᵢ / v 代入 dᵢ 表达式,得到: tᵢ = t₀ + sqrt((x - xᵢ)² + (y - yᵢ)² + (z - zᵢ)²) / v (2)

每一台监测设备都能提供一个如式(2)所示的方程。为了求解 x, y, z, t₀ 这4个未知数,根据代数理论,至少需要建立4个独立的方程。因此,至少需要布置4台监测设备才能构成一个恰定方程组,从而在理论上唯一确定音爆源的四维时空坐标 (x, y, z, t₀)。需要注意的是,这要求4台设备不能处于某些特殊(退化)的几何构型上,例如,所有设备与声源共面或共线。拥有超过4台设备(如本题中的7台)可以提供冗余信息,有助于通过优化方法提高定位精度并增强对测量误差的鲁棒性。

3. 基于7台设备数据的定位模型建立

给定7台监测设备的位置 Sᵢ = (lonᵢ, latᵢ, altᵢ) 和对应的音爆抵达时间 tᵢ (i = 1, ..., 7),我们需要求解音爆源位置 P = (lon, lat, alt) 和时间 t₀

3.1 坐标系转换

直接在经纬度高程坐标系下计算欧氏距离是不准确的。我们需要将地理坐标转换为适合计算距离的笛卡尔坐标系。考虑到监测范围相对局限(经纬度跨度不大),我们可以采用局部切平面坐标系(如ENU - East-North-Up)或者更简单的近似方法,将经纬度差按地球半径换算成米。这里我们采用后者,选择设备A作为参考原点进行转换。

  • 设定参考点: 取设备A的位置 (lon_A, lat_A) 作为参考。

  • 计算平均纬度: lat_avg = mean(latitudes),用于计算经度方向的距离比例。

  • 地球半径: 采用平均地球半径 R = 6371000 米。

  • 转换公式: 对于第 i 台设备 (lonᵢ, latᵢ, altᵢ),其在以A点经纬度为原点、高程为绝对值的局部近似笛卡尔坐标系中的坐标 (xᵢ, yᵢ, zᵢ) 计算如下: xᵢ = (lonᵢ - lon_A) * (π/180) * R * cos(lat_avg * π/180) (3) yᵢ = (latᵢ - lat_A) * (π/180) * R (4) zᵢ = altᵢ (5)

  • 待求的音爆源位置 P 在此坐标系下的坐标为 (x, y, z)

3.2 优化模型的构建

利用7台设备的数据,我们得到一个超定方程组(7个方程,4个未知数)。由于实际测量中可能存在误差,直接求解方程组可能无解或解不精确。因此,采用优化方法,寻找使模型预测时间与实际测量时间误差最小的解。最常用的方法是最小二乘法。

  • 目标: 最小化所有设备上测量时间与模型预测时间之间的平方误差和。

  • 待优化变量: X = [x, y, z, t₀]

  • 目标函数: J(X) = Σᵢ₁⁷ [ tᵢ - (t₀ + sqrt((x - xᵢ)² + (y - yᵢ)² + (z - zᵢ)²) / v) ]² (6) 其中 (xᵢ, yᵢ, zᵢ) 是第 i 台设备转换后的笛卡尔坐标,tᵢ 是其测量的到达时间,v = 340 m/s

  • 求解方法: 这是一个非线性最小二乘优化问题。可以使用MATLAB的 lsqnonlin 函数进行求解。该函数需要一个定义残差向量的函数句柄。

  • 残差函数 (Residual Function): F(X) = [ f₁(X), f₂(X), ..., f₇(X) ]ᵀ 其中 fᵢ(X) = tᵢ - (t₀ + sqrt((x - xᵢ)² + (y - yᵢ)² + (z - zᵢ)²) / v) (7) lsqnonlin 会尝试找到 X 使得 ||F(X)||₂² = Σ fᵢ(X)² 最小。

4. 模型求解步骤

  1. 数据准备: 提取附件表格中的7台设备的经度、纬度、高程和到达时间数据。

  2. 坐标转换:

    • 计算所有设备纬度的平均值 lat_avg

    • 以设备A为参考,使用公式(3)-(5)将所有7台设备的地理坐标转换为局部笛卡尔坐标 (xᵢ, yᵢ, zᵢ)

  3. 定义残差函数: 在MATLAB中编写一个函数,输入为参数向量 X = [x, y, z, t₀],输出为7个元素的残差列向量,其计算方式遵循公式(7)。该函数需要访问转换后的设备坐标 (xᵢ, yᵢ, zᵢ)、测量时间 tᵢ 和声速 v

  4. 设定初始猜测值: 为优化算法提供一个初始点 X₀ = [x₀, y₀, z₀, t₀₀]。可以根据设备位置的几何中心和最早到达时间进行粗略估计。例如:

    • x₀, y₀: 设备 x, y 坐标的均值。

    • z₀: 设备 z 坐标(高程)的均值,或者略高于最高设备的高度。

    • t₀₀: 略小于所有 tᵢ 中的最小值,例如 min(tᵢ) - (平均设备间距 / v)

  5. 调用优化求解器: 使用MATLAB的 lsqnonlin 函数,传入残差函数句柄和初始猜测值 X₀[X_solution, resnorm] = lsqnonlin(@residual_function, X0); 其中 @residual_function 是指向步骤3中定义的残差函数的句柄,X_solution 是找到的最优参数向量 [x_sol, y_sol, z_sol, t0_sol]resnorm 是残差平方和的最小值。

  6. 结果转换与输出:

    • 得到的 (x_sol, y_sol, z_sol) 是在局部笛卡尔坐标系下的位置。需要将其转换回地理坐标(经度, 纬度, 高程)。 lon_sol = lon_A + (x_sol / (R * cos(lat_avg * π/180))) * (180/π) (8) lat_sol = lat_A + (y_sol / R) * (180/π) (9) alt_sol = z_sol (10)

    • 得到的 t0_sol 即为估计的音爆发生时间。

    • 输出计算得到的经度、纬度、高程和时间。

  7. 可视化: 创建一个3D图形,绘制出7台监测设备的转换后位置和计算得到的音爆源位置,以直观展示空间关系。

5. MATLAB 实现与结果

% --- 数据准备 ---% 设备名称 (仅供参考)% devices = {\'A\', \'B\', \'C\', \'D\', \'E\', \'F\', \'G\'};% 设备地理坐标 (经度°, 纬度°, 高程m)lon_deg = [110.241, 110.780, 110.712, 110.251, 110.524, 110.467, 110.047];lat_deg = [27.204, 27.456, 27.785, 27.825, 27.617, 27.921, 27.121];alt_m = [824, 727, 742, 850, 786, 678, 575];% 音爆抵达时间 (s)t_measured = [100.767, 112.220, 188.020, 258.985, 118.443, 266.871, 163.024]\'; % 转置为列向量% 物理常数v_sound = 340; % 声速 (m/s)R_earth = 6371000; % 地球平均半径 (m)% --- 坐标转换 ---% 参考点 (设备A)lon_A = lon_deg(1);lat_A = lat_deg(1);% 计算平均纬度 (弧度)lat_avg_rad = mean(lat_deg) * pi / 180;% 转换所有设备到局部笛卡尔坐标系 (以设备A经纬度为原点)num_sensors = length(lon_deg);sensor_coords_cartesian = zeros(num_sensors, 3);for i = 1:num_sensors sensor_coords_cartesian(i, 1) = (lon_deg(i) - lon_A) * (pi/180) * R_earth * cos(lat_avg_rad); % Easting (x) sensor_coords_cartesian(i, 2) = (lat_deg(i) - lat_A) * (pi/180) * R_earth;  % Northing (y) sensor_coords_cartesian(i, 3) = alt_m(i); % Altitude (z)enddisp(\'传感器的局部笛卡尔坐标 (Easting, Northing, Altitude) / m:\');disp(sensor_coords_cartesian);% --- 定义残差函数 ---residual_function = @(X) t_measured - (X(4) + sqrt(sum((repmat(X(1:3)\', num_sensors, 1) - sensor_coords_cartesian).^2, 2)) / v_sound);% --- 设定初始猜测值 ---% x0, y0: 传感器坐标的均值x0_guess = mean(sensor_coords_cartesian(:, 1));y0_guess = mean(sensor_coords_cartesian(:, 2));% z0: 略高于最高传感器z0_guess = max(alt_m) + 1000; % 假设音爆发生在传感器上方1km处% t0: 略小于最早到达时间[min_t, min_idx] = min(t_measured);dist_to_first_sensor_approx = sqrt((x0_guess - sensor_coords_cartesian(min_idx, 1))^2 + ... (y0_guess - sensor_coords_cartesian(min_idx, 2))^2 + ... (z0_guess - sensor_coords_cartesian(min_idx, 3))^2);t0_guess = min_t - dist_to_first_sensor_approx / v_sound;if t0_guess < 0 % 确保初始时间不为负 t0_guess = min_t / 2;endX0 = [x0_guess, y0_guess, z0_guess, t0_guess];disp(\'初始猜测值 [x, y, z, t0]:\');disp(X0);% --- 调用优化求解器 ---options = optimoptions(\'lsqnonlin\', \'Display\', \'iter\', \'Algorithm\', \'levenberg-marquardt\'); % 显示迭代过程[X_solution, resnorm, residual, exitflag, output] = lsqnonlin(residual_function, X0, [], [], options);disp(\'优化求解完成。\');disp([\'退出标志 (Exit flag): \', num2str(exitflag)]); % 1 表示收敛disp([\'残差平方和 (Sum of squared residuals): \', num2str(resnorm)]);% --- 结果转换与输出 ---x_sol_cartesian = X_solution(1);y_sol_cartesian = X_solution(2);z_sol_cartesian = X_solution(3); % 高程即是z坐标t0_solution = X_solution(4);% 转换回地理坐标lon_solution_deg = lon_A + (x_sol_cartesian / (R_earth * cos(lat_avg_rad))) * (180/pi);lat_solution_deg = lat_A + (y_sol_cartesian / R_earth) * (180/pi);alt_solution_m = z_sol_cartesian;fprintf(\'\\n--- 计算结果 ---\\n\');fprintf(\'残骸发生音爆时的位置:\\n\');fprintf(\' 经度: %.6f °\\n\', lon_solution_deg);fprintf(\' 纬度: %.6f °\\n\', lat_solution_deg);fprintf(\' 高程: %.2f m\\n\', alt_solution_m);fprintf(\'残骸发生音爆的时间 (t0):\\n\');fprintf(\' t0 = %.3f s (相对于观测系统时钟0时)\\n\', t0_solution);% --- 可视化 ---figure;scatter3(sensor_coords_cartesian(:,1), sensor_coords_cartesian(:,2), sensor_coords_cartesian(:,3), 100, \'b\', \'filled\', \'DisplayName\', \'监测设备\');hold on;scatter3(x_sol_cartesian, y_sol_cartesian, z_sol_cartesian, 200, \'r\', \'p\', \'filled\', \'DisplayName\', \'音爆位置\'); % 用红色五角星表示% 添加设备标签labels = {\'A\', \'B\', \'C\', \'D\', \'E\', \'F\', \'G\'};for i = 1:num_sensors text(sensor_coords_cartesian(i,1)+500, sensor_coords_cartesian(i,2)+500, sensor_coords_cartesian(i,3), labels{i}, \'FontSize\', 10, \'Color\', \'k\');end% 绘制从音爆点到各传感器的连线 (可选)% for i = 1:num_sensors% plot3([x_sol_cartesian, sensor_coords_cartesian(i,1)], ...%  [y_sol_cartesian, sensor_coords_cartesian(i,2)], ...%  [z_sol_cartesian, sensor_coords_cartesian(i,3)], \'g--\');% endhold off;xlabel(\'东向距离 (m)\');ylabel(\'北向距离 (m)\');zlabel(\'高程 (m)\');title(\'监测设备与计算得到的音爆位置 (局部笛卡尔坐标系)\');legend(\'show\');grid on;axis equal; % 使各轴比例一致,更好地反映空间关系view(3); % 设置三维视角% --- 检查时间残差 ---t_predicted = t0_solution + sqrt(sum((repmat(X_solution(1:3)\', num_sensors, 1) - sensor_coords_cartesian).^2, 2)) / v_sound;time_residuals = t_measured - t_predicted;fprintf(\'\\n各传感器的时间残差 (Measured - Predicted) / s:\\n\');disp(time_residuals\'); % 显示为行向量fprintf(\'时间残差的标准差: %.4f s\\n\', std(time_residuals));