第十六届“华中杯”大学生数学建模挑战赛(B题)深度剖析|建模完整过程+详细思路+代码全解析

第十六届“华中杯”大学生数学建模挑战赛(B题)深度剖析|建模完整过程+详细思路+代码全解析

码农世界 2024-06-19 后端 80 次浏览 0个评论

问题1

问题1的建模过程如下:

假设信号灯周期固定不变,且已知所有车辆的行车轨迹,我们可以建立如下模型来估计信号灯的红绿周期:

首先,我们需要定义一些符号:

  • T s i g n a l T_{signal} Tsignal​:信号灯的红绿周期,单位为秒
  • T t r a c k T_{track} Ttrack​:车辆行车轨迹数据的采样间隔,单位为秒
  • t i t_{i} ti​:第i个车辆的行车轨迹数据的时间点,单位为秒
  • x i ( t ) x_{i}(t) xi​(t):第i个车辆在时间点t时的X坐标,单位为米
  • y i ( t ) y_{i}(t) yi​(t):第i个车辆在时间点t时的Y坐标,单位为米
  • v i ( t ) v_{i}(t) vi​(t):第i个车辆在时间点t时的速度,单位为米/秒
  • a i ( t ) a_{i}(t) ai​(t):第i个车辆在时间点t时的加速度,单位为米/秒²

    根据信号灯的红绿周期,我们可以将每个周期分成两个阶段:红灯阶段和绿灯阶段。假设红灯阶段的时长为 T r e d T_{red} Tred​,绿灯阶段的时长为 T g r e e n T_{green} Tgreen​,且 T r e d + T g r e e n = T s i g n a l T_{red}+T_{green}=T_{signal} Tred​+Tgreen​=Tsignal​。

    为了估计信号灯的红绿周期,我们需要从车辆行车轨迹数据中找出每个周期的红灯阶段和绿灯阶段。假设某个车辆在某一周期的某个时间点 t i t_{i} ti​处于红灯阶段,那么它在 t i + T r e d t_{i}+T_{red} ti​+Tred​时应该处于绿灯阶段。同理,如果它在 t i t_{i} ti​处于绿灯阶段,那么它在 t i + T g r e e n t_{i}+T_{green} ti​+Tgreen​时应该处于红灯阶段。

    因此,我们可以通过以下公式来判断车辆在某个时间点处于红灯阶段还是绿灯阶段:

    r i ( t ) = { 1 , i f t i   m o d   T s i g n a l < T r e d 0 , i f t i   m o d   T s i g n a l ≥ T r e d \begin{equation} r_{i}(t)=\left\{ \begin{aligned} 1,\quad if\quad t_{i}\bmod T_{signal}1,ifti​modTsignal​

    其中, r i ( t ) r_{i}(t) ri​(t)为某个车辆在时间点t是否处于红灯阶段的指示变量。如果 r i ( t ) = 1 r_{i}(t)=1 ri​(t)=1,表示该车辆在时间点t处于红灯阶段;如果 r i ( t ) = 0 r_{i}(t)=0 ri​(t)=0,表示该车辆在时间点t处于绿灯阶段。

    然后,我们可以通过计算每个周期内红灯阶段的时长和绿灯阶段的时长来估计信号灯的红绿周期。假设在某个周期内,有n辆车处于红灯阶段,m辆车处于绿灯阶段,那么该周期的红灯阶段时长和绿灯阶段时长分别为:

    T r e d = 1 n ∑ i = 1 n T t r a c k ( r i ( t ) = 1 ) T_{red}=\frac{1}{n}\sum_{i=1}^{n}T_{track}(r_{i}(t)=1) Tred​=n1​i=1∑n​Ttrack​(ri​(t)=1)

    T g r e e n = 1 m ∑ i = 1 m T t r a c k ( r i ( t ) = 0 ) T_{green}=\frac{1}{m}\sum_{i=1}^{m}T_{track}(r_{i}(t)=0) Tgreen​=m1​i=1∑m​Ttrack​(ri​(t)=0)

    其中, T t r a c k ( r i ( t ) = 1 ) T_{track}(r_{i}(t)=1) Ttrack​(ri​(t)=1)表示在 r i ( t ) = 1 r_{i}(t)=1 ri​(t)=1时,第i个车辆的行车轨迹数据的采样间隔。

    最后,我们可以通过取所有周期的平均值来估计信号灯的红绿周期:

    T s i g n a l = 1 N ∑ j = 1 N ( T r e d + T g r e e n ) T_{signal}=\frac{1}{N}\sum_{j=1}^{N}(T_{red}+T_{green}) Tsignal​=N1​j=1∑N​(Tred​+Tgreen​)

    其中,N为总周期数。

    综上所述,我们可以通过车辆行车轨迹数据来估计信号灯的红绿周期,具体的计算步骤如下:

    1. 遍历所有车辆,根据公式(1)来判断每个时间点处于红灯阶段还是绿灯阶段。
    2. 对每个周期,统计处于红灯阶段的车辆数n和处于绿灯阶段的车辆数m,计算红灯阶段时长 T r e d T_{red} Tred​和绿灯阶段时长 T g r e e n T_{green} Tgreen​。
    3. 对所有周期,计算 T s i g n a l T_{signal} Tsignal​的平均值,即为信号灯的红绿周期的估计值。

    1.建立模型

    假设信号灯的周期为T,车辆行驶速度为v,则车辆通过一个信号灯的周期为T/v,即车辆通过一个信号灯需要的时间。假设一个路口的所有车辆轨迹数据为D,其中包含n辆车,每辆车经过T/v的时间间隔为t1,t2,…,tn,则按照顺序通过信号灯的时间为t1,t1+t2,…,t1+t2+…+tn,记为s1,s2,…,sn。则根据信号灯周期T的定义,可以得到以下公式:

    T = 1 n ∑ i = 1 n s i T=\frac{1}{n}\sum_{i=1}^{n}s_i T=n1​i=1∑n​si​

    其中,n为车辆数,s为经过信号灯的时间间隔。

    2.估计信号灯的红绿周期

    根据步骤1中的公式,可以通过D中所有车辆经过信号灯的时间间隔的平均值来估计信号灯的红绿周期T。即:

    T = 1 n ∑ i = 1 n s i T=\frac{1}{n}\sum_{i=1}^{n}s_i T=n1​i=1∑n​si​

    3.填入表1

    根据步骤2中求得的信号灯周期T,可以填入表1中相应的位置。

    4.影响因素讨论

    (1) 样本车辆比例:样本车辆比例越大,表示数据的覆盖范围越广,可以更准确的估计信号灯的周期。

    (2) 车流量:车流量越大,表示数据量越大,可以更准确的估计信号灯的周期。

    (3) 定位误差:定位误差会影响车辆经过信号灯的时间间隔的精确度,从而影响信号灯周期的估计精度。定位误差越小,估计的信号灯周期越准确。

    5.求解方法

    根据步骤2中的公式,可以通过求取所有车辆经过信号灯的时间间隔的平均值来估计信号灯的周期。如果数据量大,可以采用数值求解的方法,通过迭代计算来求取最优解。如果数据量较小,也可以采用解析求解的方法,通过对步骤2中的公式进行化简,得到更简洁的表达式来求解信号灯周期。

    6.结论

    通过以上建模和求解方法,可以根据车辆行驶轨迹数据来估计信号灯的周期,为电子地图服务商提供更准确的信号灯信息,从而为司机提供更好的导航服务。同时,根据影响因素的讨论,可以提出相应的改进措施来提高信号灯周期的估计精度。

    python示例代码如下:

    import pandas as pd
    import numpy as np
    # 读取轨迹数据文件
    df = pd.read_csv('附件1.csv')
    # 预处理数据,去除重复数据和异常数据
    df = df.drop_duplicates()
    df = df[df['X'] >= 0]
    df = df[df['Y'] >= 0]
    # 将轨迹数据按照时间戳从小到大排序
    df = df.sort_values(by='Time')
    # 定义函数来判断车辆是否在信号灯的影响范围内
    def in_range(x, y):
        if x <= 100 and y <= 100:
            return True
        else:
            return False
    # 遍历每个车辆的轨迹数据,记录每个时间点车辆的位置和信号灯状态
    # 1表示红灯,0表示绿灯
    status = []
    for index, row in df.iterrows():
        if in_range(row['X'], row['Y']):
            if row['X'] <= 50:
                status.append(1)
            else:
                status.append(0)
        else:
            status.append(-1)
    # 计算每个周期内红灯和绿灯的时间
    t1 = 0
    t2 = 0
    for i in range(len(status)):
        if status[i] == 1:
            t1 += 1
        elif status[i] == 0:
            t2 += 1
        else:
            continue
    # 计算信号灯周期T
    T = t1 + t2
    # 输出结果
    print("路口信号灯的周期为{}秒,其中红灯时间为{}秒,绿灯时间为{}秒。".format(T, t1, t2))
    

    问题2

    问题2的建模过程如下:

    在建立模型时,我们可以假设信号灯的周期为 T T T,而每个车辆在通过路口时,会记录下其经过路口的时间 t i t_i ti​。根据题目描述,我们假设所有的信号灯只有红、绿两种状态,且每次变换状态的时刻 t i t_i ti​都是整数倍的 T T T。因此,我们可以根据每个车辆通过路口的时间 t i t_i ti​来判断其所处的信号灯状态。

    首先,我们可以定义一个函数 f ( t ) f(t) f(t)来表示信号灯状态的变化,如果在 t t t时刻,信号灯为绿灯,则 f ( t ) = 1 f(t)=1 f(t)=1,如果为红灯,则 f ( t ) = 0 f(t)=0 f(t)=0。根据题目所给的数据,我们可以得到每个车辆通过路口时,信号灯的状态变化序列 { f ( t i ) } \{f(t_i)\} {f(ti​)}。

    接着,我们需要对信号灯的周期 T T T进行估计。由于信号灯的周期是固定不变的,我们可以假设在某段时间内,通过某个路口的所有车辆的平均速度 v v v是固定的。那么,在这段时间内,通过路口的每辆车所花费的时间 t i t_i ti​应该是相同的,即 t i = d i v t_i=\frac{d_i}{v} ti​=vdi​​,其中 d i d_i di​为第 i i i辆车通过路口所走的距离。

    根据题目所给的数据,我们可以得到每个车辆通过路口所走的距离 d i d_i di​,因此,我们可以得到每个车辆通过路口所花费的时间 t i t_i ti​。由于我们假设信号灯的状态变化时刻 t i t_i ti​为整数倍的 T T T,因此我们可以通过求解最小二乘法来估计出信号灯的周期 T T T,具体的公式如下:

    T = 1 N ∑ i = 1 N ( t i − d i v ) 2 T=\frac{1}{N}\sum_{i=1}^N(t_i-\frac{d_i}{v})^2 T=N1​i=1∑N​(ti​−vdi​​)2

    其中, N N N为通过该路口的车辆数量, t i t_i ti​为第 i i i辆车通过路口所花费的时间, d i d_i di​为第 i i i辆车通过路口所走的距离, v v v为通过该路口的所有车辆的平均速度。

    在估计信号灯的周期 T T T时,我们假设通过某个路口的所有车辆的平均速度 v v v是固定的。但实际上,通过该路口的车辆的平均速度 v v v是会受到车流量的影响的。因此,如果车流量较大,会导致通过该路口的车辆的平均速度 v v v变慢,从而影响到信号灯周期的估计精度。因此,我们可以引入一个车流量的参数 α \alpha α,来表示车流量对信号灯周期估计的影响。具体的公式如下:

    T = 1 N ∑ i = 1 N ( t i − d i v − α ) 2 T=\frac{1}{N}\sum_{i=1}^N(t_i-\frac{d_i}{v-\alpha})^2 T=N1​i=1∑N​(ti​−v−αdi​​)2

    其中, N N N为通过该路口的车辆数量, t i t_i ti​为第 i i i辆车通过路口所花费的时间, d i d_i di​为第 i i i辆车通过路口所走的距离, v v v为通过该路口的所有车辆的平均速度, α \alpha α为车流量对信号灯周期估计的影响参数。

    另外,由于轨迹数据存在定位误差,误差大小未知。因此,我们还可以引入一个定位误差的参数 β \beta β,来表示定位误差对信号灯周期估计的影响。具体的公式如下:

    T = 1 N ∑ i = 1 N ( t i − d i v − α − β ) 2 T=\frac{1}{N}\sum_{i=1}^N(t_i-\frac{d_i}{v-\alpha-\beta})^2 T=N1​i=1∑N​(ti​−v−α−βdi​​)2

    其中, N N N为通过该路口的车辆数量, t i t_i ti​为第 i i i辆车通过路口所花费的时间, d i d_i di​为第 i i i辆车通过路口所走的距离, v v v为通过该路口的所有车辆的平均速度, α \alpha α为车流量对信号灯周期估计的影响参数, β \beta β为定位误差对信号灯周期估计的影响参数。

    因此,我们可以通过求解最小二乘法来估计出信号灯的周期 T T T,并通过调整车流量参数 α \alpha α和定位误差参数 β \beta β来提高信号灯周期估计的精度。

    1. 建立模型

      假设每个信号灯都有固定的红绿周期T,我们可以通过观察车辆的行车轨迹来估计信号灯的周期。假设路口有N个车道,每个车道有M辆车同时通行,车辆的行车轨迹可以表示为一个N*M的矩阵。如果我们将这个矩阵按照时间点和车道来排序,那么在每个时间点,每个车道上都会有一辆车通过,这样就可以观察到车辆通过路口的时间间隔,从而估计信号灯的周期。

    2. 公式解释

      假设第i个车道上第j辆车通过路口的时间点为 t i j t_{ij} tij​,那么在第k个时间点,第i个车道上通过的第j辆车的时间点为 t i j k t_{ij}^{k} tijk​,则该车道的周期可以表示为:

      T i = 1 M ∑ j = 1 M ( t i j k + 1 − t i j k ) T_i = \frac{1}{M}\sum_{j=1}^{M}(t_{ij}^{k+1} - t_{ij}^{k}) Ti​=M1​j=1∑M​(tijk+1​−tijk​)

      其中, k = 0 , 1 , 2 , . . . , N − 1 k=0,1,2,...,N-1 k=0,1,2,...,N−1,即我们选择N个时间点来估计周期, M M M为每个时间点通过的车辆数。

    3. 影响因素分析

      (1) 样本车辆比例

      样本车辆比例指的是我们能够获取的车辆轨迹数据占所有车辆的比例。当样本车辆比例较低时,我们观察到的车辆通过路口的时间间隔可能不够充分,从而导致估计的周期不准确。因此,样本车辆比例越高,我们估计的周期越准确。

      (2) 车流量

      车流量指的是单位时间内通过路口的车辆数量。当车流量较大时,路口的拥堵情况会影响车辆通过的时间间隔,从而导致估计的周期不准确。因此,车流量越大,我们估计的周期越不准确。

      (3) 定位误差

      定位误差指的是车辆的实际位置与我们观察到的位置之间的偏差。当定位误差较大时,我们观察到的时间间隔可能不准确,从而导致估计的周期不准确。因此,定位误差越小,我们估计的周期越准确。

    4. 公式推导

      假设每个车道上通过的车辆的时间间隔服从正态分布,即:

      t i j k + 1 − t i j k ∼ N ( T i , σ 2 ) t_{ij}^{k+1} - t_{ij}^{k} \sim N(T_i, \sigma^2) tijk+1​−tijk​∼N(Ti​,σ2)

      其中, T i T_i Ti​为该车道的周期, σ 2 \sigma^2 σ2为方差。则该车道的周期可以表示为:

      T i = 1 M N ∑ j = 1 M ∑ k = 0 N − 1 ( t i j k + 1 − t i j k ) T_i = \frac{1}{MN}\sum_{j=1}^{M}\sum_{k=0}^{N-1}(t_{ij}^{k+1} - t_{ij}^{k}) Ti​=MN1​j=1∑M​k=0∑N−1​(tijk+1​−tijk​)

      将每个车道的周期加权求和,得到总的周期:

      T = 1 N ∑ i = 1 N w i T i T = \frac{1}{N}\sum_{i=1}^{N}w_iT_i T=N1​i=1∑N​wi​Ti​

      其中, w i w_i wi​为第i个车道上通过的车辆数占总车辆数的比例。

    python示例代码如下:

    import numpy as np
    import pandas as pd
    from scipy.signal import find_peaks
    from scipy.signal import argrelextrema
    # 读取数据文件并转换为DataFrame格式
    data = pd.read_csv('data.csv')
    # 将数据分组,按照车辆ID和时间点进行分组
    grouped_data = data.groupby(['车辆ID', '时间点'])
    # 计算每辆车在每个时间点的位置变化量
    diff_data = grouped_data['当前位置X坐标', '当前位置Y坐标'].diff()
    # 计算每辆车在每个时间点的速度
    speed_data = diff_data / 1 # 1秒采样一次
    # 计算每个时间点所有车辆的平均速度
    mean_speed = speed_data.groupby('时间点').mean()
    # 找出平均速度的极大值和极小值,即信号灯周期的开始和结束时间点
    peaks, _ = find_peaks(mean_speed, height=0, distance=5) # distance为两个极大值之间的最小距离
    # 根据极大值和极小值的位置计算信号灯周期
    period = np.diff(peaks)
    # 输出结果
    print("信号灯周期为:", period)
    

    问题3

    第三个问题是针对附件3中6个路口的样本车辆轨迹数据,判断这些路口相应方向的信号灯周期在这段时间内是否有变化,如果有变化,求出变化的时刻和新旧周期参数,并指明识别出周期变化所需的时间和条件。

    解决问题三,首先,我们要根据附件3中6个路口的样本车辆轨迹数据,判断车辆在路口的行驶方向,即直行、左转、右转等。由于附件3中的样本车辆轨迹数据是连续的,并且时间间隔为1秒,可以通过计算车辆在相邻两个时间点的位置变化来判断车辆的行驶方向。具体的方法是,对于每一个时间点,我们可以计算车辆的速度方向,如果车辆在该时间点的速度方向和下一个时间点的速度方向一致,则车辆在该时间点为直行;如果车辆在该时间点的速度方向和下一个时间点的速度方向相差90度,则车辆在该时间点为左转;如果车辆在该时间点的速度方向和下一个时间点的速度方向相差270度,则车辆在该时间点为右转。

    根据上述方法,我们可以得到每个时间点的车辆行驶方向,进而可以判断车辆是否受到信号灯的控制。如果车辆在直行方向受到信号灯的控制,则在每个周期内,车辆应该会经过信号灯两次,一次为绿灯,一次为红灯。同理,如果车辆在左转或右转方向受到信号灯的控制,则在每个周期内,车辆也会经过信号灯两次,一次为绿灯,一次为红灯。因此,我们可以根据车辆经过信号灯的次数来判断信号灯的周期。如果车辆经过信号灯的次数为偶数,则信号灯的周期为该时间段内车辆经过信号灯的平均时间间隔;如果车辆经过信号灯的次数为奇数,则信号灯的周期为该时间段内车辆经过信号灯的最小公倍数。

    为了判断信号灯的周期是否发生变化,我们可以将时间段内的车辆行驶轨迹按照不同的时间段进行分段,然后分别计算每个时间段内车辆经过信号灯的次数,进而判断信号灯的周期是否发生变化。如果某个时间段内车辆经过信号灯的次数和上一个时间段内车辆经过信号灯的次数相差较大,则可以判断信号灯的周期发生了变化。

    假设时间段的时间间隔为T,那么识别出信号灯周期发生变化所需的时间为2T,即需要至少两个时间段的数据来判断信号灯的周期是否发生了变化。同时,为了提高判断的准确性,可以设置一个阈值,当某个时间段内车辆经过信号灯的次数和上一个时间段内车辆经过信号灯的次数相差超过该阈值时,才判断信号灯的周期发生了变化。

    综上所述,我们可以通过分析车辆行驶方向和经过信号灯的次数来判断信号灯的周期,并通过比较不同时间段内的数据来判断信号灯周期是否发生变化。最后,根据发生变化的时刻和新旧周期参数,可以得出周期变化所需的时间和条件。

    建模过程如下:

    首先,建立模型来估计信号灯周期。假设信号灯的周期为T秒,每个周期内,信号灯的状态会从红变为绿,再变回红。因此,每个周期内,信号灯的状态变化一次。假设某个路口的信号灯状态在t=0时刻变为绿灯,则在t=T/2时刻,信号灯状态会变为红灯。因此,可以用一个sin函数来表示信号灯的状态变化:

    s ( t ) = A sin ⁡ ( ω t + φ ) s(t)=A\sin(\omega t+\varphi) s(t)=Asin(ωt+φ)

    其中,A为信号灯状态的幅度, ω \omega ω为信号灯状态变化的频率, φ \varphi φ为信号灯状态变化的相位差。对于一个周期内的信号灯状态变化,可以表示为:

    s ( t ) = A sin ⁡ ( 2 π t T + φ ) s(t)=A\sin\left(\frac{2\pi t}{T}+\varphi\right) s(t)=Asin(T2πt​+φ)

    为了估计信号灯的周期,需要用到车辆的行车轨迹数据。假设某一条车道上的车辆行驶的速度为 v v v,则车辆在t时刻的位置可以表示为:

    x ( t ) = v t x(t)=vt x(t)=vt

    由于车辆的行驶速度可能会受到交通信号灯的影响,因此在t时刻,车辆在某个路口的位置可以表示为:

    x ( t ) = v t + s ( t ) x(t)=vt+s(t) x(t)=vt+s(t)

    其中, s ( t ) s(t) s(t)为信号灯的状态变化函数。假设我们可以获取某一条车道上n辆车的行车轨迹数据,则可以得到n个方程:

    x 1 ( t ) = v 1 t + s ( t ) x_1(t)=v_1t+s(t) x1​(t)=v1​t+s(t)

    x 2 ( t ) = v 2 t + s ( t ) x_2(t)=v_2t+s(t) x2​(t)=v2​t+s(t)

    ⋮ \vdots ⋮

    x n ( t ) = v n t + s ( t ) x_n(t)=v_nt+s(t) xn​(t)=vn​t+s(t)

    将这些方程联立起来,可以得到一个超定方程组:

    { x 1 ( t ) = v 1 t + A sin ⁡ ( 2 π t T + φ ) x 2 ( t ) = v 2 t + A sin ⁡ ( 2 π t T + φ ) ⋮ x n ( t ) = v n t + A sin ⁡ ( 2 π t T + φ ) \begin{cases} x_1(t)=v_1t+A\sin\left(\frac{2\pi t}{T}+\varphi\right)\\ x_2(t)=v_2t+A\sin\left(\frac{2\pi t}{T}+\varphi\right)\\ \vdots\\ x_n(t)=v_nt+A\sin\left(\frac{2\pi t}{T}+\varphi\right) \end{cases} ⎩ ⎨ ⎧​x1​(t)=v1​t+Asin(T2πt​+φ)x2​(t)=v2​t+Asin(T2πt​+φ)⋮xn​(t)=vn​t+Asin(T2πt​+φ)​

    该方程组可以用最小二乘法来求解,即最小化误差函数:

    E ( A , ω , φ ) = ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) ) 2 E(A,\omega,\varphi)=\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi))^2 E(A,ω,φ)=i=1∑n​(xi​−vi​t−Asin(ωt+φ))2

    对该误差函数求导,可以得到:

    { ∂ E ∂ A = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) ) ( − sin ⁡ ( ω t + φ ) ) = 0 ∂ E ∂ ω = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) ) ( − A cos ⁡ ( ω t + φ ) t ) = 0 ∂ E ∂ φ = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) ) ( − A cos ⁡ ( ω t + φ ) ) = 0 \begin{cases} \frac{\partial E}{\partial A}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi))(-\sin(\omega t+\varphi))=0\\ \frac{\partial E}{\partial \omega}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi))(-A\cos(\omega t+\varphi)t)=0\\ \frac{\partial E}{\partial \varphi}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi))(-A\cos(\omega t+\varphi))=0 \end{cases} ⎩ ⎨ ⎧​∂A∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ))(−sin(ωt+φ))=0∂ω∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ))(−Acos(ωt+φ)t)=0∂φ∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ))(−Acos(ωt+φ))=0​

    解得:

    { A = ∑ i = 1 n ( x i − v i t ) sin ⁡ ( ω t + φ ) ∑ i = 1 n sin ⁡ 2 ( ω t + φ ) ω = ∑ i = 1 n ( x i − v i t ) cos ⁡ ( ω t + φ ) t ∑ i = 1 n A sin ⁡ ( ω t + φ ) cos ⁡ ( ω t + φ ) t φ = 1 ω arcsin ⁡ ( ∑ i = 1 n ( x i − v i t ) A ) \begin{cases} A=\frac{\sum_{i=1}^n(x_i-v_it)\sin(\omega t+\varphi)}{\sum_{i=1}^n\sin^2(\omega t+\varphi)}\\ \omega=\frac{\sum_{i=1}^n(x_i-v_it)\cos(\omega t+\varphi)t}{\sum_{i=1}^nA\sin(\omega t+\varphi)\cos(\omega t+\varphi)t}\\ \varphi=\frac{1}{\omega}\arcsin\left(\frac{\sum_{i=1}^n(x_i-v_it)}{A}\right) \end{cases} ⎩ ⎨ ⎧​A=∑i=1n​sin2(ωt+φ)∑i=1n​(xi​−vi​t)sin(ωt+φ)​ω=∑i=1n​Asin(ωt+φ)cos(ωt+φ)t∑i=1n​(xi​−vi​t)cos(ωt+φ)t​φ=ω1​arcsin(A∑i=1n​(xi​−vi​t)​)​

    由上述公式可以求得信号灯的周期T。

    假设样本车辆的比例为p,车流量为q辆/秒,定位误差为e米。同样地,假设信号灯的状态在t=0时刻变为绿灯,则在t=T/2时刻,信号灯状态会变为红灯。同样地,可以用一个sin函数来表示信号灯的状态变化:

    s ( t ) = A sin ⁡ ( ω t + φ ) s(t)=A\sin(\omega t+\varphi) s(t)=Asin(ωt+φ)

    其中,A为信号灯状态的幅度, ω \omega ω为信号灯状态变化的频率, φ \varphi φ为信号灯状态变化的相位差。对于一个周期内的信号灯状态变化,可以表示为:

    s ( t ) = A sin ⁡ ( 2 π t T + φ ) s(t)=A\sin\left(\frac{2\pi t}{T}+\varphi\right) s(t)=Asin(T2πt​+φ)

    根据定位误差e的影响,可以得到一个新的方程组:

    { x 1 ( t ) = v 1 t + s ( t ) + e x 2 ( t ) = v 2 t + s ( t ) + e ⋮ x n ( t ) = v n t + s ( t ) + e \begin{cases} x_1(t)=v_1t+s(t)+e\\ x_2(t)=v_2t+s(t)+e\\ \vdots\\ x_n(t)=v_nt+s(t)+e \end{cases} ⎩ ⎨ ⎧​x1​(t)=v1​t+s(t)+ex2​(t)=v2​t+s(t)+e⋮xn​(t)=vn​t+s(t)+e​

    将这些方程联立起来,可以得到一个超定方程组:

    { x 1 ( t ) = v 1 t + A sin ⁡ ( 2 π t T + φ ) + e x 2 ( t ) = v 2 t + A sin ⁡ ( 2 π t T + φ ) + e ⋮ x n ( t ) = v n t + A sin ⁡ ( 2 π t T + φ ) + e \begin{cases} x_1(t)=v_1t+A\sin\left(\frac{2\pi t}{T}+\varphi\right)+e\\ x_2(t)=v_2t+A\sin\left(\frac{2\pi t}{T}+\varphi\right)+e\\ \vdots\\ x_n(t)=v_nt+A\sin\left(\frac{2\pi t}{T}+\varphi\right)+e \end{cases} ⎩ ⎨ ⎧​x1​(t)=v1​t+Asin(T2πt​+φ)+ex2​(t)=v2​t+Asin(T2πt​+φ)+e⋮xn​(t)=vn​t+Asin(T2πt​+φ)+e​

    同样地,该方程组可以用最小二乘法来求解,即最小化误差函数:

    E ( A , ω , φ ) = ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) − e ) 2 E(A,\omega,\varphi)=\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi)-e)^2 E(A,ω,φ)=i=1∑n​(xi​−vi​t−Asin(ωt+φ)−e)2

    对该误差函数求导,可以得到:

    { ∂ E ∂ A = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) − e ) ( − sin ⁡ ( ω t + φ ) ) = 0 ∂ E ∂ ω = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) − e ) ( − A cos ⁡ ( ω t + φ ) t ) = 0 ∂ E ∂ φ = 2 ∑ i = 1 n ( x i − v i t − A sin ⁡ ( ω t + φ ) − e ) ( − A cos ⁡ ( ω t + φ ) ) = 0 \begin{cases} \frac{\partial E}{\partial A}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi)-e)(-\sin(\omega t+\varphi))=0\\ \frac{\partial E}{\partial \omega}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi)-e)(-A\cos(\omega t+\varphi)t)=0\\ \frac{\partial E}{\partial \varphi}=2\sum_{i=1}^n(x_i-v_it-A\sin(\omega t+\varphi)-e)(-A\cos(\omega t+\varphi))=0 \end{cases} ⎩ ⎨ ⎧​∂A∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ)−e)(−sin(ωt+φ))=0∂ω∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ)−e)(−Acos(ωt+φ)t)=0∂φ∂E​=2∑i=1n​(xi​−vi​t−Asin(ωt+φ)−e)(−Acos(ωt+φ))=0​

    解得:

    { A = ∑ i = 1 n ( x i − v i t − e ) sin ⁡ ( ω t + φ ) ∑ i = 1 n sin ⁡ 2 ( ω t + φ ) ω = ∑ i = 1 n ( x i − v i t − e ) cos ⁡ ( ω t + φ ) t ∑ i = 1 n A sin ⁡ ( ω t + φ ) cos ⁡ ( ω t + φ ) t φ = 1 ω arcsin ⁡ ( ∑ i = 1 n ( x i − v i t − e ) A ) \begin{cases} A=\frac{\sum_{i=1}^n(x_i-v_it-e)\sin(\omega t+\varphi)}{\sum_{i=1}^n\sin^2(\omega t+\varphi)}\\ \omega=\frac{\sum_{i=1}^n(x_i-v_it-e)\cos(\omega t+\varphi)t}{\sum_{i=1}^nA\sin(\omega t+\varphi)\cos(\omega t+\varphi)t}\\ \varphi=\frac{1}{\omega}\arcsin\left(\frac{\sum_{i=1}^n(x_i-v_it-e)}{A}\right) \end{cases} ⎩ ⎨ ⎧​A=∑i=1n​sin2(ωt+φ)∑i=1n​(xi​−vi​t−e)sin(ωt+φ)​ω=∑i=1n​Asin(ωt+φ)cos(ωt+φ)t∑i=1n​(xi​−vi​t−e)cos(ωt+φ)t​φ=ω1​arcsin(A∑i=1n​(xi​−vi​t−e)​)​

    由上述公式可以求得信号灯的周期T。

    python示例代码如下:

    import numpy as np
    from scipy.optimize import least_squares
    def vehicle_positions(t, A, T, phi):
        # t: 时间
        # A: 信号灯状态的幅度
        # T: 信号灯周期
        # phi: 相位差
        v = 10  # 假设车辆速度为10米/秒
        s = A * np.sin(2 * np.pi * t / T + phi)
        return v * t + s
    # 定义最小二乘法的目标函数
    def residuals(params, t, observed_positions):
        A, T, phi = params
        model_positions = vehicle_positions(t, A, T, phi)
        return observed_positions - model_positions
    t_data = np.linspace(0, 100, 200)  # 从0到100秒的时间点,共200个
    observed_positions = vehicle_positions(t_data, 5, 40, np.pi / 4)  # 模拟观测数据
    # 使用least_squares方法来估计信号灯周期
    initial_guess = [5, 40, np.pi / 4]  # A, T, phi的初始猜测值
    result = least_squares(fun=residuals, x0=initial_guess, args=(t_data, observed_positions))
    # 输出结果
    A_est, T_est, phi_est = result.x
    print(f"Estimated Signal Light Period: {T_est} seconds")
    

    查看完整思路详见:

    【腾讯文档】第十六届“华中杯”大学生数学建模挑战赛全题目深度剖析(建模完整过程+详细思路+代码全解析+论文指导)

    https://docs.qq.com/doc/DSEpBRVpoVGZsV215

转载请注明来自码农世界,本文标题:《第十六届“华中杯”大学生数学建模挑战赛(B题)深度剖析|建模完整过程+详细思路+代码全解析》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,80人围观)参与讨论

还没有评论,来说两句吧...

Top