深圳杯数学建模挑战赛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. 模型求解步骤
-
数据准备: 提取附件表格中的7台设备的经度、纬度、高程和到达时间数据。
-
坐标转换:
-
计算所有设备纬度的平均值
lat_avg
。 -
以设备A为参考,使用公式(3)-(5)将所有7台设备的地理坐标转换为局部笛卡尔坐标
(xᵢ, yᵢ, zᵢ)
。
-
-
定义残差函数: 在MATLAB中编写一个函数,输入为参数向量
X = [x, y, z, t₀]
,输出为7个元素的残差列向量,其计算方式遵循公式(7)。该函数需要访问转换后的设备坐标(xᵢ, yᵢ, zᵢ)
、测量时间tᵢ
和声速v
。 -
设定初始猜测值: 为优化算法提供一个初始点
X₀ = [x₀, y₀, z₀, t₀₀]
。可以根据设备位置的几何中心和最早到达时间进行粗略估计。例如:-
x₀, y₀
: 设备x, y
坐标的均值。 -
z₀
: 设备z
坐标(高程)的均值,或者略高于最高设备的高度。 -
t₀₀
: 略小于所有tᵢ
中的最小值,例如min(tᵢ) - (平均设备间距 / v)
。
-
-
调用优化求解器: 使用MATLAB的
lsqnonlin
函数,传入残差函数句柄和初始猜测值X₀
。[X_solution, resnorm] = lsqnonlin(@residual_function, X0);
其中@residual_function
是指向步骤3中定义的残差函数的句柄,X_solution
是找到的最优参数向量[x_sol, y_sol, z_sol, t0_sol]
,resnorm
是残差平方和的最小值。 -
结果转换与输出:
-
得到的
(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
即为估计的音爆发生时间。 -
输出计算得到的经度、纬度、高程和时间。
-
-
可视化: 创建一个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));