Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %-------------------------------------------------------------------------%
- %%----------------Hito 2: Simulación de tráfico--------------------------%%
- %-------------------------------------------------------------------------%
- % ---- Parametros constantes ---- %
- qc = 3000; % ----- flujo critico
- vc = 120; % ----- vel. maxima/crític
- kc = 25; % ----- dens. critica (qc/vc)
- kmax = 100; % ----- dens. máxima
- kmax_via = 60; % ----- dens. max en la via
- L = 5; % ----- longitud por celda
- numCeldas = 5; % ----- numero de celdas (No confundir con longitud)
- At = 1/120; % ----- incremento de tiempo (horas)
- t = 7:At:10; % ----- vector de tiempo
- f = length(t); % ----- longitud del vector t
- % ---- Iniciar matrices ---- %
- q0 = zeros(1,f); % ----- flujo auxiliar
- Q0 = zeros(1,f); % ----- flujo auxiliar
- k0 = zeros(1,f); % ----- dens. auxiliar
- n = zeros(numCeldas,f); % ----- num vehiculos
- k = zeros(numCeldas,f); % ----- densidad vehiculos
- q = zeros(numCeldas,f); % ----- flujo de vehiculos saliente (real)
- Q = zeros(numCeldas,f); % ----- flujo de vehiculos (teorico)
- %% --- Simulacion 1: sin semaforos --- %
- for j = 1:f % Avance del tiempo
- for i = 1:numCeldas % Avance en secciones de via
- k(i,j) = n(i, j)/L; % Calculo densidad
- Q(i,j) = funcTrafico(k(i,j), kc, kmax, qc); % calculo flujo
- if i < 5 % flujo en cada celda
- q(i,j) = min(Q(i,j), (kmax_via*L - n(i+1,j)) / At); % tras imponer restricción de flujo por otras celdas, obtenemos el flujo real
- else
- q(i,j) = Q(i,j); % cel 5 no esta limitada por la cap. de otra celda, por lo que se simplifica a esto
- end
- % para la celda auxiliar (la celda "cero") usaremos variables independientes de las otras usadas, como sugiere la doc.
- if i == 1 % la celda ficticia alimenta a la 1a celda real, empezamos por esa celda
- qentrada(j) = 4000*exp(-(t(j) - 8) ^2); % función de demanda conocida como e(t) (se comporta en función de un pulso gaussiano)
- if k0(j) > 0
- Q0(j) = qentrada(j) + k0(j)*L / At; % si esta celda ficticia acumula vehiculos, se incrementa el flujo para añadirlos al arco lo antes posible
- else
- Q0(j) = qentrada(j); % si es insuficiente, se almacena
- end
- q0(j) = min(Q0(j), (kmax_via*L - n(1,j)) / At); % se impone restriccion y se obtiene un flujo "real"
- k0(j+1) = k0(j) + (qentrada(j) - q0(j))*At / L; % actualizamos el valor de la densidad
- n(i,j+1) = n(i,j) + (q0(j) - q(i,j))*At; % finalmente se ejecuta la ecuación de la ev. del tráfico.
- else
- % ecuacion que rige la evolución del trafico, ejecutada al final del bloque (pero para el resto de celdas)
- n(i,j+1) = n(i,j) + (q(i-1,j) - q(i,j))*At;
- end
- end
- end
- nsum_nosem = sum(n(:,1:f), 1); % sacar cuantos vehiculos hay en total en cada celda, en func del tiempo
- qarco_nosem = q(numCeldas, 1:f); % sacar flujo de salida del arco en func del tiempo
- % reinicio de variables para ejecutar de nuevo la sim con el semaforo
- q0 = zeros(1,f);
- Q0 = zeros(1,f);
- k0 = zeros(1,f);
- n = zeros(numCeldas,f);
- k = zeros(numCeldas,f);
- q = zeros(numCeldas,f);
- Q = zeros(numCeldas,f);
- %% ------ Simulación con semáforo ------ %
- for j = 1:f
- for i = 1:numCeldas
- k(i, j) = n(i, j)/L;
- Q(i,j) = funcTrafico(k(i, j), kc, kmax, qc);
- % Se implementa funcSemaforo. El semaforo se coloca en la ultima region. Impone nuevas restricciones en la ultima celda
- if i < 5
- q(i,j) = min(Q(i,j), (kmax_via*L - n(i+1, j)) / At);
- else
- q(i,j) = min(Q(i,j), funcSemaforo(t(j))); % en vez del caso por defecto se implementa la funcSemaforo que limita el flujo de la celda 5
- end
- % de nuevo, el caso especial de celdas ficticias
- if i == 1
- qentrada(j) = 4000*exp(-(t(j) - 8) ^2);
- if k0(j) > 0
- Q0(j) = qentrada(j) + k0(j)*L / At;
- else
- Q0(j) = qentrada(j);
- end
- q0(j) = min(Q0(j), (kmax_via*L - n(1,j)) / At);
- k0(j+1) = k0(j) + (qentrada(j) - q0(j))*At / L;
- n(i,j+1) = n(i,j) + (q0(j) - q(i,j))*At;
- else
- n(i,j+1) = n(i,j) + (q(i-1,j) - q(i,j))*At;
- end
- end
- end
- nsum_sem = sum(n(:,1:f), 1);
- qarco_sem = q(numCeldas, 1:f);
- %% ----- Plot de los datos ----- %
- figure(1)
- subplot(2,1,1)
- plot(t, nsum_nosem, 'b');
- title('Num vehiculos tot. en el arco en func. del tiempo');
- ylabel('Vehículos/hora');
- hold on
- subplot(2,1,2)
- plot(t, qarco_nosem, 'b');
- title('Flujo de salida del arco en func. del tiempo');
- ylabel('Vehículos/hora');
- hold off
- saveas(figure(1), 'figura1sinSemaforo.png');
- figure(2)
- subplot(2,1,1)
- plot(t, nsum_nosem, 'b');
- hold on;
- plot(t, nsum_sem, 'r');
- title('Num vehiculos tot. en el arco en func. del tiempo');
- ylabel('Vehículos/hora');
- % --- juntos
- subplot(2,1,2)
- plot(t, qarco_nosem, 'b');
- hold on;
- plot(t, qarco_sem, 'r');
- title('Flujo de salida del arco en func. del tiempo');
- ylabel('Vehículos/hora');
- legend('Sin semáforo', 'Con semáforo');
- saveas(figure(2), 'figura2comparaSemaforo.png');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement