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)=a1?t+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)={a21?t+b21?a22?t+b22??0≤t<tpeak?tpeak?≤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)=a1?t+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)={a21?t+b21?a22?t+b22??0≤t<tpeak?tpeak?≤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} a21?tpeak?+b21?=a22?tpeak?+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)=a2?t+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)=a3?t+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)=a2?t+b2?
(3) 支路 3: Q 3 ( t ) = a 3 t + b 3 Q_3(t) = a_3t + b_3 Q3?(t)=a3?t+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)=a1?t+b1? (或其他簡單模型)
(2) 支路 2: Q 2 ( t ) = a 2 t + b 2 Q_2(t) = a_2t + b_2 Q2?(t)=a2?t+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?[Ak?cos(T2πk?t)+Bk?sin(T2πk?t)],其中 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(根據奈奎斯特頻率)。
國獎學姐后續會更新完整論文與求解代碼,完整版請看文章下方~