【2025年五一数学建模竞赛】A题 解题思路与模型代码
2025年五一数学建模竞赛 A题
问题一:推测支路 1 和支路 2 的车流量
1.1 问题描述
根据提供的主路历史数据以及已知的支路车流量变化趋势(支路1呈线性增长,支路2先线性增长后线性减少),推测这两个支路在特定时间段(6:58 到 8:58)内的车流量函数。
1.2 思路分析
(1) 数据预处理:将时间点(如 6:58, 8:58)转换为数值格式,便于计算。例如,可以转换为从 6:58 开始的分钟数。假设 6:58 为 t = 0 \ t = 0 t=0,则 8:58 为 t = 120分钟。
(2) 支路 1 模型选择: 由于其车流量呈线性增长趋势,选用线性函数(一次多项式)进行拟合最为合适。模型形式为 Q 1 ( t ) = a 1 t + b 1 \ Q_1(t) = a_1t + b_1 Q1(t)=a1t+b1。
(3) 支路 2 模型选择:}该支路车流量先增后减,呈现分段线性特征。需要确定一个转折点(峰值时间点) t peak \ t_{\text{peak}} tpeak。模型形式为分段线性函数:
Q 2 ( t ) = { a 21 t + b 21 0 ≤ t < t peak a 22 t + b 22 t peak ≤ t ≤ 120 Q_2(t) = \begin{cases} a_{21}t + b_{21} & 0 \leq t < t_{\text{peak}} \\ a_{22}t + b_{22} & t_{\text{peak}} \leq t \leq 120 \end{cases} Q2(t)={a21t+b21a22t+b220≤t<tpeaktpeak≤t≤120
其中, a 21 > 0 a_{21} > 0 a21>0(增长段斜率), a 22 < 0 a_{22} < 0 a22<0(减少段斜率)。 t peak t_{\text{peak}} tpeak 的值需要根据数据或问题描述中的隐含信息来确定(例如,可能是时间段的中点,或者数据呈现峰值的时刻)。
(4) 参数估计:利用提供的主路数据(假设可以分离或推断出各支路的贡献,或者有直接的支路历史数据),使用最小二乘法拟合上述模型,确定参数 a 1 , b 1 , a 21 , b 21 , a 22 , b 22 a_1, b_1, a_{21}, b_{21}, a_{22}, b_{22} a1,b1,a21,b21,a22,b22 以及 t peak t_{\text{peak}} tpeak。
1.3 数学模型
(1) 支路 1 车流量函数:
Q 1 ( t ) = a 1 t + b 1 Q_1(t) = a_1t + b_1 Q1(t)=a1t+b1
其中 t t t 是从起始时刻(6:58)开始计算的时间(例如,以分钟为单位), a 1 a_1 a1 是增长率, b 1 b_1 b1 是初始时刻的车流量。
(2) 支路 2 车流量函数(分段线性):
Q 2 ( t ) = { a 21 t + b 21 0 ≤ t < t peak a 22 t + b 22 t peak ≤ t ≤ T end Q_2(t) = \begin{cases} a_{21}t + b_{21} & 0 \leq t < t_{\text{peak}} \\ a_{22}t + b_{22} & t_{\text{peak}} \leq t \leq T_{\text{end}} \end{cases} Q2(t)={a21t+b21a22t+b220≤t<tpeaktpeak≤t≤Tend
其中 t peak t_{\text{peak}} tpeak 是流量达到峰值的时刻, T end T_{\text{end}} Tend 是观测结束时刻对应的时间值(例如 120 分钟)。 a 21 , b 21 a_{21}, b_{21} a21,b21 是增长段的参数, a 22 , b 22 a_{22}, b_{22} a22,b22 是减少段的参数。通常需要保证函数在 t peak t_{\text{peak}} tpeak 处连续,即 a 21 t peak + b 21 = a 22 t peak + b 22 a_{21}t_{\text{peak}} + b_{21} = a_{22}t_{\text{peak}} + b_{22} a21tpeak+b21=a22tpeak+b22。
1.4 MATLAB 代码
% 假设 time_minutes 是时间点向量 (单位: 分钟, 0 到 120)
% 假设 flow_branch1 是支路1的历史车流量数据向量
% 假设 flow_branch2 是支路2的历史车流量数据向量
% 假设 t_peak_index 是数据中峰值点对应的索引% 支路1: 线性拟合
params_branch1 = polyfit(time_minutes, flow_branch1, 1); % 1表示线性 (一次多项式)
a1 = params_branch1(1);
b1 = params_branch1(2);
Q1_fit = polyval(params_branch1, time_minutes); % 计算拟合值fprintf('支路1模型: Q1(t) = %.4f * t + %.4f\n', a1, b1);% 支路2: 分段线性拟合
% 确定转折点 t_peak (假设已知或通过数据找到)
% 例如,假设 t_peak 是第 k 个时间点 time_minutes(k)
t_peak_val = time_minutes(t_peak_index);% 第一段 (增长段) 拟合
time1 = time_minutes(1:t_peak_index);
flow1 = flow_branch2(1:t_peak_index);
params1_branch2 = polyfit(time1, flow1, 1);
a21 = params1_branch2(1);
b21 = params1_branch2(2);% 第二段 (减少段) 拟合
time2 = time_minutes(t_peak_index:end); % 注意包含转折点
flow2 = flow_branch2(t_peak_index:end);
params2_branch2 = polyfit(time2, flow2, 1);
a22 = params2_branch2(1);
b22 = params2_branch2(2);fprintf('支路2模型 (增长段): Q2(t) = %.4f * t + %.4f (t < %.1f)\n', a21, b21, t_peak_val);
fprintf('支路2模型 (减少段): Q2(t) = %.4f * t + %.4f (t >= %.1f)\n', a22, b22, t_peak_val);% 计算支路2拟合值
Q2_fit = zeros(size(time_minutes));
Q2_fit(1:t_peak_index-1) = polyval(params1_branch2, time_minutes(1:t_peak_index-1));
Q2_fit(t_peak_index:end) = polyval(params2_branch2, time_minutes(t_peak_index:end));% 可选:绘制拟合结果
figure;
subplot(2,1,1); plot(time_minutes, flow_branch1, 'o', time_minutes, Q1_fit, '-'); title('支路1 车流量'); xlabel('时间 (分钟)'); ylabel('车流量'); legend('数据', '拟合');
subplot(2,1,2); plot(time_minutes, flow_branch2, 'o', time_minutes, Q2_fit, '-'); title('支路2 车流量'); xlabel('时间 (分钟)'); ylabel('车流量'); legend('数据', '拟合');
1.5 Python 示例代码
import numpy as np
import matplotlib.pyplot as plt# 假设 time_minutes 是时间点数组 (单位: 分钟, 0 到 120)
# 假设 flow_branch1 是支路1的历史车流量数据数组
# 假设 flow_branch2 是支路2的历史车流量数据数组
# 假设 t_peak_index 是数据中峰值点对应的索引# 支路1: 线性拟合
params_branch1 = np.polyfit(time_minutes, flow_branch1, 1) # 1表示线性
a1, b1 = params_branch1
Q1_fit = np.polyval(params_branch1, time_minutes) # 计算拟合值print(f'支路1模型: Q1(t) = {a1:.4f} * t + {b1:.4f}')# 支路2: 分段线性拟合
# 确定转折点 t_peak
t_peak_val = time_minutes[t_peak_index]# 第一段 (增长段) 拟合
time1 = time_minutes[:t_peak_index]
flow1 = flow_branch2[:t_peak_index]
params1_branch2 = np.polyfit(time1, flow1, 1)
a21, b21 = params1_branch2# 第二段 (减少段) 拟合
time2 = time_minutes[t_peak_index:] # 注意包含转折点
flow2 = flow_branch2[t_peak_index:]
params2_branch2 = np.polyfit(time2, flow2, 1)
a22, b22 = params2_branch2print(f'支路2模型 (增长段): Q2(t) = {a21:.4f} * t + {b21:.4f} (t < {t_peak_val:.1f})')
print(f'支路2模型 (减少段): Q2(t) = {a22:.4f} * t + {b22:.4f} (t >= {t_peak_val:.1f})')# 计算支路2拟合值
Q2_fit = np.zeros_like(time_minutes, dtype=float)
Q2_fit[:t_peak_index] = np.polyval(params1_branch2, time_minutes[:t_peak_index])
Q2_fit[t_peak_index:] = np.polyval(params2_branch2, time_minutes[t_peak_index:])# 可选:绘制拟合结果
plt.figure(figsize=(8, 6))
plt.subplot(2, 1, 1)
plt.plot(time_minutes, flow_branch1, 'o', label='数据')
plt.plot(time_minutes, Q1_fit, '-', label='拟合')
plt.title('支路1 车流量')
plt.xlabel('时间 (分钟)')
plt.ylabel('车流量')
plt.legend()
plt.grid(True)plt.subplot(2, 1, 2)
plt.plot(time_minutes, flow_branch2, 'o', label='数据')
plt.plot(time_minutes, Q2_fit, '-', label='拟合')
plt.title('支路2 车流量')
plt.xlabel('时间 (分钟)')
plt.ylabel('车流量')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()
2 问题二:推测多支路 (支路 1, 2, 3, 4) 的车流量
2.1 问题描述
需要推测四个支路的车流量函数,这些支路具有不同的变化规律(如:稳定、线性增长、线性减少、周期性)。数据提供了主路车流量记录(可能需要分解或假设已知各支路数据)。
知各支路数据)。
2.2 思路分析
(1) 确定各支路趋势: 根据问题描述,为每个支路确定其变化模式。
- 支路 1 (稳定): 车流量近似为常数。
- 支路 2 (线性): 同问题 1 的支路 2,使用线性函数。
- 支路 3 (线性): 使用分段线性函数。
- 支路 4 (周期性): 车流量随时间呈周期性波动,可能需要使用三角函数(如正弦、余弦)或傅里叶级数来建模。
(2) 选择合适的模型: - 支路 1: Q 1 ( t ) = C 1 Q_1(t) = C_1 Q1(t)=C1 (常数模型)
- 支路 2: Q 2 ( t ) = a 2 t + b 2 ( a 2 > 0 ) Q_2(t) = a_2t + b_2 \quad (a_2 > 0) Q2(t)=a2t+b2(a2>0)
- 支路 3: Q 3 ( t ) = a 3 t + b 3 ( a 3 < 0 ) Q_3(t) = a_3t + b_3 \quad (a_3 < 0) Q3(t)=a3t+b3(a3<0)
- 支路 4: Q 4 ( t ) = A sin ( ω t + ϕ ) + C 4 Q_4(t) = A \sin(\omega t + \phi) + C_4 Q4(t)=Asin(ωt+ϕ)+C4 或 Q 4 ( t ) = A cos ( ω t + ϕ ) + C 4 Q_4(t) = A \cos(\omega t + \phi) + C_4 Q4(t)=Acos(ωt+ϕ)+C4其中 A A A 是振幅, ω = 2 π T \omega = \frac{2\pi}{T} ω=T2π 是角频率( T T T 是周期), ϕ \phi ϕ 是相位, C 4 C_4 C4 是平均流量(垂直偏移)。如果周期性模式复杂,可能需要更高阶的傅里叶项。
(3) 参数估计:对每个支路,使用对应的历史数据和选定的模型,通过最小二乘法或其他拟合技术(如非线性最小二乘法对周期模型)估计模型参数。
2.3 数学模型
(1) 支路 1: Q 1 ( t ) = C 1 Q_1(t) = C_1 Q1(t)=C1
(2) 支路 2: Q 2 ( t ) = a 2 t + b 2 Q_2(t) = a_2t + b_2 Q2(t)=a2t+b2
(3) 支路 3: Q 3 ( t ) = a 3 t + b 3 Q_3(t) = a_3t + b_3 Q3(t)=a3t+b3
(4) 支路 4 (正弦模型): Q 4 ( t ) = A sin ( 2 π T t + ϕ ) + C 4 Q_4(t) = A \sin\left(\frac{2\pi}{T}t + \phi\right) + C_4 Q4(t)=Asin(T2πt+ϕ)+C4
3 问题三:考虑交通信号灯影响下的车流量推测
3.1 问题描述
在一个特殊路段,支路 3 的车流量受到周期为 18 个时间单位(假设是分钟)的交通信号灯控制。需要推测支路 1、2、3 在此情况下的车流量。支路 1 和 2 的趋势与之前类似(可能是线性或其他简单模式)。
3.2 思路分析
(1) 支路 1 和 2:沿用之前的建模方法(例如线性模型 a t + b at + b at+b)。
(2) 支路 3(信号灯控制):车流量会呈现周期性,周期 T = 18 T = 18 T=18。在一个周期内,流量可能在绿灯时段为一个较高值(可能非恒定,有启动和饱和过程),在红灯时段为零或接近零。
(3) 建模支路 3:
- 方法一(简化模型):将周期内的行为理想化。例如,假设绿灯持续 T green T_{\text{green}} Tgreen 分钟,红灯 T red T_{\text{red}} Tred 分钟( T green + T red = 18 T_{\text{green}} + T_{\text{red}} = 18 Tgreen+Tred=18)。模型可以是一个周期性方波函数,或者更平滑的周期函数。例如,可以拟合一个傅里叶级数,其基频对应周期 18。
- 方法二(数据驱动):计算每个数据点时间 t t t 对应的周期内时间 t cycle = t ( mod 18 ) t_{\text{cycle}} = t \ (\text{mod}\ 18) tcycle=t (mod 18)。然后绘制 Q 3 Q_3 Q3 vs t cycle t_{\text{cycle}} tcycle 的散点图,观察一个周期内的流量模式。根据这个模式选择合适的函数(可能是分段函数、平滑脉冲函数等)来拟合。
(4) 参数估计:对支路 1 和 2 使用线性拟合。对支路 3,根据所选模型进行拟合。如果是傅里叶级数,确定需要的谐波次数;如果是自定义周期函数,拟合其参数。
3.3 数学模型
(1) 支路 1: Q 1 ( t ) = a 1 t + b 1 Q_1(t) = a_1t + b_1 Q1(t)=a1t+b1 (或其他简单模型)
(2) 支路 2: Q 2 ( t ) = a 2 t + b 2 Q_2(t) = a_2t + b_2 Q2(t)=a2t+b2 (或其他简单模型)
(3) 支路 3 (周期模型):
- 傅里叶级数形式: Q 3 ( t ) ≈ C 0 + ∑ k = 1 N [ A k cos ( 2 π k T t ) + B k sin ( 2 π k T t ) ] Q_3(t) \approx C_0 + \sum_{k=1}^{N} \left[ A_k \cos\left(\frac{2\pi k}{T} t\right) + B_k \sin\left(\frac{2\pi k}{T} t\right) \right] Q3(t)≈C0+k=1∑N[Akcos(T2πkt)+Bksin(T2πkt)],其中 T = 18 T = 18 T=18。
- 基于周期内时间 t cycle = t ( mod 18 ) t_{\text{cycle}} = t \ (\text{mod}\ 18) tcycle=t (mod 18) 的函数: Q 3 ( t ) = f ( t ( mod 18 ) ) Q_3(t) = f(t \ (\text{mod}\ 18)) Q3(t)=f(t (mod 18)),函数 f ( x ) f(x) f(x) 描述了在一个周期 x ∈ [ 0 , 18 ) x \in [0,18) x∈[0,18) 内的流量变化模式,需要根据数据拟合。
4 问题四:推测数据误差
4.1 问题描述
考虑到监测设备可能存在误差,要求在有误差的数据基础上,推测“实际”的车流量。可能需要描述误差的特性或修正数据。
4.2 思路分析
(1) 理解误差:误差可能是随机的(噪声),也可能是系统性的(偏差)。问题可能给出误差范围(如 ±5%)或类型(如高斯噪声)。
(2) 误差建模/处理:
- 随机噪声:如果假设误差是零均值的随机噪声,那么之前通过拟合得到的平滑曲线(如 Q fit ( t ) Q_{\text{fit}}(t) Qfit(t))可以被视为对“实际”车流量 Q true ( t ) Q_{\text{true}}(t) Qtrue(t) 的估计。拟合过程本身就有平滑噪声的作用。可以使用数据平滑技术(如移动平均、Savitzky-Golay 滤波器)预处理数据,然后再进行拟合。
- 系统偏差:如果存在已知的系统偏差(例如,设备总是多报 5%),则可以在得到拟合函数 Q fit ( t ) Q_{\text{fit}}(t) Qfit(t) 后进行修正,例如 Q corrected ( t ) = Q fit ( t ) / 1.05 Q_{\text{corrected}}(t) = Q_{\text{fit}}(t)/1.05 Qcorrected(t)=Qfit(t)/1.05。
- 误差范围:如果只知道误差范围,可以给出实际流量的置信区间。例如,如果误差是 ±δ,则实际流量可能在 [ Q fit ( t ) − δ , Q fit ( t ) + δ ] [Q_{\text{fit}}(t) - \delta, Q_{\text{fit}}(t) + \delta] [Qfit(t)−δ,Qfit(t)+δ] 范围内。
- 推测误差特性:可以分析残差 e ( t ) = Q measured ( t ) − Q fit ( t ) e(t) = Q_{\text{measured}}(t) - Q_{\text{fit}}(t) e(t)=Qmeasured(t)−Qfit(t),检查其分布、自相关性等,以推断误差的性质(是否随机、是否有特定模式)。
(3) 鲁棒拟合:如果数据中存在少量异常值(可能是大的测量错误),可以使用鲁棒拟合方法(Robust Fitting),这种方法对异常值的敏感度较低。
4.3 数学模型
(1) 观测模型: Q measured ( t ) = Q true ( t ) + ϵ ( t ) Q_{\text{measured}}(t) = Q_{\text{true}}(t) + \epsilon(t) Qmeasured(t)=Qtrue(t)+ϵ(t),其中 ϵ ( t ) \epsilon(t) ϵ(t) 是误差项。
(2) 目标:估计 Q true ( t ) Q_{\text{true}}(t) Qtrue(t)。
(3) 方法:通过拟合得到 Q ^ true ( t ) = Q fit ( t ) \hat{Q}_{\text{true}}(t) = Q_{\text{fit}}(t) Q^true(t)=Qfit(t)。
(4) 误差分析:研究残差 e ( t ) = Q measured ( t ) − Q fit ( t ) e(t) = Q_{\text{measured}}(t) - Q_{\text{fit}}(t) e(t)=Qmeasured(t)−Qfit(t)。例如,计算残差的标准差 σ e \sigma_e σe 作为误差大小的度量。
(5) 置信区间(假设误差 ϵ ∼ N ( 0 , σ 2 ) \epsilon \sim N(0, \sigma^2) ϵ∼N(0,σ2) 且 σ \sigma σ 已知或估计): Q true ( t ) Q_{\text{true}}(t) Qtrue(t) 的 ( 1 − α ) (1-\alpha) (1−α) 置信区间近似为 Q fit ( t ) ± z α / 2 × S E ( Q fit ( t ) ) Q_{\text{fit}}(t) \pm z_{\alpha/2} \times SE(Q_{\text{fit}}(t)) Qfit(t)±zα/2×SE(Qfit(t)),其中 S E SE SE 是拟合值的标准误。
5 问题五:确定最少需要记录的数据时刻
5.1 问题描述
为了能够推测出完整的车流量函数(例如问题 1-3 中描述的那些),最少需要记录哪些时刻的数据?
5.2 思路分析
(1) 模型复杂度决定:所需最少数据点数取决于要拟合的模型的自由度(参数个数)。一个有 k k k 个参数的模型至少需要 k k k 个独立的数据点才能唯一确定参数(理论上)。为了获得可靠的拟合和评估拟合优度,通常需要 n > k n > k n>k 个点。
(2) 识别关键特征点:数据记录的时刻应该能够捕捉到函数的主要特征。
-
对于线性模型( a t + b , k = 2 at + b, k = 2 at+b,k=2):至少需要 2 个不同时刻的点。为了更好地确定直线,通常选择时间段的开始和结束点,或者分布均匀的几个点。
-
对于分段线性模型(如问题 1 支路 2,假设 2 段,每段 2 个参数,加转折点位置,共 5 个参数;或转折点已知,则 4 个参数):需要覆盖每一段,并能确定转折点的位置。至少需要在转折点附近以及每段的内部取点。例如,开始点、结束点、转折点、每段中间点。
-
对于周期模型(如正弦 A sin ( ω t + ϕ ) + C , k = 4 A \sin(\omega t + \phi) + C, k = 4 Asin(ωt+ϕ)+C,k=4):需要覆盖至少一个完整周期,并能捕捉到峰值、谷值和过零点(或均值点)等特征。理论上 4 个点可能够,但为了确定周期 T T T(或频率 ω \omega ω)和相位 ϕ \phi ϕ,通常需要更多点,特别是在一个周期内分布均匀的点,以及跨越多个周期的点来确认周期性。奈奎斯特采样定理指出,要无失真地恢复周期信号,采样频率至少是信号最高频率的两倍。
-
对于常数模型( C , k = 1 C, k = 1 C,k=1):理论上 1 个点就够,但为了确认稳定性,需要多个点。
(3) 策略: -
根据每个支路预期的函数形式,确定其模型参数个数 k k k。
-
选择 n ≥ k n \geq k n≥k 个能反映函数形态的关键时刻点。这些点应包括:时间段的起点和终点、预期的极值点(峰值、谷值)、趋势改变点(如分段模型的转折点)、周期性特征点(如正弦波的特定相位点)。
-
如果模型复杂或数据有噪声,需要更多的点来保证拟合的稳定性和准确性。
5.3 数学模型(概念)
(1) 模型参数数量 k k k。
(2) 所需最少数据点数 n min = k n_{\text{min}} = k nmin=k(理论下限)。
(3) 实际推荐点数 n rec > k n_{\text{rec}} > k nrec>k。
(4) 关键点选择: t start , t end , t peak , t valley , t inflection t_{\text{start}}, t_{\text{end}}, t_{\text{peak}}, t_{\text{valley}}, t_{\text{inflection}} tstart,tend,tpeak,tvalley,tinflection 等。
(5) 对于周期 T T T 的信号,采样时间间隔 Δ t < T / 2 \Delta t < T/2 Δt<T/2(根据奈奎斯特频率)。
国奖学姐后续会更新完整论文与求解代码,完整版请看文章下方~