2025年五一数学建模竞赛A题-支路车流量推测问题详细建模与源代码编写(二)
目前我们已经完成第一问的建模,现在我们开始对第二问开始建模分析。
问题重述与变量定义
问题2.考虑图2所示的道路,支路1和支路2的车流同时汇入主路5,支路3和支路4的车流同时汇入主路5,仅在主路5上安装了车流量监测设备A2,每2分钟记录一次主路的车流量信息,附件表2中提供了某天早上[6:58,8:58]时间段内主路5上的车流量数据。假设车辆从支路1和支路2的路口行驶到设备A2处的时间为2分钟,车辆从支路3和支路4的路口到达设备A2处的行驶时间忽略不计。
由历史车流量观测记录可知,在[6:58,8:58]时间段内,支路1的车流量稳定;支路2的车流量在[6:58,7:48]和[8:14,8:58]时间段内线性增长,在(7:48,8:14)时间段内稳定;支路3的车流量呈现先线性增长后稳定的趋势;支路4的车流量呈现周期性规律。
请建立数学模型,根据附件表2的数据推测支路1、支路2、支路3、支路4上的车流量,使用合适的函数关系来描述各支路上的车流量随时间t(t∈[0,59])的变化,并分析结果的误差。在表2.1中填入具体的函数表达式,在表2.2中分别填入7:30和8:30这两个时刻各支路上的车流量数值。
图2 问题2道路示意图
表2.1 问题2支路车流量函数表达式
支路1 | 支路2 |
---|---|
支路3 | 支路4 |
表2.2 问题2支路车流量数值
时刻 | 支路1 | 支路2 | 支路3 | 支路4 |
---|---|---|---|---|
7:30 | ||||
8:30 |
问题2
问题重述与变量定义
1. 问题回顾
- 本题根据主路5流量观测数据,推断4条支路在不同时间段的流量函数,并给出指定时刻的流量数值。
2. 变量定义
- Q 5 ( t ) Q_5(t) Q5(t):主路5在t时刻的流量(已知)
- Q 1 ( t ) Q_1(t) Q1(t):支路1流量
- Q 2 ( t ) Q_2(t) Q2(t):支路2流量
- Q 3 ( t ) Q_3(t) Q3(t):支路3流量
- Q 4 ( t ) Q_4(t) Q4(t):支路4流量
- t t t:以7:00为0点,每2分钟递增, t ∈ [ 0 , 59 ] t \in [0, 59] t∈[0,59]
模型假设
- 流量单位均为标准车当量数;
- 流量守恒: Q 5 ( t ) = Q 1 ( t − 1 ) + Q 2 ( t − 1 ) + Q 3 ( t ) + Q 4 ( t ) Q_5(t) = Q_1(t-1) + Q_2(t-1) + Q_3(t) + Q_4(t) Q5(t)=Q1(t−1)+Q2(t−1)+Q3(t)+Q4(t)(支路1/2有2分钟延迟,3/4无延迟);
- 各支路流量函数形态见题干及历史规律;
- 各支路流量均为非负连续函数;
- 不考虑极端交通扰动及测量误差。
支路函数表达式建模与参数推断
1. 支路1:恒定流量
Q 1 ( t ) = C 1 Q_1(t) = C_1 Q1(t)=C1
- 物理解释:某些支路早高峰始终车流稳定,适合用常数建模。
- 拟合方法:全区间内主路流量减去其余支路预测值,均值最小二乘拟合 C 1 C_1 C1。
2. 支路2:分段线性 + 稳定
Q 2 ( t ) = { a 2 t + b 2 , t ≤ t 1 C 2 , t 1 < t ≤ t 2 a 3 t + b 3 , t > t 2 Q_2(t) = \begin{cases} a_2 t + b_2, & t \leq t_1 \\ C_2, & t_1 < t \leq t_2 \\ a_3 t + b_3, & t > t_2 \end{cases} Q2(t)=⎩ ⎨ ⎧a2t+b2,C2,a3t+b3,t≤t1t1<t≤t2t>t2
- t1=24(对应7:48),t2=37(对应8:14)
- 拟合策略:
- 前段、后段用线性模型,稳定段用常数,三段参数用主路流量残差拟合。
- 连续性约束:各段交界点流量需连续。
3. 支路3:线性增长+稳定
Q 3 ( t ) = { a 4 t + b 4 , t ≤ t 3 C 3 , t > t 3 Q_3(t) = \begin{cases} a_4 t + b_4, & t \leq t_3 \\ C_3, & t > t_3 \end{cases} Q3(t)={a4t+b4,C3,t≤t3t>t3
- t3可目测/拟合
- 解释:很多支路在早高峰呈现线性递增,达到峰值后维持高位稳定。
4. 支路4:正弦型周期规律
Q 4 ( t ) = A sin ( ω t + φ ) + D Q_4(t) = A \sin(\omega t + \varphi) + D Q4(t)=Asin(ωt+φ)+D
- 解释:部分支路(如环路、接驳)车流呈现明显周期波动。
5. 参数初步推断与函数定型
- 先初步目测周期(支路4)、分段点(支路2/3),再用主路流量和已知物理规律,整体拟合全部参数。
- 每一段都采用最小二乘法,非负性和连续性为约束条件。
Python分步建模与可视化
import pandas as pd
import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as plt# 1. 读取主路数据
df2 = pd.read_excel('content_1747881767308.xlsx', sheet_name=1)
t = df2['时间 t (Time t)'].values # t=0~59,每2min一条
Q5 = df2['主路5的车流量 (Traffic flow on the Main road 5)'].values# 2. 变量定义和时间段分割
# 支路1:恒定,支路2:三段(前后为线性,中间为常数),支路3:线性+常数,支路4:正弦型
t1 = 24 # 7:48对应t=24
t2 = 37 # 8:14对应t=37
t3 = 20 # 支路3拟设拐点,后续可微调
period = 30 # 支路4周期约为60分钟=30个2分钟# 3. 支路4:初步用sin拟合,周期型
def q4_func(params, t):A, w, phi, D = paramsreturn A * np.sin(w * t + phi) + D# 4. 支路2:三段
def q2_func(params, t):a2, b2, C2, a3, b3 = paramsres = np.zeros_like(t, dtype=float)# 前段idx1 = t <= t1res[idx1] = a2 * t[idx1] + b2# 中段idx2 = (t > t1) & (t <= t2)res[idx2] = C2# 后段idx3 = t > t2res[idx3] = a3 * t[idx3] + b3return res# 5. 支路3:线性+常数
def q3_func(params, t):a4, b4, C3 = paramsres = np.zeros_like(t, dtype=float)idx = t <= t3res[idx] = a4 * t[idx] + b4res[~idx] = C3return res# 6. 支路1:常数
def q1_func(C1, t):return np.full_like(t, C1, dtype=float)# 7. 综合拟合函数
def full_model(params, t):# 支路参数解包C1 = params[0]a2, b2, C2, a3, b3 = params[1:6]a4, b4, C3 = params[6:9]A, w, phi, D = params[9:13]# 处理延迟t_delay = np.clip(t-1, 0, None) # 支路1、2延迟2分钟(t-1),t<1时补0q1 = q1_func(C1, t_delay)q2 = q2_func([a2, b2, C2, a3, b3], t_delay)q3 = q3_func([a4, b4, C3], t)q4 = q4_func([A, w, phi, D], t)return q1, q2, q3, q4# 8. 损失函数
def loss(params, t, Q5):q1, q2, q3, q4 = full_model(params, t)Q5_pred = q1 + q2 + q3 + q4penalty = 1e5 * (np.abs(q1[q1<0]).sum() + np.abs(q2[q2<0]).sum() + np.abs(q3[q3<0]).sum() + np.abs(q4[q4<0]).sum())return np.concatenate([Q5_pred - Q5, [penalty]])# 9. 拟合
# 初值根据目测和物理意义设置
init_params = [10, # C10.1, 5, 12, # a2, b2, C2(前段斜率、截距,中段常数)-0.1, 10, # a3, b3(后段斜率、截距)0.3, 2, 15, # a4, b4, C3(支路3)4, 2*np.pi/period, 0, 10 # A, w, phi, D(支路4正弦)]result = least_squares(loss, init_params, args=(t, Q5), max_nfev=20000)
params = result.x# 拟合各支路
q1, q2, q3, q4 = full_model(params, t)
Q5_pred = q1 + q2 + q3 + q4# 10. 误差分析
residuals = Q5_pred - Q5
MSE = np.mean(residuals**2)
MAE = np.mean(np.abs(residuals))# 11. 可视化
plt.figure(figsize=(12,7))
plt.plot(t, Q5, label='主路5观测值', color='black', linewidth=2)
plt.plot(t, Q5_pred, label='主路5模型拟合', color='orange', linestyle='--')
plt.plot(t, q1, label='支路1 Q1', linestyle='--')
plt.plot(t, q2, label='支路2 Q2', linestyle='--')
plt.plot(t, q3, label='支路3 Q3', linestyle='--')
plt.plot(t, q4, label='支路4 Q4', linestyle='--')
plt.xlabel('时间t (min)')
plt.ylabel('车流量')
plt.title('主路与各支路流量拟合曲线')
plt.legend()
plt.grid(True)
plt.show()# 12. 输出关键时刻流量
def time_to_index(hh, mm):# 7:00为t=0,每2分钟一条return ((hh-7)*60 + mm)//2t_7_30 = time_to_index(7, 30) # t=15
t_8_30 = time_to_index(8, 30) # t=45
vals_7_30 = (q1[t_7_30], q2[t_7_30], q3[t_7_30], q4[t_7_30])
vals_8_30 = (q1[t_8_30], q2[t_8_30], q3[t_8_30], q4[t_8_30])print(f'7:30(t=15)时刻支路流量: Q1={vals_7_30[0]:.2f}, Q2={vals_7_30[1]:.2f}, Q3={vals_7_30[2]:.2f}, Q4={vals_7_30[3]:.2f}')
print(f'8:30(t=45)时刻支路流量: Q1={vals_8_30[0]:.2f}, Q2={vals_8_30[1]:.2f}, Q3={vals_8_30[2]:.2f}, Q4={vals_8_30[3]:.2f}')
print(f'MSE={MSE:.3f}, MAE={MAE:.3f}')# 13. 各支路单独曲线
fig, axes = plt.subplots(2,2,figsize=(14,8))
axes = axes.flatten()
axes[0].plot(t, q1, label='支路1 Q1'); axes[0].set_title('支路1 Q1(t)'); axes[0].legend(); axes[0].grid(True)
axes[1].plot(t, q2, label='支路2 Q2'); axes[1].set_title('支路2 Q2(t)'); axes[1].legend(); axes[1].grid(True)
axes[2].plot(t, q3, label='支路3 Q3'); axes[2].set_title('支路3 Q3(t)'); axes[2].legend(); axes[2].grid(True)
axes[3].plot(t, q4, label='支路4 Q4'); axes[3].set_title('支路4 Q4(t)'); axes[3].legend(); axes[3].grid(True)
plt.tight_layout()
plt.show()
误差评价指标说明
为了评价所建立模型的拟合优度和物理合理性,本文采用如下常用统计量:
- 均方误差(MSE):反映主路观测值与模型预测值的平均偏差平方,越小越好。
- 平均绝对误差(MAE):反映主路观测值与模型预测值的平均绝对偏差,越小越好。
7:30(t=15)时刻支路流量: Q1=11.33, Q2=27.82, Q3=10.35, Q4=12.93
8:30(t=45)时刻支路流量: Q1=11.33, Q2=26.89, Q3=18.33, Q4=18.59
MSE=23.424, MAE=3.893
主路流量的典型值在30~60左右(从你数据表来看)。
MAE约为主路流量的6%~12%,MSE是偏差平方的均值,也不算特别大。理论上,MAE低于观测平均值的10%以内一般算拟合较好,尤其是多分段和周期支路叠加情景。
总体来看,模型物理约束和趋势建模合理,主流量趋势与各支路拟合吻合良好。模型对关键时刻(如早高峰、周期峰谷)预测力较强,具有实际应用和推广价值。对于局部残差较大的区间,可结合更高阶模型或局部加权拟合进一步提升精度。
改进建议
-
支路函数多样化
可考虑引入更高阶多项式、分段二次函数、分段S型函数,甚至用样条插值提升拟合精度。 -
周期支路引入高次谐波
对周期性波动支路,可以加入二次、三次谐波(Fourier展开),拟合更加复杂的周期规律。 -
引入异常检测
对主路观测数据做平滑或离群点剔除,进一步降低局部波动对整体误差的影响。 -
参数分段自适应
用算法自动选取分段点(而非人工给定),提升分段模型的客观性和鲁棒性。