SJTU-SAI (2025-2026-1)-AI1807 数值分析课程大作业
一款用于运动轨迹处理的数值分析工具,具有通过微分进行速度估算、距离积分以及交互式可视化等功能。
Project for Numerical Analysis, a numerical analysis tool for motion trajectory processing, featuring velocity estimation via differentiation, distance integration, and interactive visualization.
Project_Root/
├── data/ # 数据存放目录
│ └── route_*.gpx # 原始 GPS 运动轨迹文件
├── data_loader.py # 数据加载与预处理模块
├── calculate.py # 数值计算核心模块 (微分与积分)
├── pic.py # 可视化绘图模块
├── main.py # 程序入口(主程序)
├── map_utils.py # 地图和路程可视化模块
├── ai_analysis.py # AI总结模块
├── benchmark.py # 算法运行时间测试
└── README.md # 项目说明文档
负责将原始的 GPX 文件转换为可供数值分析使用的数学序列。
核心功能:
- 解析 GPX 文件,提取经纬度、时间戳和海拔信息
- 实现 Haversine 公式,计算球面上相邻两点间的物理距离
- 暂停区间检测:自动识别时间间隔过大的数据点,将轨迹分割为多个有效运动区间
- 提取 APP 记录的原始速度数据(若存在),作为真值参考
输出:
- t_list: 时间序列 [0, t₁, t₂, ...] (单位: 秒)
- s_list: 累计距离序列 [0, s₁, s₂, ...] (单位: 米)
- valid_segments: 有效区间列表 [(start_idx, end_idx), ...]
- lats, lons, elevations: 经纬度和海拔数据
本项目的核心数学计算模块,支持分段计算以处理暂停区间。
功能 A:数值微分 (求速度,加速度)
- 采用分段计算策略:只在有效运动区间内计算速度
- 利用三点/五点微分,综合用户输入和实际数据选择微分公式
- 提供移动平均平滑功能,降低 GPS 数据中的高频噪声
功能 B:数值积分 (求路程)
- 实现自适应混合求积法:动态在辛普森公式(高精度)与梯形公式(高鲁棒性)之间切换
- 支持分段积分,忽略暂停区间内的无效数据
- 可记录积分过程中的估计值,便于误差分析
基于 matplotlib 的速度分析图形化展示模块。
核心图表:
- 速度-时间曲线:显示数值微分计算的速度曲线
- 数据对比验证:支持与 APP 原始记录速度进行对比
- 分段可视化:用垂直线标记不同运动区间的边界
轨迹地图和路程分析的可视化模块。
核心功能:
- 累计路程-时间图表:显示运动过程中的累计路程变化
- 轨迹地图显示:使用 Folium 创建交互式轨迹地图
- 分段轨迹渲染:在地图上用不同颜色标记有效运动区间
- 误差分析图表:显示数值积分估计值与实际值的误差
集成大语言模型(LLM)API 的核心交互模块,负责将数值计算结果转化为定性的自然语言报告。
-
核心功能:
- 数据摘要与采样:实现
safe_sample算法,将高密度的轨迹数据(时间、速度、距离序列)进行稀疏采样,构建符合模型上下文限制的结构化 JSON Payload。 - Prompt 工程:内置“专业运动数据分析师”系统提示词,引导 AI 从配速策略、异常检测(如 GPS 漂移)、体能分配等维度进行深度推理。
- API 封装调用:基于 OpenAI SDK 标准封装 API 请求(适配 Qwen/GPT 等模型),实现从数值数据到文本生成的自动化流程。
- 数据摘要与采样:实现
-
输出:包含核心指标概览、速度节奏分析及训练建议的 Markdown 格式报告。
基于真实数据的算法性能基准测试模块。
-
核心功能:
- 自动化测试流程:支持批量读取指定路径下的多组真实 GPX 轨迹文件(覆盖短、中、长距离场景)。
- 多轮次采样:通过多次循环(如 50 次)执行计算任务并取平均值,消除系统调度波动带来的测量误差。
-
性能指标输出:输出包含数据规模(点数 N)、总耗时(ms)及单点平均耗时(μs)的标准化测试报告,用于验证算法的
$O(N)$ 线性时间复杂度。
基于 Streamlit 的交互式 Web 应用入口。
交互功能:
- 文件选择器:自动扫描 data 目录下的 GPX 文件
- 参数调节:暂停检测阈值、平滑窗口大小等可调节参数
- 多标签页布局:速度分析、路程分析、轨迹地图分页显示
- 实时指标:总里程、估算误差、相对误差率等核心指标
- 区间信息表格:详细显示每个有效运动区间的统计信息
请安装以下依赖库:
使用 requirements.txt:
pip install -r requirements.txt或手动安装:
pip install streamlit folium streamlit-folium gpxpy matplotlib numpy openai dotenvMac: 在项目根目录下运行:
streamlit run main.pyWindows: 在项目根目录下运行:
python -m streamlit run main.py- 将 GPX 格式的运动轨迹文件放入
data/目录 - 运行上述命令启动 Web 应用
- 在左侧边栏选择要分析的运动记录文件
- 调节计算参数和显示选项
- 查看各标签页的分析结果和可视化图表
- 检测逻辑:当相邻数据点的时间间隔超过阈值(默认 5 秒)时,视为暂停记录
- 分段处理:将完整轨迹分割为多个有效运动区间,暂停区间不参与数值计算
系统支持三点法 ($O(h^2)$)与五点法 ($O(h^4)$)两种微分策略,可根据数据精度要求动态选择:
-
三点中心差商 (Standard): 适用于常规计算或数据点较少的情况。 $$ v(t_i) \approx \frac{S(t_{i+1}) - S(t_{i-1})}{t_{i+1} - t_{i-1}} $$
-
五点中心差商 (High-Precision): 利用四次插值原理,通过更多邻域点提高计算精度并平滑噪声。 $$ v(t_i) \approx \frac{-S(t_{i+2}) + 8S(t_{i+1}) - 8S(t_{i-1}) + S(t_{i-2})}{12h} $$
-
边界处理:
- 三点模式:使用向前/向后差商。
- 五点模式:在区间的边缘(起点、次起点、终点等)自动切换为非对称五点偏心公式,确保全区间的高阶精度。
-
策略:动态扫描连续时间节点,判断步长均匀性
-
均匀步长:采用辛普森公式(精度
$O(h^4)$ ):$$ \int_{t_i}^{t_{i+2}} v(t)dt \approx \frac{h}{3}[v(t_i) + 4v(t_{i+1}) + v(t_{i+2})] $$
-
非均匀步长:降级采用梯形公式(精度
$O(h^2)$ ):$$ \int_{t_i}^{t_{i+1}} v(t)dt \approx \frac{h}{2}[v(t_i) + v(t_{i+1})] $$
- 智能暂停检测:自动识别并处理运动过程中的暂停记录区间
- 分段数值计算:只在有效运动区间内进行微分和积分运算
- 多维度可视化:
- 速度-时间分析曲线
- 累计路程-时间图表
- 轨迹地图显示(起点、终点、分段轨迹)
- 误差分析图表
- 交互式界面:参数实时调节、多标签页布局、详细统计信息
- 数据验证:支持与 APP 原始记录数据进行对比验证
- AI分析:接入Qwen模型,对运动过程进行分析
- 姓名:韩岳成 骆渝骅
- 学号:524531910029 524531910035
- 课程:数值分析