要求一:连续时间模型构建与验证

智能手机电池耗电建模 - 代码实现思路详解

一、总体思路概述

本代码实现了一个基于连续时间微分方程的智能手机电池耗电模型。核心思想是从能量守恒出发,建立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. 生成丰富的可视化输出便于结果解释

这种实现方式满足了题目对"连续时间模型"的核心要求,避免了纯离散拟合或黑箱机器学习方法,同时保持了模型的物理可解释性。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐