Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Optimización de Sistemas
Pablo Suárez
pasuar03@ucm.es
16 de mayo de 2023
1
Optimización de Sistemas 16 de mayo de 2023
Índice 3. Tarea 2 18
3.1. Primera función: f (x1 , x2 ) = 2x21 +
1. Introducción 2 6x22 + 4x1 − 3x2 . . . . . . . . . . . . . 18
3.2. Segunda función: f (x1 , x2 ) = x31 +x32 +
2. Tarea 1 2 2 ∗ x21 + 4 ∗ x22 + 6 . . . . . . . . . . . 20
2.1. Primera función: f (x) = x5 − 5x3 − 3.3. Tercera función: f (x1 , x2 ) = 100(x2 −
20x + 5 . . . . . . . . . . . . . . . . . 2 x21 )2 + (1 − x1 )2 . . . . . . . . . . . . . 24
0′ 75
2.2. Segunda función: f (x) = 0′ 65− 1+x 2 −
4. Conclusión 26
0′ 65 · arctg x1 . . . . . . . . . . . . .
9
2
2.3. Tercera función: f (x) = cos(x) · e−(x−π) 14 5. Código 27
1. Introducción
En esta práctica se han comprobado y estudiado el funcionamiento de las funciones de optimización que
ofrece Matlab, también se han comparado los resultados obtenidos con los métodos de optimización utiliza-
dos en su momento para para optimizar las distintas funciones objetivo.
2. Tarea 1
Elegir 3 de las funciones dependientes de una variable de decisión optimizadas en los trabajos de evaluación
continua previos y buscar el óptimo con las funciones de optimización de Matlab fminsearch y fminunc.
Comparar los resultados obtenidos los métodos de Matlab y con los métodos utilizados para resolverlos
anteriormente.
Para este primera tarea se han seleccionado las siguientes funciones objetivos dependientes tan solo de
una variable decisión.
df (x)
= 5x4 − 15x2 − 20
dx
d2 f (x)
= 20x3 − 30x
dx2
En los métodos analı́ticos, una vez se obtenı́an las dos primitivas de f (x), se igualan a 0. Al igualar la segunda
derivada de la función a 0, se obtienen los máximos ası́ como los mı́nimos de la función. Para dfdx (x)
= 0 se
∗
obtiene como resultado: x ∈ {−2, 2} ∴ Si se introducen estas soluciones en la expresión de la segunda
primitiva, podremos saber si se tratan de máximos , mı́nimos o de puntos de inflexión. Se introducen las
soluciones en la segunda primitiva:
El método analı́tico, nos devuelve los siguientes valores que hacen 0 la primera derivada de la función;
x∗ = {−2, −j, j, 2}. Tal y como se ha mencionado en la introducción de esta práctica, se está optimizando
con una variable de decisión x ∈ R, por lo que las soluciones complejas quedan descartadas, ∴ x′∗ ∈ {−2, 2}
Como podemos comprobar en el gráfico de arriba, no se consigue ver con claridad el máximo y el mı́nimo
correspondientes a los puntos x′∗ ∈ {−2, 2}. Acotando los ejes, se obtiene:
Aquı́ ya se puede comprobar la posición de los máximos y los mı́nimos de la función. La parte cóncava
se corresponde con el máximo (x∗ = −2) y la parte convexa se corresponde con un mı́nimo (x∗ = 2)
En definitiva, con las funciones de Matlab deberı́amos de ser capaces de encontrar, el siguiente máximo
y mı́nimo:
Todo lo enunciado y adjuntado anteriormente se obtuvo con los métodos analı́ticos, ahora se adjunta
las explicaciones y los resultados analı́ticos obtenidos con las funciones de Matlab fminsearch y fminunc.
Primero se ha implementado el siguiente código;
f=@fun;
x0 = 0;
opt=optimset('Display','iter','MaxIter',100);
[x,y]=fminunc(f,x0,opt)
[x,y]=fminsearch(f,x0,opt)
function y=fun(x)
y=xˆ5−5*xˆ3−20*x+5;
%y=−y; %Para maximizar cambiamos el signo
end
First−order
Iteration Func−count f(x) Step−size optimality
0 2 5 20
1 12 −42.9281 0.0980777 3.69
2 16 −42.9982 0.1 0.599
3 18 −43 1 0.0246
4 20 −43 1 0.000154
5 22 −43 1 2.38e−07
x = 2.0000
Optimización de Sistemas 16 de mayo de 2023
y = −43.0000
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = 2.0000
y = −43
Como bien se puede observar, nos encuentra el mı́nimo perfectamente (e.g f (x∗ ) = −43 con x∗ = 2), y lo
encuentra en 5 iteraciones.
Cabe destacar que solo nos encuentra un tipo de óptimo (Preguntarle a Eva por si acaso), le hemos es-
pecificado la función sin cambiarle el signo, esto significa que queremos que minimice la función, y se ve
como lo hace correctamente. El punto inicial indicado es el 0, para x0 = 2, con fminunc y con fminsearch
se obtiene el mismo óptimo, pero en menos iteraciones. En el caso dónde x0 = 2, la función fminunc solo
itera una vez (es lógico porqué ahı́ es dónde se encuentra el óptimo) y curiosamente para x0 = 4 itera hasta
9 veces (3 iteraciones más que para x0 = 0), lo cual resulta extraño ya que se encuentra igual de cerca a
x0 = 2 que el punto x0 = 0. Intuyo que este comportamiento puede deberse a que x0 = 4 se encuentra cerca
de la zona creciente de la función, por lo que calculará algún gradiente por ahı́.
Cabe destacar que para todos los puntos iniciales con los que se ha simulado el código de Matlab, la fun-
ción fminsearch es la que siempre itera más veces. La diferencia es que fminunc utiliza el método basado
en el gradiente para encontrar el óptimo mientras que fminsearch utiliza el método de búsqueda directa
Nelder-Mead simplex que no tiene gradiente. Por ello al optimizar vemos los siguientes ’métodos’ 1 ;
Expand
Contract inside Initial simplex
Estos tres métodos, están en el orden indicado, ya que se aplican en ese orden. Son variantes del método de
búsqueda directa Nelder-Mead.
1 No son métodos sino etapas del algoritmo de Nelder-Mead
Optimización de Sistemas 16 de mayo de 2023
En aspectos generales, este método se puede entender muy bien con la siguiente imagen; Teniendo f (x),
El método de Nelder-Mead simplex primero ordena consecuentemente según los vértices del triángulo;
f (x1 ) ≤ f (x2 ) ≤ ... ≤ f (xn+1 ), luego de esto comprueba si debe de parar. Luego calcula xo de todos
los puntos excepto el de xn+1 . La variable xo denota el centroide, también llamado: centro geométrico,
denota la posición media de manera aritmética de todos los puntos de la superficie de una figura. Véase la
siguiente figura de ejemplo:
La ’etapa’ con nombre Expand depende de otra anterior, que es la deReflection, esta etapa del método,
calcula el punto reflejado como;
xr = xo + α(xo − xn+1 ) con α > 0 (1)
Ahora, si el punto reflejado es mejor que el segundo peor pero no mejor que el punto ideal, entonces obtiene
un nuevo simplex reemplazando el peor punto xn+1 con aquel punto reflejado, calculado previamente; xr ,
y se vuelve al primer paso. Luego esta la fase de Expansion y Contraction, estas dos fases son las que se
ven mayoritariamente a la hora de resolver el problema. Sabido como opera el método a rasgos generales, se
puede enunciar de manera breve y muy por encima lo que se desarrolla en esta dos fases.
En la fase de Expansion, primero se evalúa si la función en el punto reflejado es mayor que la función
evaluada en el primer punto del conjunto de puntos iniciales (recall: x ∈ Rn : x = {x1 , ..., xn+1 },esto es;
f (xr ) < f (x1 ) (2)
Si esto es ası́, entonces se calcula el punto expandido que tiene la siguiente forma;
xe = xo + γ(xr − xo ) con γ > 1 (3)
Optimización de Sistemas 16 de mayo de 2023
Ahora bien, si el punto expandido es mejor que el punto reflejado (i.e: f (xe ) < f (xr )), entonces, se obtiene
un nuevo simplex reemplazando el peor punto xn+1 con el punto extendido: xe , hecho esto, se vuelve al paso
1 y se repite de nuevo el proceso. Si esta última condición no se cumple, entonces se obtiene un nuevo simplex
reemplazando el peor punto xn+1 con el punto reflejado; xr
A la fase de Expansion le sucede la fase de Contraction. En esta etapa/fase, ya se cumple que: f (xr ) ≥ f (xn )
donde f (xn ) hace referencia al segundo punto más ideal/mayor o lo que es lo mismo, el segundo mejor can-
didato.
Ahora bien, si f (xr ) < f (xn+1 ) entonces se calcula el ”punto contraı́do”, este se calcula de la siguiente
manera;
xc = xo + ρ(xr − xo ) con 0 < ρ ≤ 0′ 5 (4)
Sabiendo esto, se contemplan dos escenarios, el primero, se enuncia a continuación. Si el ”punto contraı́do” es
mejor que el ”punto reflejado”, esto es: f (xc ) < f (xr ), entonces se obtiene otro nuevo simplex reemplazando
el peor punto f (xn+1 ) con el ”punto contraı́do”, i.e: xc ) y se retorna al paso 1. En cualquier otro caso se
vuelve al último paso llamado ”Shrink”
El segundo escenario, contempla el cumplimiento de la siguiente condición: f (xr ) ≥ f (xn+1 ) luego se compu-
ta el punto fuera de la siguiente manera:
Si el ”punto contraı́do es mejor que el peor punto, i.e: f (xc ) ≤ f (xn+1 ) Entonces se obtiene un nuevo simplex
reemplazando el peor punto f (xn+1 ) con el ”punto contraı́do”, i.e: xc y se retorna al paso 1. En cualquier
otro caso se va al último paso, en este caso el paso/etapa: Shrink (en castellano: retracción). En este paso
se reemplazan todos los puntos excepto el mejor (x1 )) con:
xi = x1 + σ(xi − x1 ) (6)
Hace falta notar que α, γ, ρ y σ son los coeficientes de reflexión, expansión, contracción y retracción. Algunos
valores estándar para estos coeficientes son; α = 1, γ = 2, ρ = 1/2 y σ = 1/2.
En el resultado de arriba se pueden ver todos estos pasos que se acaban de explicar, todos ellos en or-
den.
El handicap de este método reside en la poca versatilidad de la búsqueda que efectúa, ya que la búsqueda
de dos tipos de óptimos se hace por separado, es decir;
Primero se busca el mı́nimo/máximo.
Luego se busca el máximo/mı́nimo
Lo bueno de este método, es el ahorro en materia de código, correspondiente al cálculo de las primeras
y segundas derivadas en el caso de los métodos analı́ticos para una función con una única variable de decisión.
Se busca ahora el máximo, para ello en el código de arriba des-comentamos la lı́nea %y=-y ⇒ y=-y. El
resultado para x0 = 0 es el siguiente:
x = −2.0000
y = −53.0000
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = −2.0000
y = −53
Como se puede volver a comprobar, nos devuelve el óptimo correcto, en este caso el máximo indicado, que
se encontró en su momento con los métodos analı́ticos. Esto es; f (x∗ ) = 53 con x∗ = −2. Para el caso de
x0 = 0 el máximo lo ha encontrado en 6 iteraciones. Para x0 = 4 no encuentra el óptimo deseado, ya que
esta cerca de la zona creciente de la función, por lo tanto nos devuelve el siguiente resultado;
x = 66434
y = −1.2941e+24
Este óptimo no es correcto, el resultado lo encuentra en 2 iteraciones. Además nos explica porque ha parado:
La función no está acotada, y efectivamente esto es ası́, como ya se comentó en un párrafo anterior.
0′ 75
2.2. Segunda función: f (x) = 0′ 65 − 1+x2
− 0′ 65 · arctg 1
x
0′ 75
′ 1
f (x) = 0 65 − − 0′ 65 · arctg (7)
1 + x2 x
Es importante notar que la función objetivo en este caso, no es continua 2 . Como se ha visto en teorı́a, para
calcular los máximos y mı́nimos ası́ como los puntos de inflexión, se ha de derivar la función dos veces.
df (x) 3x 13
= +
dx 2
2(x + 1) 2 20x · ( x12 + 1)
2
d2 f (x) 3 13 6x2 13
= − 1 − 2 +
dx 2 2
2(x + 1) 2 10x · ( x2 + 1) (x + 1)3
3 10x5 · ( x12 + 1)2
Una vez obtenidas las dos primitivas de f (x), las dos se igualan a 0. Al igualar la segunda derivada de
la función a 0, se obtienen los máximos ası́ como los mı́nimos de la función. Para dfdx
(x)
= 0 se obtiene
∗ ′ ′
como resultado: x ∈ {−1 7295, −0 5782} ∴ Si se introducen estas soluciones en la expresión de la segunda
primitiva, podremos saber si se tratan de máximos , mı́nimos o de puntos de inflexión. Se introducen las
soluciones en la segunda primitiva:
6(−1′ 7295)2
2
d f (x) f¨(x∗1 ) = 3
2((−1′ 7295)2 +1)2 − 13
1
10(−1′ 7295)3 ·( (−1′ 7295)
− ((−1′ 7295)2 +1)3 + 13
1
10(−1′ 7295)5 ·( (−1′ 7295) 2
2 +1) 2 +1)
= 6(−0′ 5782)2
dx2 x=x∗ f¨(x∗2 ) = 3
− 13
− + 13
2((−0′ 5782)2 +1)2 1
10(−0′ 5782)3 ·( (−0′ 5782)2 +1) ((−0′ 5782)2 +1)3 1
10(−0′ 5782)5 ·( (−0′ 5782)2 +1)
2
f¨(x∗1 ) = −0,0470
f¨(x∗ ) = 0,4203
2
Sabiendo cuáles son los óptimos que uno ha de esperar en esta función, se implementan las funciones nativas
de Matlab, para encontrar dichos óptimos.
2 Como f : x ∈ R, entonces x puede tomar el 0 como valor, si esto es asi, se tendrı́a; arctan(1/x)|
x=0 = arctan(1/0) − → ∞.
Esto darı́a como resultado f (x) = −∞ pero f ∈ R, por lo tanto: f : R \ {0} −
→ R significando esto que la función no está definida
en ese punto.
3 f (x) = arctg(x) → f˙(x) = 1
al derivar no hay arctn lo que no da lugar a una discontinuidad puesto que se ha fijado
1+x2 √
que x ∈ R, en el caso de que x ∈ C entonces f˙ : C \ {j} −
→ C pues la función no estarı́a definida para j (j = −1)
Optimización de Sistemas 16 de mayo de 2023
(a) Representación gráfica de la función del (b) Representación gráfica de la primera derivada
segundo caso. de la función del segundo caso de la tarea 1.
Para esta función y la siguiente, no se enunciará el código ya que lo único que varı́a es la función y el
punto inicial.
First−order
Iteration Func−count f(x) Step−size optimality
0 2 −1.12102 0.65
x = 0
y = −1.1210
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = 0
y = −1.1210
Para el método de fminunc se obtiene x = 2.3512e-06, y = -1.1210, el valor de la función es y = −1′ 1210.
No es el mı́nimo deseado, de hecho tanto fminunc como fminsearch nos devuelve el mismo resultado, se
puede ver arriba. El resultado que nos devuelven los dos métodos se corresponde con el supuesto mı́nimo
que hay en la siguiente gráfica:
Como se ha mencionado antes, al inicio de la función el resultado que se muestra no se corresponde con
un óptimo de la función sino con el lı́mite al que la función tiende, el método lo toma como un óptimo
porque Matlab lo ha pintado, pero no lo es. Teniendo en cuenta este resultado, las dos funciones de Matlab
para encontrar el mı́nimo no son ”fiables”. Se intenta ahora para otro punto inicial para ver si se consigue
Optimización de Sistemas 16 de mayo de 2023
Figura 7: Graficado de la función con el resultado obtenido por fminunc y por fminsearch
encontrar el óptimo correcto, se ha probado con x0 = 2 y esto nos devolvı́a el mismo óptimo que para x0 = 0
pero en el caso del método de fminsearch el proceso de búsqueda se alargaba hasta 29 iteraciones, lo mismo
pasa para x0 = 4. El comportamiento cambia cuando se le pasa un punto inicial negativo, por ejemplo para
x0 = −2, el resultado para este nuevo punto inicial es el siguiente.
First−order
Iteration Func−count f(x) Step−size optimality
0 2 0.801371 0.01
1 14 0.674721 2307.18 0.000938
2 16 0.672668 1 0.000789
3 18 0.665738 1 0.000381
4 20 0.662243 1 0.00023
5 22 0.659131 1 0.000128
6 24 0.656923 1 7.37e−05
7 26 0.655217 1 4.19e−05
8 28 0.65394 1 2.39e−05
9 30 0.652974 1 1.36e−05
10 32 0.652245 1 7.75e−06
11 34 0.651695 1 4.42e−06
12 36 0.651279 1 2.52e−06
13 38 0.650966 1 1.43e−06
14 40 0.650729 1 8.18e−07
15 30 0.650198 expand
16 32 0.650099 expand
17 34 0.65005 expand
18 36 0.650025 expand
19 38 0.650012 expand
20 40 0.650006 expand
21 42 0.650003 expand
22 44 0.650002 expand
23 46 0.650001 expand
24 48 0.65 expand
25 50 0.65 expand
26 52 0.65 expand
27 54 0.65 expand
28 56 0.65 expand
... ... ... ...
45 90 0.65 expand
46 92 0.65 expand
47 94 0.65 expand
48 96 0.65 expand
49 98 0.65 expand
50 100 0.65 expand
51 102 0.65 expand
52 104 0.65 expand
53 106 0.65 expand
54 108 0.65 expand
55 110 0.65 reflect
56 112 0.65 contract outside
57 115 0.65 shrink
58 118 0.65 shrink
... ... ... ...
82 190 0.65 shrink
83 193 0.65 shrink
84 196 0.65 shrink
85 199 0.65 shrink
86 202 0.65 shrink
Los dos métodos, tanto fminunc como fminsearch encuentran el mismo mı́nimo, pero en un numero dife-
rente de iteraciones. Mientras que fminunc encuentra el óptimo en 15 iteraciones, fminsearch lo encuentra
en 87 iteraciones, algo lógico ya que implementa el algoritmo directo de Nelder-Mead 4 , como se ha vis-
to es un algoritmo sencillo matemáticamente hablando, pero computacional mente puede ser algo pesado
por el numero de veces que puede iterar debido al número de etapas que tiene, además es un poco largo,
ya que el algoritmo tiene 5 etapas. Pero esto también se debe al punto inicial especificado. Comparándo-
lo con los métodos analı́ticos se puede verificar que estas dos funciones de Matlab tampoco encuentran el
mı́nimo correcto, para dicho punto inicial, pues el óptimo que encuentran es para x∗f minunc = −890,5280 y
x∗f minsearch = −2,7022 × 1015 , algo imposible de ver gráficamente. Cabe recordar que la columna First order
optimality enuncia los posibles óptimos, en el caso de esta función, ninguno de los valores que se muestran
en dicha columna se corresponden con el óptimo correcto.
Finalmente se ha probado con x0 = −1, para este punto si que se encuentra el mı́nimo correcto con las
dos funciones de Matlab, esto es; f (x∗ ) = 0′ 7681 con x∗ = −0′ 5787, véase el siguiente resultado:
First−order
Iteration Func−count f(x) Step−size optimality
0 2 0.785509 0.05
1 6 0.769647 10 0.04
2 10 0.768178 0.355663 0.000348
4 El método se ha explicado en la primera función
Optimización de Sistemas 16 de mayo de 2023
3 12 0.768178 1 6.22e−05
4 14 0.768178 1 1.34e−07
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = −0.5782
y = 0.7682
Se encuentra el mı́nimo correcto en pocas iteraciones (5 para fminunc y 16 para fminsearch). En este caso
entre los métodos analı́ticos y las funciones de optimización de Matlab, personalmente, resolverı́a el problema
con las funciones de Matlab, si supiese más o menos dónde está el mı́nimo para poder saber donde poner
el punto inicial: x0 y obtener el resultado lo más rápido posible, ya que a nivel de velocidad de computo,
son más rápidas las funciones de Matlab, que los métodos analı́ticos. Si que es verdad que nunca se va a
saber con exactitud dónde van a estar los óptimos de una función por lo que si se quiere jugar seguro, lo más
acertado serı́a optimizar la función con los métodos analı́ticos, pero todo depende del contexto y del problema.
Una vez encontrado el mı́nimo, se intenta encontrar el máximo de la función (para no hacer el informe
más largo de lo que es, enunciaré el único resultado correcto, y mencionaré para que otros puntos iniciales
se ha simulado el código)
Para x0 = −1 se ha encontrado el máximo correcto, para las dos funciones: fminunc y fminsearch, véase
el resultado:
First−order
Iteration Func−count f(x) Step−size optimality
0 2 −0.785509 0.05
1 6 −0.800673 8.97112 0.0166
2 8 −0.802755 1 0.00291
3 10 −0.802836 1 0.000548
4 12 −0.802839 1 2.65e−05
5 14 −0.802839 1 2.58e−07
x = −1.7295
y =−0.8028
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = −1.7295
y = −0.8028
Hace falta notar que máximo correcto es f (x∗ ) = 0,8028 con x∗ = −1,7295, las dos funciones nos lo devuelven
cambiado de signo, porque para poder encontrar el máximo, se le ha de cambiar el signo a toda la función,
por ello el valor de la función está cambiado de signo, por lo que el resultado es correcto.
2
2.3. Tercera función: f (x) = cos(x) · e−(x−π)
2
f (x) = cos(x) · e−(x−π) (✈)
df (x) 2 2
f˙(x) = = −e−(x−π) · sin(x) − e−(x−π) · cos(x) · (2x − 2π)
dx
d2 f (x) 2 2 2
f¨(x) = = e−(x−π) · cos(x) · (2x − 2π)2 − 3e−(x−π) · cos(x) + 2e−(x−π) · sin(x) · (2x − 2π)
dx2
Con el método analı́tico, se obtiene el siguiente resultado;
Corrección respecto a la P2B: esta función no es discontinua en π de hecho la función es continua ∀R,
debı́ de hacer ese apartado rápido y cometı́ esa barbaridad de error. El óptimo se corresponde con un mı́nimo
en x∗ = −1′ 6742 pues f (x∗ ) = −8′ 74 · 10−12 aunque podrı́a ser aproximado a un punto de inflexión por lo
pequeño que es el valor que toma la función en ese punto.
Viendo la representación gráfica se intuye que habrá un mı́nimo en x∗ = π en dicho valor la función vale;
f (x∗ ) = −1. Sabiendo que se tiene un coseno multiplicado a una exponencial, se analiza la ecuación. El
cos(x) toma un valor máximo para x = 0 y x = 2π, En dichos valores, la función f (x) toma los siguientes
valores de manera correspondiente; f (x∗ ) = 5,1723 × 10−5 y f (x∗ ) = 5,1723 × 10−5 , este es el óptimo que
se encuentra arriba con los métodos analı́ticos. Esta función también se resolvió con los métodos iterativos
y con todos ellos se llegó a la conclusión de que el mı́nimo estaba en x∗ = −1,680000 y la función vale 0
en ese punto. Pero la función tiene el otro mı́nimo en π. Volviendo a los métodos iterativos y resolviendo la
función con todos lo métodos iterativos en R todas las simulaciones se han realizado con; x0 = 3 y L = 1 ası́
como se le ha especificado que vaya por la derecha (no todos los métodos necesitan punto inicial ni tampoco
un paso, pero lo he puesto una vez para no tener que repetirlo).
First−order
Iteration Func−count f(x) Step−size optimality
0 2 −0.970342 0.413
1 6 −0.999983 0.334625 0.0101
2 8 −1 1 0.000292
3 10 −1 1 4.74e−09
Local minimum found.
Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
<stopping criteria details>
x = 3.1416
y = −1.0000
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e−04
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e−04
x = 3.1416
y = −1.0000
Las dos funciones nos devuelven el resultado esperado y correcto, cabe destacar que este resultado se ha
obtenido para x0 = 3, por ello a las dos funciones les ha llevado muy pocas iteraciones encontrar el óptimo.
El mejor resultado a nivel de número de iteraciones contemplando solo las dos funciones de optimización de
Matlab, es la función fminunc ya que es la que itera menos (ya sabemos el porqué). Ahora bien teniendo en
cuenta el resto de métodos, los dos mejores métodos son el de Newton y el de la secante ya encuentran el
óptimo en 4 iteraciones y en 1 iteración respectivamente.
Ahora se va intentar maximizar la función para ver si fminsearch y fminunc encuentran algún máxi-
Optimización de Sistemas 16 de mayo de 2023
mo. Pondremos el punto inicial cerca de la pequeña colina posicionada antes del mı́nimo en x∗ = π. Se ha
probado con puntos iniciales que están dentro del siguiente rango: −2 ≤ x0 ≤ 4 y todos devolvı́an un valor
de la función de f (x∗ ) = 0′ 0090 que viene a ser 0 aproximadamente. Por lo que teniendo estos datos sobre la
mesa, se concluye diciendo que la función no tiene ningún máximo ya que ni con los métodos analı́ticos, ni
con los iterativos, ni tampoco con las funciones fminsearch y fminunc se ha conseguido encontrar un valor
superior a 0’5 y que lo tome la función.
3. Tarea 2
Elegir 3 de las funciones dependientes de múltiples variable de decisión optimizadas en los trabajos de
evaluación continua previos y buscar el óptimo con las funciones de optimización de Matlab fminsearch
y fminunc. Comparar los resultados obtenidos los métodos de Matlab y con los métodos utilizados para
resolverlos anteriormente.
x∗ = −1 1
4
Como en la segunda derivada ya no hay ninguna variable de decisión (ni x1 y tampoco x2 ) solamente hay
que enunciar los valores obtenidos tras igualar el gradiente de la función a 0. Obteniendo:
4 0
∇2 f (x∗ ) =
0 12
Como ∇2 f (x∗ ) es definida, entonces se tiene un óptimo local y sabiendo que x∗ = −1 41 con ∇2 f (x∗ )
positiva, entonces se puede concluir diciendo que se trata de un mı́nimo local. A continuación la representación
gráfica en 2D y 3D;
El mı́nimo de la función se encuentra en f (x∗1 , x∗2 ) = −2′ 375 con (x∗1 , x∗2 ) = (−1, 0′ 25) Por lo que a la hora
de optimizar la función con las funciones de Matlab se deberı́a de obtener dicho óptimo. Para x0 = (−1, 0′ 2)
y usando fminunc resultado gráfico es el siguiente:
Como se puede ver por el resultado gráfico, se encuentra el óptimo correcto esto es f (x∗1 , x∗2 ) = −2′ 36
con (x∗1 , x∗2 ) = (−1, 0′ 2)
El resultado analı́tico es el siguiente;
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 2.36 0.6
1 2.36 0.05 0.6 1
2 2.36 0.0125 0.6 0
3 2.36 0.003125 0.6 0
4 2.36 0.00078125 0.6 0
5 2.36 0.000195312 0.6 0
6 2.36 4.88281e−05 0.6 0
7 2.36 1.2207e−05 0.6 0
8 2.36 3.05176e−06 0.6 0
9 2.36 7.62939e−07 0.6 0
Local minimum possible.
fminunc stopped because the size of the current step is less than
the value of the step size tolerance.
Ahora se prueba con fminsearch (se intuye que el número de iteraciones será mayor ya que utiliza el método
de Simplex de Nelder Mead.)
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 −2.36 0.6
1 −2.375 0.05 4.44e−16 1
Local minimum found.
Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
<stopping criteria details>
x = −1.0000 0.2500
y = −2.3750
x = −1.0000 0.2500
y = −2.3750
x∗,1 = 0 0
x∗,2 = 0 −8
3
x∗,3 = −4
3 0
x∗,4 = −4 −8
3 3
Ahora solamente hay que sustituir los valores obtenidos tras igualar el gradiente de la función a 0 en el
resultado de la Hessiana, ası́ se podrá caracterizar cada solución, pues serán matrices diagonales y por ello
se podrán ver directamente los eigenvalues que serán los encargados de caracterizar la matriz. Se obtienen:
4
0
∇2 f (x∗,1 ) = ⇒ positiva
0
8
4 0
∇2 f (x∗,2 ) = ⇒ indef inida
0 −8
2 ∗,3 −4 0
∇ f (x ) = ⇒ indef inida
0 8
Optimización de Sistemas 16 de mayo de 2023
−4 0
∇2 f (x∗,4 ) = ⇒ negativa
0 −8
Esto significa que se tendrán un máximo y un mı́nimo, siendo los dos óptimos de carácter local, además
de 2 puntos sillas, pues hay dos matrices hessianas que son indefinidas.
A continuación se muestra la representación gráfica en 2D y 3D; En las curvas de nivel, se pueden ob-
servar los dos puntos silla (el de abajo a la derecha y el de arriba a la izquierda). Además de un máximo y
un mı́nimo. Sabiendo los mı́nimos que se han encontrado con los métodos analı́ticos, se intentará encontrar
dichos óptimos con las funciones de Matlab.
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 7.168 1.72
1 7.168 10 1.72 1
2 7.168 2.5 1.72 0
3 6.26209 0.625 1.1 0
Optimización de Sistemas 16 de mayo de 2023
Se encuentra el mı́nimo de la función, pues f (x∗ , y ∗ ) = 6 con (x∗ , y ∗ ) = (0, 0) al algoritmo le toma 9 iteracio-
nes encontrar uno de los óptimos (el mı́nimo). Ahora se repite el proceso pero para la función fminsearch
con el mismo punto inicial que antes.
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 10 5
1 10 2.76197 5 1
2 7.23216 0.690492 2.27 0
3 6.60026 1.38098 2.67 1
4 6.02237 0.387506 0.444 1
5 6.0001 0.0962185 0.0278 1
6 6 0.00687186 0.000142 1
7 6 3.54151e−05 3.76e−09 1
La función fminsearch también encuentra el óptimo de antes, pero lo hace en una iteración menos en com-
paración a la función fminunc, este comportamiento decreciente en lo que a iteraciones se refiere, ya se ha
observado arriba, y es que se intuye que cuando la función es fácil (cuadrática, cúbica sin ninguna componen-
te trigonométrica o exponencial y mucho menos logarı́tmica) la búsqueda del óptimo es más rápida que con
la función fminunc. Esto no se cumplı́a para las funciones de la anterior tarea, y justamente las funciones de
la tarea 1 de esta práctica tienen trigonométricas o exponenciales y a la hora de resolver los problemas con
las funciones de Matlab, la función fminsearch solı́a encontrar el óptimo en muchas más iteraciones, cosa
que no pasa en esta tarea.
El mı́nimo ya se ha encontrado, pero ahora se deberı́a de encontrar el máximo, para encontrar el máxi-
mo le cambiamos el signo a la función y también a las componentes del gradiente. Se simula el código para;
x0 = (−1, −1)
El resultado analı́tico es el siguiente;
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 −10 5
1 −10 10 5 1
2 −13.3076 2.5 8.68 0
3 −16.5606 0.696969 1.34 1
4 −16.6664 0.152567 0.0676 1
5 −16.6667 0.00841536 0.000212 1
6 −16.6667 2.64408e−05 2.1e−09 1
Optimización de Sistemas 16 de mayo de 2023
encontrar el óptimo. Si se intenta optimizar la función objetivo con fminsearch se obtiene el siguiente
resultado analı́tico;
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 −10 5
1 −10 10 5 1
2 −13.3076 2.5 8.68 0
3 −16.5606 0.696969 1.34 1
4 −16.6664 0.152567 0.0676 1
5 −16.6667 0.00841536 0.000212 1
6 −16.6667 2.64408e−05 2.1e−09 1
x = −1.3333 −2.6667
y = −16.6667
x = −1.3333 −2.6667
y = −16.6667
En este caso las dos funciones de Matlab encuentran el óptimo correcto y en el mismo número de iteracio-
nes. Cabe destacar que no ha sido posible encontrar los puntos sillas con estas dos funciones ya que aún
poniendo el punto inicial dónde se encuentran estos puntos, los métodos se van al máximo o al mı́nimo, creo
que esto puede deberse a la cercanı́a de todos los puntos entre ellos, se ha probado incluso maximizando o
minimizando, pero tampoco ha surtido efecto.
Las funciones de Matlab son buenas, pero solo devuelven un óptimo por cada simulación algo poco práctico,
en cambio los métodos analı́ticos pueden devolver diferentes óptimos a la vez.
Optimización de Sistemas 16 de mayo de 2023
" #
∂f (x)
2x1 − 400x1 · (−x21 + x2 ) − 2, 2x1 − 400x1 · (−x21 + x2 ) − 2 = 0
∂x1
∇f (x) := = ⇒ (12)
∂f (x) −200x21 + 200x2 −200x21 + 200x2 = 0
∂x2
x∗ = 1
1
Ahora se procede con el cálculo de la matriz hessiana:
2
∂ f (x) ∂ 2 f (x)
1200x21 − 400x2 + 2
2 ∂x1 x2 −400x1
∇2 f (x) := ∂ 2∂x 1
2 = (13)
f (x) ∂ f (x)
2
−400x1 200
∂x2 x1 ∂x2
Ahora solamente hay que sustituir los valores obtenidos tras igualar el gradiente de la función a 0 en el
resultado de la Hessiana, ası́ se podrá caracterizar cada solución, pues serán matrices diagonales y por ello
se podrán ver directamente los eigenvalues que serán los encargados de caracterizar la matriz. Se obtienen:
800 −400
∇2 f (x∗ ) = ⇒ positiva
−400 200
1.000000 1.000000 positiva
Sabiendo que se ha de encontrar, el mı́nimo en f (x∗1 , x∗2 ) = 0 para (x∗1 , x∗2 ) = (1, 1)
Norm of First−order
Iteration f(x) step optimality CG−iterations
0 1 2
1 1 1 2 1
2 0.953125 0.25 12.5 0
3 0.549578 0.0625 1.63 1
4 0.414158 0.125 2.74 1
5 0.292376 0.218082 5.67 1
6 0.155502 0.123894 0.954 1
7 0.117347 0.25 7.16 1
8 0.0385147 0.0935869 0.308 1
9 0.0385147 0.284677 0.308 1
10 0.0268871 0.0625 0.351 0
11 0.0118213 0.125 1.38 1
12 0.0029522 0.113247 0.983 1
13 0.000358233 0.0664422 0.313 1
14 1.04122e−05 0.0322022 0.0759 1
15 1.29593e−08 0.00556538 0.00213 1
16 2.21812e−14 0.000223724 3.59e−06 1
Como se puede comprobar gráfica y analı́ticamente, se encuentra el óptimo correcto ya que en los puntos
(x∗1 , x∗2 ) = (1, 1) la función vale; f (x∗1 , x∗2 ) ≃ 0
Ahora se simula para el mismo punto inicial pero para la función fminsearch.
El resultado analı́tico es el siguiente;
x =
1.0000 1.0000
y =
3.6862e−10
Optimización de Sistemas 16 de mayo de 2023
De nuevo, el mı́nimo devuelto es correcto, para este caso la función de optimización de Matlab: fminsearch
solo devuelve los valores (x∗1 , x∗2 ) = (1, 1) y el valor de la función en dichos puntos f (x∗1 , x∗2 ) = 0, debe de ser
que solo iterar una vez, lo que es una mejora con respecto al resultad en materia de iteraciones con respecto
a la función fminunc que itera hasta 17 veces.
4. Conclusión
En esta práctica se han comparado métodos de optimización mediante resultados analı́ticos y gráficos.
Cabe destacar la gran funcionalidad de las funciones fminunc y fminsearch, pero el hecho de que solo
devuelvan un tipo de óptimo reduce la versatilidad. Los métodos analı́ticos son potentes, por ello también
requieren de una mayor computación, debido al cálculo de gradientes, hessianos asi como de primeras y segun-
das derivadas, dependiendo del número de variables de decisión. Los métodos iterativos en comparación con
las funciones de optimización de Matlab, me parecen mejores ya que hay algunos que devuelven más de un
óptimo a la vez e iteran poco, sobretodo el método de Newton y de la secante. Ha sido un práctica larga pero
ilustrativa que me ha ayudado a refrescar funciones anteriores, ası́ como afianzar conceptos de los métodos
analı́ticos e iterativos vistos anteriormente. Creo además que ha sido una de las prácticas más importantes
que hemos hecho, porque al haber tenido que comparar resultados obtenidos con métodos anteriores, me
ha permitido corregir errores, un aspecto muy importante para ir afianzando conceptos correctamente y no
construir ideas erróneas unas encima de otras.
En la siguiente página se encuentra el código que se ha implementado para las funciones con dos varia-
bles de decisión. No he adjuntado todos los códigos porque solo cambia la función, por ello he adjuntado el
de dos variables de decisión, porque considero que es el más completo a nivel de contenido.
Optimización de Sistemas 16 de mayo de 2023
5. Código
clc
clear all
close all
%Pintar
subplot(2,1,1);mesh(x1,x2,fv);hold on;
subplot(2,1,2);contour(x1,x2,fv);hold on;
x0=[0,0];
y=−f(x0);
subplot(2,1,1);plot3(x0(1),x0(2),y,'or');
subplot(2,1,2);plot(x0(1),x0(2),'or');
%Parametros de optimizacion
opt=optimoptions(@fminunc,...
'Algorithm','trust−region',...
'GradObj','on',...
'Display','iter','MaxIter',20);
%Optimizo por los dos m t o d o s
%[x,y]=fminunc(f,x0,opt)
[x,y]=fminsearch(f,x0)
subplot(2,1,1);plot3(x(1),x(2),−y,'*b');
subplot(2,1,2);plot(x(1),x(2),'*b');
function [y,g]=fungrad(x)
x1=x(1);
x2=x(2);
y=100*(x2−x1ˆ2)ˆ2+(1−x1)ˆ2;
y=y; %Para maximizar cambiamos el signo
g(1)=2*x1 − 400*x1*(− x1ˆ2 + x2) − 2;
g(2)=−200*x1ˆ2 + 200*x2;
end