基于NGSIM数据的Wiedemann99跟驰模型标定

基于NGSIM数据的wiedemann99跟驰模型标定 Including: 1. Code by Matlab; 2. 拟合优度函数(RMSPE)由SpaceHeadway & velocity组成; 3. 自己编写的IPSO(改进粒子群算法)进行求解。

最近在研究基于NGSIM数据对Wiedemann99跟驰模型进行标定,这里和大家分享下我的一些实践过程和心得。

一、整体思路

我们要利用NGSIM数据,通过特定的方法对Wiedemann99跟驰模型进行参数标定。在这个过程中,用到了Matlab编写代码,以拟合优度函数(RMSPE)作为评判标准,该函数由SpaceHeadway(间距)和velocity(速度)组成,并且采用自己编写的IPSO(改进粒子群算法)来求解模型参数。

二、Matlab代码实现

1. 数据读取与预处理

matlab 复制代码
% 假设NGSIM数据存储在一个文本文件中,格式为每一行包含车辆ID、时间、位置、速度等信息
data = readtable('ngsim_data.txt'); 
% 提取我们需要的间距和速度信息
spaceHeadway = data.SpaceHeadway; 
velocity = data.Velocity; 

这里通过readtable函数读取NGSIM数据文件,将其存储为表格形式,方便后续提取特定的列数据,也就是我们需要的间距和速度信息,为后续计算拟合优度函数做准备。

2. 定义Wiedemann99跟驰模型

matlab 复制代码
function acceleration = wiedemann99Model(spaceHeadway, velocity, params)
    % params包含模型需要标定的参数
    a = params(1); 
    b = params(2); 
    c = params(3); 
    % Wiedemann99模型公式,这里假设具体公式为以下形式
    acceleration = a * velocity + b * spaceHeadway + c; 
end

这个函数定义了Wiedemann99跟驰模型,输入间距、速度以及模型参数,返回车辆的加速度。在实际模型中,参数abc是我们需要通过标定确定的。

3. 拟合优度函数(RMSPE)

matlab 复制代码
function rmspe = calculateRMSPE(params, spaceHeadway, velocity, observedAcceleration)
    predictedAcceleration = wiedemann99Model(spaceHeadway, velocity, params); 
    % 计算预测加速度和观测加速度的相对百分比误差
    errors = (predictedAcceleration - observedAcceleration)./ observedAcceleration; 
    rmspe = sqrt(mean(errors.^2)); 
end

这个函数用来计算拟合优度RMSPE。首先根据当前的参数params通过wiedemann99Model函数得到预测加速度,然后计算预测加速度和观测加速度之间的相对百分比误差,最后对这些误差求均方根得到RMSPE。

4. 改进粒子群算法(IPSO)

matlab 复制代码
function [bestParams, bestRMSPE] = IPSO(spaceHeadway, velocity, observedAcceleration, numParticles, numIterations)
    % 初始化粒子位置和速度
    positions = rand(numParticles, 3); 
    velocities = zeros(numParticles, 3); 
    personalBestPositions = positions; 
    personalBestRMSPE = inf(numParticles, 1); 
    globalBestPosition = []; 
    globalBestRMSPE = inf; 
    
    for iter = 1:numIterations
        for i = 1:numParticles
            currentRMSPE = calculateRMSPE(positions(i, :), spaceHeadway, velocity, observedAcceleration); 
            if currentRMSPE < personalBestRMSPE(i)
                personalBestRMSPE(i) = currentRMSPE; 
                personalBestPositions(i, :) = positions(i, :); 
            end
            if currentRMSPE < globalBestRMSPE
                globalBestRMSPE = currentRMSPE; 
                globalBestPosition = positions(i, :); 
            end
        end
        % 更新粒子速度和位置
        for i = 1:numParticles
            r1 = rand(1, 3); 
            r2 = rand(1, 3); 
            velocities(i, :) = 0.7 * velocities(i, :) + 1.5 * r1.* (personalBestPositions(i, :) - positions(i, :)) + 1.5 * r2.* (globalBestPosition - positions(i, :)); 
            positions(i, :) = positions(i, :) + velocities(i, :); 
        end
    end
    bestParams = globalBestPosition; 
    bestRMSPE = globalBestRMSPE; 
end

这是改进粒子群算法的实现。开始时初始化粒子的位置和速度,每个粒子代表一组模型参数。在每次迭代中,计算每个粒子对应的RMSPE,更新粒子的个人最优位置和全局最优位置。然后根据粒子群算法的公式更新粒子的速度和位置,最终返回最优的参数和最小的RMSPE。

三、总结

通过以上Matlab代码实现,结合NGSIM数据,利用IPSO算法对Wiedemann99跟驰模型进行标定,以RMSPE作为拟合优度函数来评估模型的准确性。在实际应用中,还可以进一步优化代码和算法,比如对IPSO算法的参数进行更细致的调整,或者尝试不同的数据预处理方法,以提高模型标定的精度和效率。希望这篇博文对同样在研究相关内容的小伙伴有所帮助,大家有任何问题或者想法欢迎交流讨论。

基于NGSIM数据的wiedemann99跟驰模型标定 Including: 1. Code by Matlab; 2. 拟合优度函数(RMSPE)由SpaceHeadway & velocity组成; 3. 自己编写的IPSO(改进粒子群算法)进行求解。

相关推荐
于眠牧北16 小时前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
爱可生开源社区3 天前
MySQL 性能优化:真正重要的变量
数据库·mysql
小马爱打代码3 天前
MySQL性能优化核心:InnoDB Buffer Pool 详解
数据库·mysql·性能优化
风流 少年3 天前
mysql mcp
数据库·mysql·adb
西门吹雪分身4 天前
mysql之数据离线迁移
数据库·mysql
轩情吖4 天前
MySQL初识
android·数据库·sql·mysql·adb·存储引擎