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
 #########################