2
// Macro qui initialise les donnees du
12
[n1,n2,te,xe,k0,kc]=resume(...
15
function [cout,feed]=mine(n1,n2,uvect)
16
//[cout,feed]=mine(n1,n2,uvect)
17
// extraction optimale d'un minerai d'une mine a ciel ouvert
18
// en avancant progressivement (k=1,2,...,n2) et en
19
// prelevant a l'abcisse k+1 la tranche de profondeur x(k+1)
20
// par une commande u a partir de la profondeur x(k)
23
// la resolution du probleme se fait par programmation dynamique
24
// en calculant la commande optimale maximisant le critere :
28
// / f(x(k),k) + V_F(x,n2)
30
// avec : x(k+1)=x(k) + u
31
// x(k) est la profondeur de la mine a l'abcisse k (x=1
32
// est le niveau du sol)
33
// la fonction gain instantane f(i,k) represente le benefice
34
// si on creuse la profondeur i a l'abcisse k
35
// V_F(i,n2) est un cout final destine a forcer l'etat final
36
// a valoir 1 (pour sortir de la mine ...)
37
// V_F(i,n2) vaut -10000 en tout les points i\ne1 et 0
40
// le programme mine necessite de connaitre
41
// n1 : l'etat est discretise en n1 points
43
// 2:n1+1 du sol au fond
44
// n1+2 zone interdite
45
// n2 : nombre d'etapes
46
// uvect : vecteur ligne des valeurs discretes que peut
47
// prendre u (3 valeurs, on monte, on descend ou on avance)
48
// et le programme mine retourne alors deux matrices
49
// cout(n1,n2) : valeurs de la fonction de Bellman
50
// feed(n1,n2) : valeurs de la commande a appliquer
51
// lorsque l'etat varie de 1 a n1 et
53
// n1 : l'etat est discretise en n1 points
54
// on rajoute dans le calcul deux couches fictive
55
// en 1 l'air en n1+2 le fond de la mine
57
// 2:n1+1 du sol au fond
58
// n1+2 zone interdite
60
usize=prod(size(uvect))
62
// tableau ou l'on stocke la fonction de Bellman
64
// tableau ou l'on stocke le feedback u(x,t)
66
// calul de la fonction de Bellman au temps final
68
// Le cout final est le cout au point de sortie de la zone d'extraction
69
// on veut evidement que ce point de sortie soit le sol
70
// le cout est donc 0 au niveau du sol et -inf ailleurs
71
cout(:,n2)=-penal*ones(n1+2,1);
73
// calcul retrograde de la fonction de Bellman et
74
// du controle optimal au temps temp par l'equation de Bellman
78
newx=mini(maxi(xgr+uvect(i)*ones(xgr),1*ones(xgr)),(n1+2)*ones(xgr)),
79
loc(i)=cout(newx,temp)+ff_o(xgr,temp-1),
83
cout(1,temp-1)=-penal;
84
cout(n1+2,temp-1)=-penal;
85
feed(xgr,temp-1)=uvect(kk)';
88
function [y]=ff_o(x,t)
90
// gain instantane apparaissant dans le critere du
93
// pour des raisons techniques, l'argument x doit
94
// etre un vecteur colonne et donc egalement la sortie y.
95
// en sortie y=[ ff_0(x(1),t),...ff_o(x(n),t)];
98
y=k0*(1-(t-te)**2/(n2**2))*xxloc - (x-xe*xxloc)**2/(n1**2) -kc*(x-1*xxloc)
102
function []=showcost(n1,n2)
104
// Montre en 3d la fonction de gain instantanee (ff)
105
// x: profondeur (n1)
107
// en z : valeur de ff_o(x,t)
111
for i=1:n2,m=[m,ff_o(1:n1,i)],end
112
contour(1:n2,1:n1,m',10,0,0,' ',[2,2,0])
114
function []=trajopt(feed)
116
// feed est la matrice de feedback calculee par mine
117
// trajopt calcule et dessine la trajectoire et le controle
118
// optimaux pour un point de depart (1,1)
124
for i=2:(n2+1),xopt(i)=feed(xopt(i-1),i-1)+xopt(i-1),
125
uopt(i-1)=feed(xopt(i-1),i-1),end
126
plot2d2("gnn",[1:(n2+1)]',[-xopt]',[2],"111",...
127
"trajectoire optimale",...
129
plot2d2("gnn",[1:(n2)]',uopt(1:n2)',[1,-4],"111",...
130
"commande optimale",...