Exemple d'extrems relatius i corbes de nivell: Posició d'una boca de rec.
S'ha de posar una boca de rec per a incendis al centre d'un poble, de manera que estigui el més a prop possible de l'ajuntament, l'oficina de correus i de la farmàcia. Sobre un mapa del poble posem uns eixos de coordenades de manera que l'ajuntament està a l'origen, la farmàcia queda en la posició (10,0) i l'oficina de correus en la posició (3,4). On posem la boca de rec?
Plantejament del problema
Comença per fer-te un esquema gràfic del problema. Què ens estan demanant? Com ho traduïm com a problema de mínims?
Definició de la funció objectiu
Primer netegem de variables i gràfics que es puguin haver creat abans, i definirem el format en què volem que ens mostri els resultats numèrics (treballarem en precisió simple, 7 decimals).
De l'enunciat entenem que la boca de reg s'hauria de posar en un lloc de coordenades (x,y) tals que la suma de les tres distàncies sigui mínima.
A continuació definirem la funció que volem fer mínima utilizant x i y com a variables simbòliques per poder, després, calcular les derivades parcials d'aquesta funció. Primer definim les distàncies del punt de la boca de reg a cada edifici:
r1 = sqrt(x^2 + y^2)
r1 = 
r2 = sqrt((x-10)^2+y^2)
r2 = 
r3 = sqrt((x-3)^2+(y-4)^2)
r3 = 
I la funció distáncia total (DT) serà:
DT = r1 + r2 + r3
DT = 
Gràfica de la funció objectiu
Per veure si té un mínim, podríem visulatitzar la seva gràfica. Per dibuixar en Matlab una funció definida amb variables simbòliques utilitzem la instrucció fsurf(). Fixeu-vos que prenem el rectangle [0,10]x[0,4] just que conté els tres edificis.
Veiem que sembla que hi ha un mínim, però aquesta visió no és clara.
Corbes de nivell
Farem un mapa de corbes de nivell, això és, dibuixarem les corbes DT(x,y)=c, on c són constants diferents. Comecem definint una graella de punts (x,y) del pla on avaluarem la funció DT
[X,Y]=meshgrid(0:0.1:10,0:0.1:4);
Quins valors de c li diem?
Per saber quins valors tenen sentit, preguntarem quins són els valors màxim i mínim de DT sobre la graella que hem calculat (li demanem que ens els mostri en Comencem convertint l'expressió simbòlica DT en una funció anomenada Zf per ser avaluada sobre la graella i essent Z la matriu que conté els seus valors.
I ara li hem de donar una llista de nivells (valors de c) per als que volem que ens dibuixi les corbes de nivell. Per això fixarem un nombre (nv) i prendrem valors equiespaiats entre els valors mínim i màxim trobats:
nivells=floor(mn:pas:mx);
Finalment li demanem que dibuixi les corbes de nivell:
contour(X,Y,Z,nivells,'ShowText','on')
Retoca dels codis anteriors el que creguis per tal de tenir una localització més acurada del mínim.
Càlcul del mínim
S'han de calcular els punts crítics de la funció, això és, on les dues derivades parcials s'anul·len a la vegada.
Calculem les dues derivades parcials de DT aprofitant que la tenim definida de manera simbòlica.
F1 = diff(DT,x)
F1 =

F2 = diff(DT,y)
F2 =

i trobem la solució del sistema F1=0 i F2=0. Ho farem amb la comanda vapsolve que busca solucions numèricament. Com que veiem que només hi ha un únic punt crític, no cal indicar més opcions.
[sol_x,sol_y]=vpasolve(F,[x,y]);
Tornem a dibuixar les corbes amb els punts corresponent als edificis i la solució:
E=[[0,0];[10,0];[3,4];[sol_x,sol_y]];
scatter(E(:,1),E(:,2),50,'filled')
Modifica el codi adequadament si ara afegim al problema que hi ha una escola en la posició (8,6) i volem incloure-la en la minimització.
© Numerical Factory ( by Esther Barrabés i Joan Saldaña)