无线传感器网络定位:从RSSI测距到协同优化的数学建模与算法实现

📅 2026/8/27 3:40:43
无线传感器网络定位:从RSSI测距到协同优化的数学建模与算法实现
1. 项目概述与核心问题拆解“无线传感器网络的定位问题”是数学建模竞赛中一个经典且极具现实意义的赛题。简单来说就是给你一个区域里面撒了一把“小豆子”传感器节点其中一部分豆子锚节点知道自己在地图上的精确位置而大部分豆子未知节点不知道自己在哪里。我们的任务就是利用这些豆子之间能互相“喊话”通信并测量“喊话”的强弱或时间差信号强度或到达时间来推算出所有“迷路”豆子的具体坐标。这听起来像是一个几何问题但在实际工程和研究中它远不止于此。从森林火灾监测中部署的温湿度传感器到智慧农业里监测土壤墒情的设备再到大型仓库的资产追踪标签其底层核心都是定位技术。2023年“创思杯”这道B题正是将这个工程问题抽象成了一个标准的数学优化模型考察参赛者将实际问题数学化、并寻求高效稳定解决方案的综合能力。其核心痛点在于如何在成本有限的锚节点、精度定位误差和鲁棒性抗干扰能力之间取得最佳平衡。对于刚接触数模的同学可能会被“网络”、“定位”、“算法”这些词吓到但其实它的内核非常直观就是根据已知点锚节点的位置和它们与未知点之间的距离或距离相关的观测值去解算未知点的坐标。这和我们用手机GPS定位卫星就是锚节点的原理在本质上是相通的。2. 核心思路与模型构建总览面对这道题一个清晰的解决路径比盲目尝试各种算法更重要。整个建模过程可以梳理为“观测获取 - 距离估计 - 坐标解算 - 优化求精”四个核心阶段。2.1 问题分析与模型假设首先我们必须明确题目给出的所有条件。通常题目会给出网络拓扑所有节点的数量其中锚节点的数量和坐标未知节点的数量。通信模型节点的通信半径。只有距离小于通信半径的两个节点才能相互通信、测量。观测数据节点间测量的具体值。最常见的是接收信号强度指示RSSI也可能直接给出到达时间TOA或到达时间差TDOA。本题相关热词中提到了RSSI因此我们以RSSI为主要观测量进行讨论。基于此我们需要建立合理的数学模型假设假设1距离衰减模型RSSI值与信号传播距离存在确定性的数学关系。最常用的是对数路径损耗模型RSSI(d) RSSI(d0) - 10*n*log10(d/d0) Xσ。其中d是距离d0是参考距离通常为1米RSSI(d0)是参考距离处的信号强度n是路径损耗指数与环境相关是待估参数Xσ是服从高斯分布的随机噪声代表环境干扰。假设2网络连通性所有未知节点至少与3个二维定位或4个三维定位锚节点连通或者能通过其他未知节点与足够多的锚节点间接连通以保证定位的可解性。假设3平面定位除非题目特别说明通常假设所有节点部署在二维平面内。注意n和Xσ的设定至关重要。n取值通常在2自由空间到4复杂室内环境之间需要根据题目描述的环境进行估计或设置为待优化参数。Xσ的方差决定了模型的噪声水平会直接影响定位精度。2.2 整体解决框架设计一个稳健的定位方案通常不是单一方法而是一个流水线。我推荐的框架如下数据预处理与距离转换将原始的RSSI观测值根据路径损耗模型转换为节点间的估计距离。由于噪声存在这个估计距离是有误差的。粗定位 - 三边测量法对于每个未知节点利用与之相连的多个锚节点的估计距离通过三边测量或最小二乘法计算出一个初始坐标。这是最基础的几何定位方法。精定位 - 优化算法将整个网络的定位问题转化为一个全局优化问题。以“所有节点间估计距离与根据节点坐标计算出的几何距离之差的平方和”作为目标函数即最小二乘代价函数通过优化算法如非线性最小二乘、模拟退火、粒子群算法等对所有未知节点的坐标进行联合优化从而降低局部误差提高整体定位精度和鲁棒性。性能评估与可视化计算定位误差如均方根误差RMSE、定位成功率等指标并绘制网络拓扑图、定位前后对比图直观展示效果。这个框架的优势在于三边测量法提供了优化的初始值大大加快了全局优化算法的收敛速度并避免了陷入局部最优解。3. 核心算法原理与实现细节3.1 从RSSI到距离路径损耗模型详解这是定位的基石如果这一步误差大后续再精巧的算法也是徒劳。对数路径损耗模型的具体应用步骤如下设锚节点i发送信号未知节点j接收到的RSSI值为RSSI_ij。 已知或假设参考距离d0 1m处的信号强度为RSSI_d0例如-40dBm路径损耗指数为n。 则估计距离d_ij可以通过模型反推得到RSSI_ij RSSI_d0 - 10*n*log10(d_ij / d0) Xσ忽略噪声项Xσ因其期望为0我们可以解出d_ij d0 * 10^((RSSI_d0 - RSSI_ij) / (10*n))实操要点RSSI_d0需要标定。在题目未给定时可以将其与n一同作为待估参数。一个实用的方法是利用已知位置的锚节点之间的RSSI测量值来反推RSSI_d0和n。选取一组锚节点对已知它们的真实距离d_true和测量RSSI通过线性回归拟合RSSI ~ -10n*log10(d)这条直线截距即为RSSI_d0斜率与n相关。n的选择非常敏感。在复杂环境中可以考虑使用更复杂的模型如双斜率模型或者在不同区域使用不同的n值。3.2 三边测量法与最小二乘解算假设一个未知节点(x, y)测量到三个锚节点(x1, y1), (x2, y2), (x3, y3)的距离分别为d1, d2, d3。理想情况下三个圆的交点就是该未知节点的位置。但由于距离估计存在误差三个圆往往不会交于一点。此时我们可以将其转化为一个最小二乘问题。对于每个锚节点i有方程(x - xi)^2 (y - yi)^2 di^2。 将第一个方程与后续方程相减可以消去二次项x^2 y^2得到线性方程2*(x1 - xi)*x 2*(y1 - yi)*y (x1^2 y1^2) - (xi^2 yi^2) di^2 - d1^2对于有m个锚节点的情况我们可以得到m-1个这样的线性方程构成方程组A * X b其中X [x, y]^T。通过最小二乘法求解X (A^T * A)^-1 * A^T * b即可得到该未知节点的初始坐标。Python代码示例核心部分import numpy as np def trilateration(anchor_positions, distances): 使用最小二乘法进行三边测量定位 :param anchor_positions: 锚节点坐标数组形状为 (m, 2) :param distances: 到各锚节点的估计距离数组形状为 (m,) :return: 估计的未知节点坐标 (x, y) m anchor_positions.shape[0] A np.zeros((m-1, 2)) b np.zeros((m-1, 1)) x1, y1 anchor_positions[0] d1_sq distances[0]**2 for i in range(1, m): xi, yi anchor_positions[i] di_sq distances[i]**2 A[i-1, 0] 2 * (x1 - xi) A[i-1, 1] 2 * (y1 - yi) b[i-1, 0] (x1**2 y1**2) - (xi**2 yi**2) di_sq - d1_sq # 最小二乘求解 X, residuals, rank, s np.linalg.lstsq(A, b, rcondNone) return X.flatten() # 示例用法 anchors np.array([[0, 0], [10, 0], [0, 10]]) # 三个锚节点坐标 dists np.array([7.07, 7.07, 7.07]) # 估计距离真实位置应在[5,5]附近 pos trilateration(anchors, dists) print(f估计坐标: {pos})3.3 全局优化将定位问题转化为数学优化问题三边测量法节点间独立计算没有利用“未知节点之间也存在距离约束”这一信息。全局优化方法将整个网络的所有未知节点坐标作为优化变量构建一个更全面的目标函数。定义代价函数Cost FunctionF(X) Σ_{(i,j) in E} (||Xi - Xj|| - d_ij)^2其中X是所有未知节点的坐标向量E是所有存在测量即连通的节点对集合||Xi - Xj||是根据当前坐标计算出的欧氏距离d_ij是从RSSI转换而来的估计距离。我们的目标是找到一组X使得F(X)最小。这是一个典型的非线性最小二乘问题。实现方法使用SciPy优化库对于中小规模网络scipy.optimize.least_squares函数是绝佳选择。它专为非线性最小二乘设计效率高。from scipy.optimize import least_squares import numpy as np def cost_function(flat_coords, anchor_positions, all_positions, edges, estimated_distances): 计算代价函数 :param flat_coords: 一维数组所有未知节点的坐标 [x1, y1, x2, y2, ...] :param ... : 其他固定参数 :return: 残差数组 # 将一维坐标数组重构为 (num_unknown, 2) 的矩阵 unknown_coords flat_coords.reshape(-1, 2) # 组合所有节点坐标锚节点固定 all_coords np.vstack([anchor_positions, unknown_coords]) residuals [] for (i, j), d_est in zip(edges, estimated_distances): d_calc np.linalg.norm(all_coords[i] - all_coords[j]) residuals.append(d_calc - d_est) return np.array(residuals) # 假设已有数据anchors, unknown_indices, edge_list, distance_list # initial_guess 可由三边测量法提供的初始坐标展平得到 initial_guess ... # 形状为 (2 * num_unknown_nodes,) # 定义锚节点坐标和所有节点索引映射关系 # 执行优化 result least_squares(cost_function, initial_guess, args(anchor_positions, all_positions_info, edge_list, distance_list), methodtrf, # 信赖域反射算法适合有界问题 verbose1) optimized_coords result.x.reshape(-1, 2)使用元启发式算法对于大规模网络或非凸性强的代价函数可以考虑粒子群优化PSO、模拟退火SA等。这些算法全局搜索能力强但计算量更大通常用于对三边测量结果进行“抛光”或作为对比算法。4. 完整解题流程与代码架构一个完整的、可复现的解题程序应该模块清晰数据流明确。下面给出一个建议的代码架构和主流程。4.1 程序模块设计wireless_localization/ ├── main.py # 主程序入口 ├── config.py # 参数配置n, RSSI_d0, 通信半径等 ├── data_loader.py # 加载题目数据 ├── preprocess.py # RSSI转距离网络连通性分析 ├── trilateration.py # 三边测量法粗定位 ├── optimization.py # 全局优化精定位 ├── evaluate.py # 性能评估与误差计算 └── visualize.py # 结果可视化4.2 主流程代码示例# main.py import numpy as np from data_loader import load_problem_data from preprocess import rssi_to_distance, build_connectivity from trilateration import coarse_localization from optimization import fine_localization from evaluate import calculate_rmse, localization_success_rate from visualize import plot_network, plot_error_distribution def main(): # 1. 加载数据 print(步骤1: 加载数据...) anchor_positions, unknown_indices, rssi_matrix, comm_range load_problem_data(problem_data.csv) # 2. 数据预处理 print(步骤2: 数据预处理RSSI转距离...) # 假设已通过部分锚节点数据拟合出模型参数 n 3.0 # 路径损耗指数 RSSI_d0 -40 # 参考距离信号强度 distance_matrix rssi_to_distance(rssi_matrix, n, RSSI_d0) # 根据通信半径过滤无效测量距离大于通信半径的视为无效 distance_matrix[distance_matrix comm_range] np.nan # 构建连通性列表边和对应的距离列表 edge_list, distance_list build_connectivity(distance_matrix) # 3. 粗定位 - 三边测量 print(步骤3: 三边测量法粗定位...) initial_unknown_positions coarse_localization(anchor_positions, unknown_indices, distance_matrix) # 4. 精定位 - 全局优化 print(步骤4: 全局优化精定位...) optimized_unknown_positions fine_localization( anchor_positions, initial_unknown_positions, edge_list, distance_list ) # 5. 评估假设我们有部分未知节点的真实坐标用于验证 print(步骤5: 性能评估...) # 假设 true_unknown_positions 是用于验证的真实坐标 true_unknown_positions load_true_positions(ground_truth.csv) rmse calculate_rmse(optimized_unknown_positions, true_unknown_positions) success_rate localization_success_rate(optimized_unknown_positions, true_unknown_positions, thresholdcomm_range*0.1) print(f定位结果 RMSE: {rmse:.2f} 米) print(f定位成功率误差{comm_range*0.1:.2f}米: {success_rate*100:.2f}%) # 6. 可视化 print(步骤6: 生成可视化图表...) plot_network(anchor_positions, true_unknown_positions, optimized_unknown_positions, network_layout.png) plot_error_distribution(optimized_unknown_positions, true_unknown_positions, error_dist.png) if __name__ __main__: main()4.3 关键参数调试心得路径损耗指数n这是影响最大的参数。如果题目没有明确环境建议将n设置为一个范围如2.0到4.0进行参数扫描选择使锚节点间距离反推误差最小的n值作为模型参数。优化算法选择scipy.optimize.least_squares的method参数可选trf信赖域反射或lm列文伯格-马夸尔特。对于有边界约束的问题如节点在固定区域内trf更合适对于无约束或接近最优解时的精细优化lm收敛更快。初始值的重要性全局优化严重依赖初始值。三边测量法提供的初始值质量直接决定了优化能否收敛到全局最优。务必检查每个未知节点的三边定位结果是否合理例如坐标是否远远超出网络区域。处理异常值在实际RSSI测量中可能存在多径效应、遮挡等导致的异常大或异常小的值。在rssi_to_distance后可以加入一个简单的滤波比如剔除距离估计值超过通信半径3倍或低于0.1米的极端数据。5. 进阶思路与模型优化在完成基础模型后要想在竞赛中脱颖而出可以考虑以下进阶方向5.1 基于加权最小二乘的改进三边测量并非所有距离估计都是同等可靠的。距离越远RSSI测量误差对距离估计的影响越大因为对数模型的特性。因此在最小二乘求解时可以给每个距离方程赋予一个权重通常权重与距离估计的方差成反比。假设距离估计误差服从高斯分布其方差与距离平方成正比则权重可以设为wi 1 / (di^2)。这样更可靠距离更近的测量在定位中拥有更高的话语权。修改后的三边测量法其正规方程变为(A^T * W * A) * X A^T * W * b其中W是对角权重矩阵。5.2 非视距NLOS误差抑制在复杂环境中信号可能被障碍物反射、衍射导致传播路径长度大于直线距离这就是非视距误差它会严重恶化定位精度。一种简单的抑制方法是残差筛选法先用所有锚节点进行三边定位。计算每个锚节点对应的距离残差| ||X_est - Xi|| - di |。剔除残差最大的一个或几个锚节点可能是受NLOS影响严重的。用剩余的锚节点重新进行定位。 更高级的方法可以建立NLOS误差的统计模型或使用鲁棒估计方法如RANSAC。5.3 协同定位Cooperative Localization这是本题的精髓之一也是全局优化方法的核心思想。协同定位不仅利用“未知节点-锚节点”的测量还充分利用“未知节点-未知节点”之间的测量。这些额外的约束构成了一个超定方程组使得整个网络形成一个“刚性”或“半刚性”图即使某些未知节点只能连通到很少的锚节点也能通过邻居未知节点的位置信息间接被定位。全局优化代价函数F(X)的定义本身就实现了协同定位。在代码中edge_list和distance_list必须包含所有连通节点对包括未知节点之间的测量。5.4 算法对比与灵敏度分析一个完整的数模论文不应只有一种方法。可以设计对比实验方法对比实现并对比三边测量法、最小二乘三边测量、加权最小二乘三边测量、全局优化协同定位这几种方法的精度。参数灵敏度分析分析路径损耗指数n、锚节点密度、通信半径、测量噪声方差等参数对最终定位精度的影响。绘制曲线图例如“定位RMSE随锚节点比例变化曲线”。鲁棒性测试随机剔除一定比例的测量数据模拟数据包丢失或人为加入一定比例的NLOS误差测试不同算法的性能下降程度。6. 常见问题排查与竞赛技巧6.1 定位失败或误差巨大的可能原因初始定位错误某个未知节点在进行三边测量时由于锚节点几何分布不佳例如几乎共线或距离误差太大导致初始坐标严重偏离。排查可视化每个未知节点的初始定位结果检查是否有坐标明显离群的节点。模型参数严重失配使用的n或RSSI_d0与题目隐含的环境严重不符。排查用锚节点间的测量反推模型参数并与你的假设值对比。优化陷入局部最优全局优化算法的初始值太差或者代价函数非凸性太强。解决尝试多次运行优化每次使用不同的随机初始值在三边测量结果上加微小扰动选择代价函数最小的结果。数据连通性不足存在“孤儿”节点其连通到的锚节点数量少于3个且也无法通过其他未知节点与足够多的锚节点连通。这在数学上就是不可定位的。解决在预处理阶段识别出这些节点在论文中单独讨论或尝试利用其他先验信息如节点部署密度进行估计。6.2 数学建模竞赛实战技巧摘要至上摘要必须清晰说明“用了什么方法”、“解决了什么问题”、“得到了什么结果”。采用“针对…问题本文建立了…模型采用了…方法通过…步骤最终实现了…精度并分析了…因素的影响”的结构。图表说话至少包含以下图表网络拓扑示意图锚节点、未知节点真实位置、估计位置。定位误差累积分布函数CDF图。不同算法/参数下的性能对比柱状图或折线图。灵敏度分析曲线图。模型假设要合理明确列出所有假设并说明其合理性。例如“假设测距误差服从零均值高斯分布”是常见的合理假设。代码与模型分离在论文中描述清晰的算法步骤和数学模型将完整的代码作为附录。在正文中引用关键代码片段如优化目标函数公式对应的代码。讨论局限性在模型评价部分客观讨论你所提出方法的局限性例如对NLOS误差的敏感性、对高密度网络的扩展性等并给出可能的改进方向这能体现思考的深度。6.3 一份可运行的简化版核心代码最后附上一个高度集成但功能完整的简化版代码它涵盖了从数据生成、粗定位到精定位的全过程你可以直接以此为基础进行修改和扩展。import numpy as np import matplotlib.pyplot as plt from scipy.optimize import least_squares # 1. 模拟数据生成 np.random.seed(42) area_size 100 num_anchors 6 num_unknowns 30 # 随机生成锚节点和未知节点真实位置 anchors_true np.random.rand(num_anchors, 2) * area_size unknowns_true np.random.rand(num_unknowns, 2) * area_size # 合并所有节点 all_nodes_true np.vstack([anchors_true, unknowns_true]) num_all num_anchors num_unknowns # 模拟RSSI测量基于对数路径损耗模型 噪声 def simulate_rssi(pos1, pos2, n3.0, RSSI_d0-40, sigma4): d np.linalg.norm(pos1 - pos2) if d 0: return RSSI_d0 RSSI RSSI_d0 - 10 * n * np.log10(d) np.random.normal(0, sigma) return RSSI communication_range 40 # 通信半径 RSSI_matrix np.full((num_all, num_all), np.nan) for i in range(num_all): for j in range(i1, num_all): d np.linalg.norm(all_nodes_true[i] - all_nodes_true[j]) if d communication_range: RSSI_matrix[i, j] simulate_rssi(all_nodes_true[i], all_nodes_true[j]) RSSI_matrix[j, i] RSSI_matrix[i, j] # 2. 数据预处理RSSI转距离 def rssi_to_dist(rssi, n3.0, RSSI_d0-40): return 10 ** ((RSSI_d0 - rssi) / (10 * n)) distance_matrix rssi_to_dist(RSSI_matrix) # 超出通信半径的设为NaN distance_matrix[distance_matrix communication_range] np.nan # 构建边和距离列表仅包含有效测量 edges [] dist_list [] for i in range(num_all): for j in range(i1, num_all): if not np.isnan(distance_matrix[i, j]): edges.append((i, j)) dist_list.append(distance_matrix[i, j]) edges np.array(edges) dist_list np.array(dist_list) # 3. 粗定位三边测量法仅使用锚节点 def trilaterate_initial(anchors, unknown_index, dist_mat): 对单个未知节点进行三边测量 anchor_indices np.where(~np.isnan(dist_mat[unknown_index, :num_anchors]))[0] if len(anchor_indices) 3: return np.array([np.nan, np.nan]) # 无法定位 A [] b [] pos_a0 anchors[anchor_indices[0]] d0 dist_mat[unknown_index, anchor_indices[0]] for idx in anchor_indices[1:]: pos_ai anchors[idx] di dist_mat[unknown_index, idx] A.append([2*(pos_a0[0]-pos_ai[0]), 2*(pos_a0[1]-pos_ai[1])]) b.append([pos_a0[0]**2pos_a0[1]**2 - pos_ai[0]**2-pos_ai[1]**2 di**2 - d0**2]) A, b np.array(A), np.array(b) try: pos np.linalg.lstsq(A, b, rcondNone)[0].flatten() except np.linalg.LinAlgError: pos np.array([np.nan, np.nan]) return pos initial_unknowns np.zeros((num_unknowns, 2)) for i in range(num_unknowns): node_idx num_anchors i pos trilaterate_initial(anchors_true, node_idx, distance_matrix) initial_unknowns[i] pos # 处理无法定位的节点用区域中心或随机位置填充 nan_mask np.isnan(initial_unknowns[:, 0]) initial_unknowns[nan_mask] np.random.rand(np.sum(nan_mask), 2) * area_size # 4. 精定位全局优化协同定位 def cost_func(flat_coords, anchors, edges, dist_meas): 全局优化代价函数 unknowns flat_coords.reshape(-1, 2) all_nodes np.vstack([anchors, unknowns]) residuals [] for (i, j), d in zip(edges, dist_meas): d_calc np.linalg.norm(all_nodes[i] - all_nodes[j]) residuals.append(d_calc - d) return np.array(residuals) # 准备优化输入 # 将节点索引映射优化变量只包含未知节点需要将边列表中的索引进行转换 edge_list_opt [] dist_list_opt [] for (i, j), d in zip(edges, dist_list): # 如果i和j都是锚节点这个测量对优化未知节点坐标没有贡献可以跳过但包含亦可 # 这里我们保留所有边让优化器处理 edge_list_opt.append((i, j)) dist_list_opt.append(d) edge_list_opt np.array(edge_list_opt) dist_list_opt np.array(dist_list_opt) # 初始猜测粗定位结果展平 x0 initial_unknowns.flatten() # 执行优化 print(开始全局优化...) result least_squares(cost_func, x0, args(anchors_true, edge_list_opt, dist_list_opt), methodtrf, verbose1, max_nfev2000) optimized_unknowns result.x.reshape(-1, 2) # 5. 评估与可视化 def rmse(pred, true): mask ~np.isnan(pred[:,0]) ~np.isnan(true[:,0]) return np.sqrt(np.mean(np.sum((pred[mask] - true[mask])**2, axis1))) rmse_initial rmse(initial_unknowns, unknowns_true) rmse_optimized rmse(optimized_unknowns, unknowns_true) print(f粗定位 RMSE: {rmse_initial:.2f}) print(f精定位 RMSE: {rmse_optimized:.2f}) # 可视化 plt.figure(figsize(15,5)) # 子图1网络拓扑与定位结果 plt.subplot(131) plt.scatter(anchors_true[:,0], anchors_true[:,1], cred, s100, marker^, label锚节点 (真实)) plt.scatter(unknowns_true[:,0], unknowns_true[:,1], cblue, s50, alpha0.6, label未知节点 (真实)) plt.scatter(optimized_unknowns[:,0], optimized_unknowns[:,1], cgreen, s30, markerx, label未知节点 (估计)) for i in range(num_unknowns): plt.plot([unknowns_true[i,0], optimized_unknowns[i,0]], [unknowns_true[i,1], optimized_unknowns[i,1]], gray, alpha0.3, linewidth0.5) plt.legend() plt.title(f网络拓扑与定位结果 (优化后RMSE{rmse_optimized:.2f})) plt.xlabel(X (米)); plt.ylabel(Y (米)); plt.grid(True, alpha0.3) plt.axis(equal) # 子图2定位误差对比 plt.subplot(132) error_initial np.sqrt(np.sum((initial_unknowns - unknowns_true)**2, axis1)) error_optimized np.sqrt(np.sum((optimized_unknowns - unknowns_true)**2, axis1)) plt.hist(error_initial, bins20, alpha0.7, labelf粗定位 (均值{np.mean(error_initial):.2f}), colororange) plt.hist(error_optimized, bins20, alpha0.7, labelf精定位 (均值{np.mean(error_optimized):.2f}), colorgreen) plt.xlabel(定位误差 (米)); plt.ylabel(频数); plt.title(定位误差分布对比); plt.legend(); plt.grid(True, alpha0.3) # 子图3误差累积分布函数CDF plt.subplot(133) sorted_errors_opt np.sort(error_optimized) cdf np.arange(1, len(sorted_errors_opt)1) / len(sorted_errors_opt) plt.plot(sorted_errors_opt, cdf, b-, linewidth2, label优化后) sorted_errors_init np.sort(error_initial[~np.isnan(error_initial)]) cdf_init np.arange(1, len(sorted_errors_init)1) / len(sorted_errors_init) plt.plot(sorted_errors_init, cdf_init, r--, linewidth2, label粗定位) plt.xlabel(定位误差 (米)); plt.ylabel(累积概率); plt.title(误差累积分布函数 (CDF)); plt.legend(); plt.grid(True, alpha0.3) plt.tight_layout() plt.show()运行这段代码你会看到三张图网络布局对比、误差分布直方图和误差CDF曲线。通过调整num_anchors、communication_range、n、sigma等参数你可以直观地观察不同因素对定位精度的影响这正是数学建模中“灵敏度分析”的雏形。记住在竞赛中将这种分析过程和数据结果清晰地呈现在论文里是获得高分的关键。