Académique Documents
Professionnel Documents
Culture Documents
TER
MASTER SITN
2013
1 Introduction
Au cours de ce projet nous allons nous interesser à une catégorie de systèmes que l’on peut
modéliser mathématiquement : les systèmes d’attente.
On peut schématiser un système (ou phénomène) d’attente comme suit : les clients arrivent
dans le système et sont accueillis dans l’espace d’attente. Après avoir passé l’éventuelle file d’at-
tente, ils accèdent à l’espace de service, où se trouvent un ou plusieurs postes de service que le
client souhaite consulter avant de sortir du système.
On réalisera une étude théorique d’un certain type de systèmes d’attente adaptés à la situa-
tion à laquelle on s’interesse : la gestion des feux de circulation. Puis on passera à l’application
en programmant des simulations de tels systèmes avec scilab. On implémentera également une
interface graphique rudimentaire.
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 4
Un système se décrit donc comme suit : A/B/s/N ; le dernier symbole est supprimé si le
système à une capacité infinie (aucun client ne sera jamais refusé).
On introduit également :
– λ le taux des arrivées (nombre moyen d’arrivées par unité de temps) ;
– λ1 l’intervalle de temps moyen séparant deux arrivées consécutives ;
– µ le taux de service (nombre moyen de clients servis par unité de temps) ;
– µ1 durée moyenne du temps de service.
On peut déjà imaginer un début de modélisation au moyen d’un système M/M/1 d’une
situation de traffic routier : le poste de service est le feu de circulation, les clients sont les
voitures qui souhaitent passer, la file d’attente est la chaussée jusqu’au feu.
Une fois qu’on a la distribution stationnaire du processus, on peut calculer les caractéristiques
d’exploitation du système :
– le nombre moyen de clients dans le système, L = E[X] ;
– la durée d’attente d’un client ;
– la durée de séjour dans le système (temps d’attente et durée de service) ;
– le taux d’occupation des postes de service ;
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 5
– le pourcentage de clients ayant pu être servis (on s’interesse à des systèmes de capacité
infinie donc le problème ne se pose pas) ;
– la durée d’une periode d’activité, c’est à dire l’intervalle de temps pendant lequel il y a
toujours au moins un client dans le système.
On note pij (∆t) = P(X(t + ∆t) = j | X(t) = i) la probabilité conditionnelle que X(t) fasse
une trainsition de i vers j pendant la durée ∆t. Ces probabilités de transition ne dépendent pas
de l’instant t, uniquement de ∆t.
• pn,n+1 (∆t) = P(exactement une arrivée pendant ∆t) × P(aucun départ pendant ∆t | X(t) ≥ 1)
= (λ∆t + o(∆t)) × (1 − µ∆t + o(∆t))
= (λ∆t) × (1 − µ∆t) + o(∆t)
= λ∆t + o(∆t)
• pn,n (∆t) = P(exactement une arrivée pendant ∆t) × P(exactement un départ pendant ∆t | X(t) ≥ 1)
+ P(aucune arrivée pendant ∆t) × P(aucun départ pendant ∆t | X(t) ≥ 1)
= λ∆t.µ∆t + (1 − λ∆t)(1 − µ∆t) + o(∆t)
= 1 − (λ + µ)∆t + o(∆t) (n ≥ 1)
• p0,0 (∆t) = P(aucune arrivée pendant ∆t)
= 1 − λ∆t + o(∆t)
• pn+1,n (∆t) = P(aucune arrivée pendant ∆t) × P(un départ pendant ∆t | X(t) ≥ 1)
= (1 − λ∆t).µ∆t + o(∆t)
= µ∆t + o(∆t) (n ≥ 0)
• pn,m (∆t) = o(∆t) |m − n| ≥ 2
La dernière ligne signifie qu’à partir d’un etat donné n, le processus ne peut donc que passer à
l’un des états voisins n + 1 et n − 1 ou rester sur place.
Pour exprimer les probabilités d’état pn (t) on utilise la formule des probabilités totales
P(A) = i∈I P(A|Bi )P(Bi ) ce qui donne ici et pour n ≥ 1 :
P
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 6
∞
X
pn (t + ∆t) = pi (t).pi,n (∆t)
i=0
= pn−1 (t).λ∆t + pn (t)[1 − (λ + µ)∆t] + pn+1 (t).µ∆t + o(∆t)
On obtient donc :
pn (t+∆t)−pn (t)
∆t = −(λ + µ).pn (t) + λ.pn−1 (t) + µ.pn+1 (t) + o(∆t).∆t
Ces equations sont nommées equations différentielles de Kolmogorov ; ici leur résolution fait
intervenir les fonctions de Bessel qui dépassent le cadre de nos compétences et de ce TER.
lim p0 (t) =0
t→∞ n
En additionnant, on obtient
µ.pn+1 = λ.pn
D’où
λ
pn = p0 .( )n
µ
∞ ∞
X X λ
Ce qui donne, avec λ < µ : 1 = pn ⇐⇒ 1 = p0 . ( )n
n=0 n=0
µ
1
⇐⇒ 1 = p0 . λ
1− µ
λ
⇐⇒ p0 = 1 −
µ
D’où
λ λ n
pn = (1 − ).( )
µ µ
On constate que le régime stationnaire du système d’attente M/M/1 est gouverné par la vari-
ante de loi géométrique de paramètre 1 − µλ .
Ces grandeurs sont liées entre elles par les relations suivantes :
L = λe .W
Lq = λe .Wq
1
W = Wq +
µ
λe
L = Lq +
µ
Où λe est le taux d’entrée des clients dans le système. Dans le cas du système M/M/1,
λe = λ car la capacité d’accueil est infinie. Les deux premières relations sont appelées formules
de Little.
∞
(
0 si X = 0 X
• Xq = Lq = E(Xq ) = (n − 1).pn
X − 1 si X > 1 n=1
∞
%n−1 )0
X
2
= (1 − %).% .(
n=1
λ2
=
µ.(µ − λ)
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 8
Lq λ
• Wq = λ = µ.(µ−λ)
1 1
• W = Wq + µ = µ−λ
2.4.1 Q>1
Si le coefficient d’utilisation est strictement supérieur à 1 (ici λ = 3, µ = 1.7), il n’y a pas
de régime stationnaire, le système s’engorge et le nombre de clients présents dans le système
augmente sans arrêt.
La trajectoire de X
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 9
2.4.2 Q=1
Si Q = 1 (ici λ = 2, µ = 2), le système commence à se stabiliser : il n’y a plus d’engorge-
ment, la file d’attente ne fait pas que augmenter. Néanmoins il est difficile de parler de régime
stationnaire ; le système est en régime critique.
Plusieurs trajectoires de X
On a tracé plusieurs courbes pour illustrer le fait que les trajectoires peuvent être bornées
(plus d’engorgement). Cependant on ne peut pas vraiment prévoir avec précision le nombre de
clients dans le système à un moment donné.
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 10
2.4.3 Q<1
Si Q < 1 (ici λ = 1.7, µ = 3), le système admet un régime stationnaire. En plus des deux
graphiques similaires aux sections précédentes, on inclut un histogramme de Xt qui montre
une distribution géométrique conformément aux résultats théoriques (c.f. 2.2.3), ainsi qu’une
trajectoire avec un état initial différent (X0 = 50), où l’on voit qu’en environ 50 unités de temps
on revient au régime stationnaire.
La vitesse à laquelle le système revient à une trajectoire classique dépend de la valeur de Q :
plus Q est proche de zéro plus le système revient vite à une trajectoire qui ne prend plus en
compte les conditions initiales.
Condition initiale : X0 = 0
Condition initiale : X0 = 50
2 ETUDE THÉORIQUE DES SYSTÈMES D’ATTENTE 11
Il considère ici que la durée pendant laquelle un feu est au vert doit être au moins égale à
la durée laissant passer le nombre moyen de véhicules arrivés pendant un cycle. Il n’y a donc
3 LA SITUATION ROUTIÈRE DE DANIEL FLIPO 13
théoriquement que très peu de chance que le système s’engorge, il faudrait que le flux d’arrivée
se comporte pendant longtemps largement au dessus sa moyenne.
On peut discuter le fait que ces différentes minorations de d1 et d2 ne prennent pas en compte
la distance entre le feu et le véhicule qui démarre, l’auteur considérant que chaque voiture dé-
marre directement du feu.
Ceci est contrebalancé par le fait que le coefficient appliqué à a est la durée totale d’un cycle
(le feu reste au vert assez longtemps pour laisser passer le nombre théorique moyen d’arrivants
pendant la durée qu’il passe au rouge ET au vert). Néanmoins dans certaines simulations on a
rencontré des (rares) cas où ces inégalités s’avèrent insuffisantes.
On pourra aussi (par exemple) influencer le fonctionnement du système dans l’autre sens en
augmentant artificiellement le temps a de réaction d’un automobiliste avant de démarrer afin de
prendre en compte la distance moyenne qui le sépare du feu dans la file d’attente.
Dans le premier cas on sait que les instants d’arrivée suivent une loi exponentielle de
paramètre λ, il s’agit donc d’estimer ce paramètre. Pour cela on utilise la méthode du max-
imum de vraisemblance :
Pn
−λxi
L(x1 , ..., xi , ..., xn ; λ) = ni=1 λe −λxi n Qn −λxi = λn e
Q
Pn = λ i=1 e i=1
−λ x
L(x1 , ..., xi , ..., xn ; λ) = λn e i=1 i
Pn
ln L(x1 , ..., xi , ..., xn ; λ) = ln λn e−λ i=1 xi
ln L(x1 , ..., xi , ..., xn ; λ) = n ln λ − λ ni=1 xi
P
Dans le second cas, le nombre de voitures passées à intervalles réguliers suit une loi de Poisson,
dont l’estimateur par la méthode du maximum de vraissemblance est sans biais. On le calcule :
x
L(x1 , ..., xi , ..., xn ; λ) = ni=1 e−λ λxi i!
Q
x
L(x1 , ..., xi , ..., xn ; λ) = e−λn ni=1 λxi i!
Q
x
ln L(x1 , ..., xi , ..., xn ; λ) = ln e−λn + ln ni=1 λxi i!
Q
x
ln L(x1 , ..., xi , ..., xn ; λ) = −λn + ni=1 ln λxi i!
P
Pn
∂ ln L(x1 ,...,xi ,...,xn ;λ) xi
∂λ Pn = 0 ⇐⇒ −n + i=1
λ =0
x
i=1 i
on a donc λ̂ = n = X̄n
Pn
∂ 2 ln L(x1 ,...,xi ,...,xn ;λ) xi
(on a bien ∂λ2
=− i=1
λ2
≤0)
Cet estimateur n’est pas biaisé ce qui est un avantage par rapport à la première méthode de
mesure. Néanmoins on fait essentiellement la même chose, ces méthodes se valent.
3.4 Simulation
La fonction scilab suivante permet de calculer la trajectoire du nombre de voitures présents
au feu 1 à chaque début de cycle (au moment où le feu passe au vert pour eux). Le modèle est
symétrique pour le feu 2.
Il est sensé de se poser la question de l’influence des différents paramètres sur ce modèle : que
se passe-t-il si on modifie la vitesse des voitures ? La durée d’un des feux ? Le temps de réaction
des automobilistes ? La longueur du chantier ? On va changer un paramètre à la fois à partir de
la paramétrisation donnée ci-dessus.
Une trajectoire avec les mêmes paramètres qu’au dessus, à part la vitesse des voitures qu’on
double.
(l = 3/5 ; lambda = 4 ; d1 =6/5 ; d2 = 9/10 ; vit = 1 ; a = 1/15 ; n = 500 ; ci = 80 ;) (2)
La vitesse des voitures a une grande influence sur la stabilité du système : si elles roulent suff-
isamment vite la file d’attente n’a pas le temps de s’allonger. Contrairement à la paramétrisation
précédente où l’on voit que deux trajectoires peuvent avoir des allures tout à fait différentes, ici
elles ont toutes la forme de celle représentée ci-dessus.
Il est intéressant de constater que doubler la vitesse des voitures a exactement le même effet
sur le système que diviser par deux la longueur du chantier. En effet parcourir une distance à
une vitesse équivaut en temps à parcourir la moitié de cette distance à la moitié de la vitesse.
Les effets de la vitesse et de la longueur du chantier sont donc liés. Cela est représenté mathé-
L
matiquement par la présence d’un coefficient vit dans le modèle.
Pour faire l’analogie avec les systèmes M/M/1, on peut dire que la figure (1) représente le
régime critique du système : il n’y a pas d’engorgement systématique, mais les trajectoires sont
très différentes entre elles. La figure (2) représente le régime stationnaire : le système revient
3 LA SITUATION ROUTIÈRE DE DANIEL FLIPO 17
vite depuis ses conditions initiales à un état où le nombre de voitures à la file est stable et
suffisamment proche de zéro.
Si l’on fait l’inverse des actions ci-dessus (ie si on divise par deux la vitesse, ou la durée du
feu 1, etc) on obtient la troisième allure de trajectoires qu’on peut rencontrer avec ce système :
la file du feu augmente sans arrêt, le système est complètement instable.
On peut encore améliorer cette fonction en construisant une spline qui passe par les points
où la fonction en escalier change de valeur.
3 LA SITUATION ROUTIÈRE DE DANIEL FLIPO 18
La spline (courbe verte) nous permet de simuler le nombre de véhicules présents au debut
de chaque cycle durant toute une journée.
On observe maintenant des courbes du type :
Ce graphique montre le nombre de voitures dans la file d’attente en fonction des heures de la
journée
Ce modèle représente plus fidèlemment la réalité, avec des pics de fréquentation et des heures
creuses.
4 ANNEXE : CODES SCILAB 19
On modélise le nombre de voitures qui attendent à chaque feu au début d’un cycle des feux.
(Le début d’un cycle est le moment où le feu 1 passe au vert).
Pour observer le comportement du système, plutot que de simplement tracer des trajectoires
on implemente une interface graphique rudimentaire avec scilab (code en annexe). Le mod-
èle prend en compte trois types de véhicules à l’encombrement différent, et on s’intéresse à la
longueur des files.
On a deux variantes : soit on va afficher tous les cycles des feux contenus dans une journée (en
faisant varier les paramètres avec la fonction spline ci dessus), soit on reste avec des paramètres
fixes et on simule un nombre de cycles voulu.
On anime l’image ci dessus en traçant les différentes files à chaque début de cycle. L’interface
comprend également une légende et précise les longueurs de chaque file, et l’heure de la journée/le
cycle modélisé. (On pourra éxécuter le programme prévu à cet effet)
//programme de lancement
usecanvas(%f);
if choice1 == 1 then
//MM1
//on demande à l’utilisateur les constantes pour le système MM1
//FLIPO
//on choisit une variante
choice2 = x_dialog([’Choisissez une variante’ ; ’1 : paramètres fixes’
; ’2 : paramètres variables’],’0’);
choice2 = strtod(choice2);
if choice2 == 1 then
exec(’traj.sci’,-1);
exec(’traj_journee.sci’,-1);
exec(’trajgraph_tps.sci’,-1);
exec(’trajanim2.sci’,-1);
//constantes
l_mm1_b = x_dialog([’Longueur du chantier (en km)’],’0.6’);
d1_mm1_b = x_dialog([’Durée pdt laquelle le’;
’feu 1 reste au vert (minutes)’],’1.2’);
d2_mm1_b = x_dialog([’Durée pdt laquelle le’;
’feu 2 reste au vert (minutes)’],’0.9’);
vit_mm1_b = x_dialog([’Vitesse des voitures (km/min)’],’0.5’);
a_mm1_b = x_dialog([’Temps de démarrage des voitures (min)’],’0.067’);
end
end
4 ANNEXE : CODES SCILAB 22
4.2 MM1.sci
MM1.sci - fonction de simulation du système M/M/1
function []=MM1(lambda,mu,a,n)
// lambda, nombre moyen de clients/unité de temps
// mu, temps moyen de service
// a, nombre de clients dans le système à l’instant 0
// n, nombre d’itérations.
p = 1; // compteurs
k = p;
for i=1:n
d = k ;
l = X($-1); // on regarde combien de clients
//sont dans le système, donc il ne pourra pas avoir plus de l départs
//// on regarde combien de personnes partent alors qu’il n’y a pas d’arrivées
while (sum(z(k:d)) < y(p)-y(k))& (d<n) & (l>=0)
X = [X ,X($)-1] ;
tps = [tps y(k)+sum(z(k:d))];
d = d+1;
l = l-1;
end
4 ANNEXE : CODES SCILAB 23
k = p;
end
// on trace la trajectoire.
plot2d2(tps,X)
xlabel("Temps");
ylabel("Clients");
endfunction
4.3 Longueur.sci
longueur.sci - fonction pour calculer la longueur des files d’attente (pour le modèle de Flipo)
function L = longueur(T)
n = size(T(1));
L = zeros(2,n);
for i = 1:n
L1 = T(1)(i);
L2 = T(2)(i);
end
end
end
endfunction
4.4 Trajplot.sci
trajplot.sci - fonction pour tracer les files d’attente
function []=trajplot(L,i)
//IN : L - une liste créée par la fonction trajgraph ;
// i - l’état que l’on souhaite représenter
// i doit etre inferieur ou égal au nombre d’états qu’on a simulé
//OUT : rien, on trace un plot
data1 = L(1)(i);
data2 = L(2)(i);
n1 = length(data1);
n2 = length(data2);
//dans la file 2
4 ANNEXE : CODES SCILAB 25
if n2 <> 0 then
for k = 1:n2
if data2(k) == 1 then
xset("color",8);
xfrect(x2+1,y2-5,3,20);
x2 = x2 + 5;
elseif data2(k) == 2 then
xset("color",6);
xfrect(x2+1,y2-5,8,20);
x2 = x2 + 10;
else
xset("color",22);
xfrect(x2+1,y2-5,18,20);
x2 = x2 + 20;
end
end
end
endfunction
4.5 Trajgraph.sci
trajgraph.sci - fonction qui génère des listes d’états pour les deux files d’attente du modèle
de Flipo, prêtes à être tracées
function L=trajgraph(l,lambda1,lambda2,d1,d2,vit,a,n,ci1,ci2)
//L = liste des états de chaque file : liste de deux listes de tableaux
//lambda1, lambda2 : nombre moyen d’arrivées par minutes à chaque feu
//d1, d2 : durées pdt lesquelles chaque feu reste au vert
//a : temps de démarrage
//n : nombre d’états
//ci1,ci2 : conditions initiales (nombre de voitures ds chaque file au début)
//FILE 1
Y1 = grand(1,1,’poi’,lambda1*d1);
P1 = Y1 + T1(i-1) - k1;
//on ajoute les nouveaux véhicules qui arrivent pdt le feu vert
//au début de la file
rnd = grand(1,Y1,’unf’,0,1);
for i = 1:Y1
if rnd(i) < 0.6 then
E1 = [1 E1];
elseif rnd(i) < 0.9 then
E1 = [2 E1];
else
E1 = [3 E1];
end
end
4 ANNEXE : CODES SCILAB 27
if P1 < 0 then
P1 = 0 ;
end
Y1b = grand(1,1,’poi’,lambda1*(d2+(2*l/vit)));
T1(i)= P1 + Y1b;
rndb = grand(1,Y1b,’unf’,0,1);
for i = 1:Y1b
if rndb(i) < 0.6 then
E1 = [1 E1];
elseif rndb(i) < 0.9 then
E1 = [2 E1];
else
E1 = [3 E1];
end
end
L1($+1) = E1;
end
for i=2:n
//FILE 2
Y2 = grand(1,1,’poi’,lambda2*d2);
P2 = Y2 + T2(i-1) - k2;
//on ajoute les nouveaux véhicules qui arrivent pdt le feu vert
//au début de la file
rnd2 = grand(1,Y2,’unf’,0,1);
for i = 1:Y2
if rnd2(i) < 0.6 then
E2 = [1 E2];
elseif rnd2(i) < 0.9 then
E2 = [2 E2];
else
E2 = [3 E2];
end
end
4 ANNEXE : CODES SCILAB 28
if P2 < 0 then
P2 = 0 ;
end
Y2b = grand(1,1,’poi’,lambda2*(d1+(2*l/vit)));
T2(i)= P2 + Y2b;
rnd2b = grand(1,Y2b,’unf’,0,1);
for i = 1:Y2b
if rnd2b(i) < 0.6 then
E2 = [1 E2];
elseif rnd2b(i) < 0.9 then
E2 = [2 E2];
else
E2 = [3 E2];
end
end
L2($+1) = E2;
end
L = list(L1,L2);
endfunction
4.6 Trajanim.sci
trajanim.sci - la fonction qui génère les animations avec trajplot et trajgraph
function []=trajanim(L,i1,i2)
long = longueur(L);
//fenetre
plot2d(0,0,0,rect=[-1000,-150,1000,150],frameflag=3);
//legende
xstring(-800,130,"LEGENDE : blanc = voiture (5m), rose = bus (10m),
violet = semi-remorque (20m)");
xstring(-800,110, "LONGUEUR DE LA FILE 1 : ");
xstring(-800,90, "LONGUEUR DE LA FILE 2 : ");
xstring(-800,70, "Numéro de cycle : ");
for j = i1:i2
plot2d(0,0,0,rect=[-1000,-150,1000,150],frameflag=3);
a.axes_visible = "off";
f.figure_size= [1800 600];
a.margins = [0.01 0.01 0.01 0.01];
4 ANNEXE : CODES SCILAB 30
xset("color",12);
xfrect(-1000,30,2000,60);
xset("color",16);
xfrect(-200,30,400,30);
xset("color",1);
xfarc(-220,-30,20,20,0,360*64);
xfarc(200,50,20,20,0,360*64);
xsegs([-200 -200 200 200 -1000 1000],[-30 30 -30 30 0 0],style=1);
end
endfunction
4.7 Traj.sci
traj.sci - la fonction de base pour le modèle de Flipo
// n nombre de pas
// ci condition initiale
// l longeur du chantier en km
//lambda nb voitures/min moyen
//d1 duré du feu vert 1 en min
//d2 durée du feu vert 2 en min
//vit vitesse des véhicules en km/min
//a temps de demarrage en min
k = floor(d1/a);
T = zeros(1,n); //contient la trajectoire
T(1)=ci; //valeur de départ
for i=2:(n)
P = grand(1,1,’poi’,lambda*d1) + T(i-1) - k;
4 ANNEXE : CODES SCILAB 31
if P < 0 then P = 0
end
T(i)= P + grand(1,1,’poi’,lambda*(d2+(2*l/vit)));
end
X=T
endfunction
function X =traj_journee(l,h,d1,d2,vit,a)
//X trajectoire du nombre de voitures présentes au feu à chaque debut de cycles
// l longeur du chantier en km
//h fonction qui donne le nombre de vehicules/min en fonction des heures de la journée
//d1 duré du feu vert 1 en min
//d2 durée du feu vert 2 en min
//vit vitesse des véhicules en km/min
//a temps de demarrage en min
X = []; // on initialise X
x = linspace(0,23,24);
/////// interpolation de h
P=splin(x,h);
tps = 0;
endfunction
function L=trajgraph_tps(l,h1,h2,d1,d2,vit,a,ci1,ci2)
//L = liste des états de chaque file : liste de deux listes de tableaux
k1 = floor(d1/a); //le nombre de véhicules max qui passent à chaque cycle de chaque feu
k2 = floor(d2/a);
nbcycle = 24/tpscycle;
// file 1
for j = 1:nbcycle
for i = 1:n
if rndb(i) < 0.6 then
E1 = [1 E1];
elseif rndb(i) < 0.9 then
E1 = [2 E1];
else
E1 = [3 E1];
end
end
c1 = length(E1);
end
// file 2
for j=1:nbcycle
L2($+1) = E2;
E2($)=[];
end
end
c2 = length(E2);
end
L = list(L1,L2);
endfunction
4.10 Trajanim2.sci
trajanim2.sci - variante de trajanim pour le modèle paramètres variants
function []=trajanim2(L,i1,i2,tps)
long = longueur(L);
f = gcf();
a = gca();
plot2d(0,0,0,rect=[-1000,-150,1000,150],frameflag=3);
a.axes_visible = "off";
f.figure_size= [1800 600];
a.margins = [0.01 0.01 0.01 0.01];
xset("color",12);
xfrect(-1000,30,2000,60);
xset("color",16);
xfrect(-200,30,400,30);
xset("color",1);
xfarc(-220,-30,20,20,0,360*64);
xfarc(200,50,20,20,0,360*64);
xsegs([-200 -200 200 200 -1000 1000],[-30 30 -30 30 0 0],style=1);
for j = i1:i2
plot2d(0,0,0,rect=[-1000,-150,1000,150],frameflag=3);
a.axes_visible = "off";
f.figure_size= [1800 600];
a.margins = [0.01 0.01 0.01 0.01];
xset("color",12);
xfrect(-1000,30,2000,60);
xset("color",16);
xfrect(-200,30,400,30);
xset("color",1);
xfarc(-220,-30,20,20,0,360*64);
xfarc(200,50,20,20,0,360*64);
xsegs([-200 -200 200 200 -1000 1000],[-30 30 -30 30 0 0],style=1);
end
endfunction