2026年美赛A题时序预测模型讲解
这种实现方式满足了题目对"连续时间模型"的核心要求,避免了纯离散拟合或黑箱机器学习方法,同时保持了模型的物理可解释性。其中:SOC为电量百分比,P_total为总功耗(瓦特),E为电池能量(瓦时),η_age为老化系数。这一步骤的作用是将长时间序列数据分割为多个独立的放电实验,每个周期都可以用于模型训练和验证。由于原始数据是连续记录的,包含多次充放电过程,需要识别出独立的放电周期用于模型训练。通过
要求一:连续时间模型构建与验证
智能手机电池耗电建模 - 代码实现思路详解
一、总体思路概述
本代码实现了一个基于连续时间微分方程的智能手机电池耗电模型。核心思想是从能量守恒出发,建立SOC(电量状态)随时间变化的微分方程,并通过实际数据进行参数估计和模型验证。
核心方程:dSOC/dt = -100 × P_total / (E × η_age)
其中:SOC为电量百分比,P_total为总功耗(瓦特),E为电池能量(瓦时),η_age为老化系数。
实现流程总览:
|
步骤 |
内容 |
目的 |
|
步骤1 |
数据预处理 |
加载数据、时间转换、创建指示变量、添加电池参数 |
|
步骤2 |
放电周期识别 |
从连续数据中分离出独立的放电过程 |
|
步骤3 |
线性回归估计 |
通过OLS获得功耗参数的初始估计值 |
|
步骤4 |
非线性优化 |
使用ODE求解器精确优化参数 |
|
步骤5 |
模型验证 |
对比预测与实际SOC,计算误差指标 |
|
步骤6 |
可视化 |
生成验证图表,展示模型性能 |
二、步骤1:数据预处理
2.1 数据加载与合并
代码首先加载四个CSV数据文件,并进行合并:
battery.csv:包含电池电量(level)、状态(status)、时间戳(time)等信息
bluetooth.csv:包含蓝牙连接检测信息(detected)
participant_info.csv:包含用户信息、手机型号(model)、使用习惯(phone_use)、手机年龄(phone_age)
通过pid(用户ID)和time字段将这些数据合并为一个完整的数据集。
2.2 时间处理
将时间戳转换为相对小时数,便于后续的微分方程求解:
hours = (time - time_min).total_seconds() / 3600
2.3 创建指示变量
根据原始数据创建模型所需的状态指示变量:
|
变量 |
含义 |
计算方式 |
|
S |
屏幕活跃状态 |
status包含'in use'则为1,否则为0 |
|
B |
蓝牙连接状态 |
detected不为'None Detected'则为1,否则为0 |
|
U |
用户使用强度 |
根据phone_use映射:<30min→0.1, 30min-1h→0.3, 1-2h→0.5, 2-3h→0.7, >3h→1.0 |
2.4 添加电池参数
根据手机型号查表获取电池规格参数:
Q (容量):电池容量,单位mAh
V (电压):标称电压,单位V
E (能量):电池能量 = Q × V / 1000,单位Wh
2.5 计算老化系数
电池老化会降低有效容量,通过老化系数η_age来修正:
η_age = 1 - α × T_age
其中α=0.08为年衰减率,T_age为手机使用年限(根据phone_age字段映射得到)。
三、步骤2:放电周期识别
由于原始数据是连续记录的,包含多次充放电过程,需要识别出独立的放电周期用于模型训练。
识别规则:当SOC上升超过5%时,认为发生了充电事件,标记为新周期的开始。每个周期至少需要5个数据点才被认为是有效周期。
这一步骤的作用是将长时间序列数据分割为多个独立的放电实验,每个周期都可以用于模型训练和验证。
四、步骤3-4:参数估计
4.1 功耗模型
总功耗被分解为多个组件:
P_total = P_base + P_active × S + P_BT × B + P_usage × U
|
参数 |
物理含义 |
|
P_base |
基础功耗:设备待机时的最小功耗 |
|
P_active |
屏幕活跃功耗:屏幕点亮和活跃使用时的额外功耗 |
|
P_BT |
蓝牙功耗:蓝牙连接时的额外功耗 |
|
P_usage |
使用强度功耗:与用户日常使用强度相关的功耗 |
4.2 方法A:线性回归初估
将微分方程离散化后,可以转化为线性回归问题:
Y = -dSOC × E × η_age / (100 × dt) ≈ P_active × S + P_BT × B + P_usage × U
通过OLS(普通最小二乘法)可以快速获得参数的初始估计值。这一步为后续的非线性优化提供良好的起点。
4.3 方法B:非线性最小二乘优化
以OLS结果为初值,使用L-BFGS-B优化算法最小化预测误差:
目标函数 = Σ(SOC_actual - SOC_pred)² / N
其中SOC_pred通过求解ODE(常微分方程)得到。优化过程中对参数设置了合理的边界约束,确保物理意义的合理性。
4.4 ODE求解过程
对于每个放电周期,使用scipy.integrate.odeint求解微分方程:
1. 创建状态变量的插值函数S(t), B(t), U(t),使得连续时间求解成为可能
2. 以周期起始SOC为初始条件
3. 在给定时间点上积分求解,得到预测的SOC曲线
4. 将预测值裁剪到[0, 100]范围内
五、步骤5:模型验证
使用优化后的参数,对每个放电周期进行预测,并计算误差指标:
|
指标 |
公式 |
含义 |
|
RMSE |
√[Σ(actual-pred)²/N] |
均方根误差,单位% |
|
MAE |
Σ|actual-pred|/N |
平均绝对误差,单位% |
通过对比多个放电周期的误差,可以评估模型在不同条件下的表现,识别模型的优势和局限性。
六、步骤6:可视化输出
代码生成两类可视化图表:
6.1 单周期详细验证图(4子图)
图1 - SOC对比图:实际SOC vs 预测SOC随时间变化曲线
图2 - 误差图:预测误差(实际-预测)随时间变化,显示RMSE和MAE
图3 - 状态变量图:S(t), B(t), U(t)三个状态变量的时间序列
图4 - 瞬时功率图:估计的总功率P_total(t)随时间变化
6.2 所有周期综合验证图
将所有放电周期的实际和预测SOC曲线绑制在同一张图上,便于整体评估模型性能。每个周期用不同颜色区分,实线表示实际值,虚线表示预测值。
七、代码结构总结
整个代码实现遵循"从简单到复杂"的建模原则:
1. 首先建立基于能量守恒的连续时间微分方程框架
2. 将功耗分解为可解释的物理组件
3. 使用两阶段参数估计(线性回归 + 非线性优化)确保稳定收敛
4. 通过多周期验证评估模型泛化能力
5. 生成丰富的可视化输出便于结果解释
这种实现方式满足了题目对"连续时间模型"的核心要求,避免了纯离散拟合或黑箱机器学习方法,同时保持了模型的物理可解释性。
更多推荐


所有评论(0)