Mercurial Hosting > traffic-intelligence
changeset 1176:5874ece33637
reorganized fundamental diagram and added triangular
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 17 Feb 2022 10:55:11 -0500 |
parents | 35725db5e83f |
children | aa88acf06876 |
files | trafficintelligence/traffic_engineering.py |
diffstat | 1 files changed, 55 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/trafficintelligence/traffic_engineering.py Mon Jan 10 11:14:37 2022 -0500 +++ b/trafficintelligence/traffic_engineering.py Thu Feb 17 10:55:11 2022 -0500 @@ -2,6 +2,9 @@ ''' Traffic Engineering Tools and Examples''' from math import ceil +from numpy import e, log, arange + +from matplotlib.pyplot import figure,plot,xlabel,ylabel, xlim, ylim from trafficintelligence import prediction @@ -120,13 +123,29 @@ ######################### -# fundamental diagram +# fundamental diagrams ######################### class FundamentalDiagram(object): ''' ''' def __init__(self, name): self.name = name + self.kj = None + self.kc = None + self.vf = None + self.qmax = None + + def getJamDensity(self): + return self.kj + + def getCriticalDensity(self): + return self.kc + + def getCapacity(self): + return self.qmax + + def getFreeFlowSpeed(self): + return self.vf def q(self, k): return k*self.v(k) @@ -140,43 +159,65 @@ return 1/q def plotVK(self, language='fr', units={}): - from numpy import arange - from matplotlib.pyplot import figure,plot,xlabel,ylabel densities = [k for k in arange(1, self.kj+1)] figure() plot(densities, [self.v(k) for k in densities]) + xlim(xmin=0) + ylim(ymin=0) xlabel('Densite (veh/km)') # todo other languages and adapt to units ylabel('Vitesse (km/h)') def plotQK(self, language='fr', units={}): - from numpy import arange - from matplotlib.pyplot import figure,plot,xlabel,ylabel densities = [k for k in arange(1, self.kj+1)] figure() plot(densities, [self.q(k) for k in densities]) + xlim(xmin=0) + ylim(ymin=0) xlabel('Densite (veh/km)') # todo other languages and adapt to units ylabel('Debit (km/h)') +class GreenshieldsFD(FundamentalDiagram): + '''Speed is a linear function of density''' + def __init__(self, vf, kj): + FundamentalDiagram.__init__(self,'Greenshields') + self.vf=vf + self.kj=kj + self.kc=kj/2 + self.qmax=vf*kj/4 + + def v(self,k): + from numpy import log + return self.vmax*(1-k/self.kj) + + class GreenbergFD(FundamentalDiagram): '''Speed is the logarithm of density''' def __init__(self, vc, kj): FundamentalDiagram.__init__(self,'Greenberg') self.vc=vc self.kj=kj + self.qmax = self.kc*self.vc + self.kc = self.kj/e def v(self,k): - from numpy import log return self.vc*log(self.kj/k) - def criticalDensity(self): - from numpy import e - self.kc = self.kj/e - return self.kc +class TriangularFD(FundamentalDiagram): + def __init__(self, vf = None, kc = None, kj = None, qmax = None, w = None): + FundamentalDiagram.__init__(self,'Triangular') + if vf is not None and qmax is not None and kj is not None: + self.vf=vf + self.qmax = qmax + self.kj = kj + self.kc = qmax/vf + self.w = qmax/(self.kc-kj) - def capacity(self): - self.qmax = self.kc*self.vc - return self.qmax - + def v(self, k): + if k<self.kc: + return self.vf + else: + return self.vf*self.kc*(self.kj/k-1)/(self.kj-self.kc) + ######################### # intersection #########################