capÃ-tulo 5

18
CAPÍTULO 5 Optimización en MatLab: la función fmincon 57 CAPÍTULO 5 LA FUNCIÓN fmincon 5.1 EL TOOLBOX DE OPTIMIZACIÓN DEL PROGRAMA MatLab El Toolbox de Optimización es una colección de funciones que amplía la capacidad de computación numérica del programa MatLab. Este conjunto de funciones logran minimizar o maximizar funciones no lineales generales. Es decir, al usar la palabra ‘optimización’ en MatLab nos referimos al proceso de búsqueda del mínimo o máximo de una función, denominada comúnmente función obtjetivo’ en las funciones de optimización que incluye el Toolbox de Optimización de MatLab. Además, este Toolbox también incluye funciones para la resolución de ecuaciones no lineales y problemas de mínimos cuadrados. [3] Todas las funciones que incluye el Toolbox son ficheros con extensión .m, construidos con declaraciones de MatLab e implementan algoritmos de optimización específicos. Cada una de las funciones resuelve un tipo optimización, pudiendo encontrar funciones para la resolución de los siguientes problemas:

Upload: antonio-martinez

Post on 14-Dec-2014

30 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

57

CAPÍTULO 5 LA FUNCIÓN fmincon 5.1 EL TOOLBOX DE OPTIMIZACIÓN DEL PROGRAMA MatLab

El Toolbox de Optimización es una colección de funciones que amplía la capacidad de computación numérica del programa MatLab. Este conjunto de funciones logran minimizar o maximizar funciones no lineales generales. Es decir, al usar la palabra ‘optimización’ en MatLab nos referimos al proceso de búsqueda del mínimo o máximo de una función, denominada comúnmente ‘función obtjetivo’ en las funciones de optimización que incluye el Toolbox de Optimización de MatLab. Además, este Toolbox también incluye funciones para la resolución de ecuaciones no lineales y problemas de mínimos cuadrados. [3]

Todas las funciones que incluye el Toolbox son ficheros con extensión

.m, construidos con declaraciones de MatLab e implementan algoritmos de optimización específicos. Cada una de las funciones resuelve un tipo optimización, pudiendo encontrar funciones para la resolución de los siguientes problemas:

Page 2: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

58

§ Minimización no lineal sin restricciones. § Minimización no lineal con restricciones, incluyendo situaciones de

mínimos-máximos, minimización semi-definida, alcanzar determinadas especificaciones.

§ Programación lineal y cuadrática. § Ajuste de curvas y problemas. § Resolución de sistemas de ecuaciones no lineales. § Mínimos cuadrados lineales con restricciones. § Problemas de gran escala.

La capacidad y el alcance del Toolbox de Optimización de MatLab se puede ampliar combinando éste con otros toolboxes, o creando nuestros propios ficheros .m. En las tablas 5.1-1, 5.1-2 y 5.1-3, se muestra una breve descripción de cada una de las funciones disponibles en el toolbox, divididas en tres secciones, según que problema resuelven, minimización de funciones, resolución de ecuaciones y mínimos cuadrados (ajuste de curvas).

Tipo y descripción Notación Función Minimización escalar: encuentra el mínimo de una función de una variable.

min a )(af

para 21 aaa <<

fminbond

Minimización sin restricciones: encuentra el mínimo de una función de varias variables sin restricciones.

min x )(xf donde x es un vector.

fminunc, fminsearch

Programación lineal: resuelve un problema de programación lineal.

min x )(xf T sujeto a A.x = b, Aeq.x = beq , lb = x = ub

A, Aeq son matrices. f, x, b, beq, lb, ub son vectores.

linprog

Programación cuadrática: resuelve un problema de programación cuadrática como el que se especifica.

min x )(21

xfHxx TT +

sujeto a A.x = b, Aeq.x = beq, lb = x = ub H, A, Aeq son matrices. f, x, b, beq, lb, ub son vectores.

quadprog

Minimización con restricciones: encuentra el mínimo de una función no lineal de varias variables con restricciones.

min x )(xf sujeto a c(x)= 0, ceq(x) = 0, A.x = b, Aeq.x = beq, lb = x = ub A, Aeq son matrices. f, x, b, beq, lb, ub son vectores. c(x) y ceq(x) son funciones que devuelven un vector. c(x), ceq(x) y f(x) pueden ser funciones no lineales.

fmincon

Tabla 5.1-1 Funciones de minimización

Page 3: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

59

Tipo y descripción Notación Función Alcanzar valores especificados: resuelve un problema en el que se quieren alcanzar varios objet ivos.

min x,γ γ tal que F(x)-weight.γ = goal , y sujeto a c(x)= 0, ceq(x) = 0, A.x = b, Aeq.x = beq, lb = x = ub Weight, goal, x, b, beq, lb, ub son vectores. A, Aeq son matrices. c(x) y ceq(x) son funciones que devuelven un vector. F(x),c(x) y ceq(x) pueden ser funciones no lineales.

fgoalattain

Problema de mínimo-máximo: resuelve un problema de mínimo y máximo.

min x max{Fi} { Fi(x) } sujeto a c(x)= 0, ceq(x) = 0, A.x = b, Aeq.x = beq, lb = x = ub A, Aeq son matrices. x, b, beq, lb, ub son vectores. c(x) y ceq(x) son funciones que devuelven un vector. c(x), ceq(x) y F(x) pueden ser funciones no lineales.

fminimax

Minimización semi-infinita: encuentra el mínimo de una función de varias variables con restricciones semi-infinitas.

min x )(xf sujeto a A.x = b, Aeq.x = beq , lb = x = ub, y tal que K1(x, w1) = 0 ; K2(x, w2) = 0; …; Kn(x, wn) = 0 A, Aeq son matrices. f, x, b, beq, lb, ub son vectores. c(x), ceq(x), Ki(x, wi) son funciones que devuelven un vector. f(x), c(x), ceq(x) pueden ser funciones no lineales. Los vectores (o matrices) Ki(x, wi) ≤ 0 son funciones continuas tanto en x como en wi

Las variables wi son vectores de, como mucho, dimensión dos.

fseminf

Tabla 5.1-1 Funciones de minimización - continuación –

Page 4: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

60

Tipo y descripción Notación Función Ecuaciones lineales: resuelve un sistema de ecuaciones lineales de n incógnitas y n ecuaciones.

C.x = d, donde C es una matriz NxN, y d un vector columna con n componentes.

\ (slash)

Ecuación no lineal de una variable: calcula el cero de una ecuación continua de una variable.

)(af = 0 fzero

Ecuaciones no lineales: resuelve un sistema de ecuaciones no lineales de n incógnitas y n variables.

F(x) = 0 , donde x es un vector, y F(x) una función que devuelve un vector.

fsolve

Tabla 5.1-2 Funciones para la resolución de ecuaciones

Tipo y descripción Notación Función Mínimos cuadrados lineales: con el comando \slash se resuelve este tipo de problemas cuando se tienen m ecuaciones y n variables (m > n).

min x 2

2. dxC −

donde C es una matriz mxn, y d un vector columna con m componentes.

\ (slash)

Mínimos cuadrados lineales no negativos: resuelve un problema de mínimos cuadrados no negativos.

min x 2

2.

21

dxC − para x = 0

donde C y d son los componentes de la función objetivo.

lsqnonneg

Mínimos cuadrados con restricciones: resuelve un problema de míninos cuadrados sujeto a ciertas restricciones.

min x 2

2.

21

dxC −

sujeto a A.x = b, Aeq.x = beq , lb = x = ub

A, Aeq son matrices. C, x, b, beq, lb, ub son vectores.

lsqlin

Mínimos cuadrados no lineales: resuelve un problema mínimos cuadrados no lineales (ajuste de datos no lineal).

∑=i

i xFxF 22

2)(

21

)(21

l = x = u

quadprog

Ajuste de curvas no lineal: resuelve el problema de ajuste de curvas con mínimos cuadrados. A partir de unos valores de entrada dados xdata, y unos valores de salida observados ydata, encuentra los coeficientes x que cumplen mejor la ecuación.

min x 2

2),(

21

ydataxdataxF −

l = x = u

lsqcurveftit

Tabla 5.1-3 Funciones de mínimos cuadrados ( ajunte de curvas)

En la mayoría de las funciones de optimización de MatLab que acabamos de ver, se requiere la definición de una función .m que compute la función objetivo a optimizar. Es decir, la función objetivo (o función de error) realiza una serie de cálculos, que el usuario define, y devuelve como parámetro

Page 5: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

61

de salida, un escalar, que será el valor que se pretende minimizar (o maximizar). El problema de maximización se puede resolver usando las funciones de minimización vistas, sin más que indicarle a la función que minimice –f, si se desea maximizar una determinada función f.

En el problema que se resuelve en este proyecto, se trata de minimizar un conjunto de variables (los parámetros de diseño del circuito electrónico diseñado) tal que se cumplan una serie de especificaciones o características del circuito. Se trata pues, de un problema de optimización no lineal con varias variables, por ello la función elegida para automatizar el proceso de diseño ha sido la función de minimización del Toolbox de MatLab llamada ‘fmincon’. Veremos que la función objetivo en este caso es una función error, que devuelve un valor, al que llamaremos ‘error’, y que refleja cómo de cerca estamos de las especificaciones impuestas al circuito con unos determinados valores de los parámetros de diseño del mismo.

Más adelante se estudiará la función ‘fmincon’ en detenimiento. Un

aspecto clave a la hora de afinar en el valor que devuelve la función objetivo, es la modificación de las opciones de optimización. Estas opciones están incluidas en una estructura que la función de optimización recibe como parámetro de entrada, y que se llama ‘options’. Por la importancia de esta estructura de optimización, se dedicará un apartado a explicar en detalle cada uno de los parámetros que incluye la estructura de optimización ‘options’, que significan, cómo afectan en el proceso que lleva a cabo la función de optimización, y cómo se pueden modificar los valores de los parámetros de dicha estructura.

5.1.1 Algoritmos de las funciones del Toolbox de Optimización En el Toolbox de optimización de MatLab se hace una clasificación de

los algoritmos de optimización internos que usan las rutinas del Toolbox para operar. Recordemos que, las funciones de optimización no son más que rutinas con extensión .m que llevan a cabo, mediante un conjunto de sentencias, algoritmos de optimización específicos. Así pues, los algoritmos que desarrollan el conjunto de funciones de optimización pueden ser algoritmos de media escala o bien algoritmos de amplia escala. Esta distinción entre algoritmos se hace para diferenciar los algoritmos clásicos de los algoritmos de amplia escala, los cuales han sido diseñados para abordar problemas de amplia escala con más eficiencia. Veamos algunos ejemplos de los algoritmos que pertenecen a uno u otro de estos dos conjuntos diferenciados.[3]. - Algoritmos de media escala: Entre los algoritmos clasificados como de media escala nos encontramos con los algoritmos conocidos como método de búsqueda simple Nelder-Mead y método quasi-Newton o de métrica variable Broyden-Fletcher-Goldfarb-Shanno (BFGS) usados en la minimización sin restricciones. También se encuentran entre los algoritmos de media escala los métodos de

Page 6: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

62

programación cuadrática secuencial (SQP) usados en las funciones de minimización con restricciones, problemas de mínimo-máximo, alcance de objetivos y optimización semi-infinita. Y por último, nos encontramos los algoritmos que usan los problemas de mínimos cuadrados no lineales, tales como los métodos de Gauss-Newton y Levenberg-Marquardt. - Algoritmos de amplia escala: Los principales algoritmos de amplia escala son iterativos, es decir, que generan una secuencia de soluciones aproximadas. En cada iteración se resuelve un sistema lineal de forma aproximada. Entre este tipo de algoritmos se encuentran los problemas de límites con restricciones que son resueltos usando métodos de Newton reflejados. También problemas de igualdades con restricciones para los cuales se usa una iteracción de gradiente conjugado precondicionado. Para resolver los problemas de amplia escala de forma eficiente, se requiere información adicional (por ejemplo, si se usa uno de estos algoritmos para la minimización no lineal se requiere calcular computacionalmente el gradiente en la función objetivo que realiza el usuario).

Además, es importante tener en cuenta que los algoritmos de amplia escala no son aplicables a todo tipo de problemas que se puedan formular; por ejemplo, para la función elegida en este proyecto,‘fmincon’, el algoritmo de amplia escala que usa MatLab cubre los casos en los que solamente hay límites con restricciones o sólo igualdades lineales. Para cada caso en el que se aplica un algoritmo de amplia escala se necesita una información adicional específica. 5.1.2 Argumentos de las funciones del Toolbox de Optimización

Antes de pasar a hacer un estudio detallado de la función escogida para el desarrollo de nuestro problema, veamos los argumentos que usan las funciones del Toolbox de Optimización. Las tabla 5.1.1-1 describe los argumentos de entrada y la tabla 5.1.1-2 los argumentos de salida. En las tablas adjuntas se da una breve descripción de cada uno de los argumentos y qué funciones usan los usan, ya que no todas las funciones usan los mismos parámetros. Ya que en las tablas siguientes se muestra una descripción demasiado breve de los argumentos que usan las funciones, en el apartado siguiente, donde se explicará la función usada ‘fmincon’, veremos algunos detalles relevantes para la función ‘fmincon’ de los argumentos de entrada fun y options, y los argumentos de salida exitflag y output.

Page 7: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

63

Argumento Descripción Usado por las funciones

A, b La matriz A y el vector b son, respectivamente, los coeficientes de las restricciones de desigualdad lineal y el vector que incluye los valores de la parte derecha de las desigualdades, i.e.: A.x = b.

fgoalattain, fmincon, fminimax, fseminf, linprog, lsqlin,quadprog

Aeq, beq La matriz Aeq y el vector beq son, respectivamente, los coeficientes de las restricciones de igualdad lineal y el vector que incluye los valores de la parte derecha de las igualdades, i.e.: Aeq.x = beq.

fgoalattain, fmincon, fminimax, fseminf, linprog, lsqlin,quadprog

C, d La matriz C y el vector d son, respectivamente, los coeficientes del sistema lineal sobre- y sub-determinado y el vector de los valores de la parte derecha del sistema a resolver.

lsqlin,lsqnonneg

f Vector de coeficientes para el término lineal en la ecuación lineal f’*x o la ecuación cuadrática x’*H*x*+f’*x.

lsqlin,quadprog

fun Es la función a ser minimizada o función objetivo f(x). fun puede ser un objeto que se le pase a la función directamente o bien un fichero .m que realice las operaciones necesarias para computar f(x).

fgoalattain, fminbnd fmincon, fminimax, fminsearch, fminunc,fseminf, fsolve, fzero, lsqcurvefit, lsqnonlin

goal Vector de valores cuyos objetivos que intentan alcanzar. El vector debe tener la misma longitud que el número de objetivos.

fgoalattain

H

La matriz de coeficientes para los términos cuadráticos en la ecuación cuadrática x’*H*x+f’*x. H debe ser symmetric.

quadprog

lb, lu

Vectores de los límites inferior y superior que se permiten a los valores de los elementos del vector x. Normalmente son del mismo tamaño que x, aunque si lb o lu son de menor tamaño, supongamos de tamaño m, el programa aplicará estos límites a los primeros m elementos del vector x. Cuando no se le impongan límetes inferiores o superiores a los valores del vector x, pueden obtenerse valores como –Inf o Inf cualquier x(i).

fgoalattain, fmincon, fminimax, fseminf, linprog, lsqcurvefit, lsqlin, lsqnonlin, quadprog

nonlcon Es la función que computa las desigualdades no lineales y las restricciones de igualdad. nonlcon es el nombre de un fichero .m.

fgoalattain, fmincon, fminimax

options Es una estructura de parámetros. Cada uno de estos parámetros son opciones de optimización que usan las funciones de optimización.

Todas las funciones

seminfcon Función que computa la desigualdades no lineales, las restricciones de igualdad y las restricciones semi-infinitas. seminfcon es el nombre de una función .m.

fseminf

Tabla 5.1.1-1 Argumentos de entrada

Page 8: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

64

Argumento Descripción Usado por las funciones

P1,P2… Son argumentos adicionales que se pueden pasar a la función fun, nonlcon, o seminfcon. Usando estos parámetros, se evita la necesidad de definir variables globales en el programa.

fgoalattain, fminbnd fmincon, fminimax, fminsearch, fminunc,fseminf, fsolve, fzero, lsqcurvefit, lsqnonlin

xdata, ydata

El dato de entrada xdata, y el dato observado ydata en la función lsqcurvefit

lsqcurvefit

x0 Punto inicial, es un vector que contiene los valores iniciales asignados a los elementos de x.

Todas las funciones Excepto fminbnd

x1,x2 El intervalo en el que se minimiza fun. fminbnd

Weight Es un vector de pesos, para controlar los logros relativos por abajo o por arriba de los objetivos.

fgoalattain

Tabla 5.1.1-1 Argumentos de entrada - continuación -

Argumento Descripción Usado por las

funciones exitflag Condición de finalización de la función de

optimización. Todas las funciones

attainfactor Es el factor de mérito en la solución x fgoalattatin

fval Es quizás uno de los argumentos más importantes. Se trata del valor de la función objetivo fun en la solución x. Este es el valor que se desea calcular al usar la función de optimización.

fgoalattain, fminbnd fmincon, fminimax, fminsearch, fminunc,fseminf, fsolve, fzero, linprog,quadprog

grad El valor del gradiente de la función objetivo fun en la solución x.

fmincon, fminunc

hessian El valor de Hessian de la función objetivo fun en la solución x.

fmincon, fminunc

jacobian El valor del Jacobiano de la función objetivo fun en la solución x.

lsqcurvefit,lsqnonlin fsolve

lambda Los múltiplos del Lagrangiano en la solución x. lambda es una estructura, en la que cada campo es para un tipo diferente de restricción.

fgoalattain, fminbnd fmincon, fminimax, fminsearch, fminunc,fseminf, fsolve, fzero, linprog,quadprog

x Es la solución encontrada por la función de optimización. Cuando el argumento de salida exitflag > 0, entonces el valor de x es una solución; en otro caso x es el último valor que encontró la rutina de optimización antes de acabar prematuramente.

Todas las funciones

output Es una estructura de salida que contiene información sobre los resultados de la optimización.

Todas las funciones

Tabla 5.1.1-2 Argumentos de salida

Page 9: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

65

Algunos de los parámetros vistos contienen información imprescindible para que el usuario pueda saber si su optimización ha sido correcta, o si por el contrario no se ha conseguido alcanzar el valor deseado. A continuación se va a estudiar la forma y el funcionamiento de la función de optimización fmincon, y se va a profundizar más en algunos aspectos importantes de algunos de los argumentos que usa esta función de optimización. 5.2 FUNCIÓN DE OPTIMIZACIÓN ELEGIDA: fmincon

Ya se ha adelantado en el anterior apartado que la función de optimización que mejor se adapta a las características del problema a resolver con el programa desarrollado en MatLab en el presente proyecto es, la función de minimización del Toolbox de Optimización fmincon. El propósito de esta función es encontrar el mínimo del valor escalar que devuelve una función de varias variables no lineal y sujeta a una serie de restricciones. Normalmente se conoce este tipo de problemas como optimización no lineal con restricciones o programación no lineal. La función escalar de varias variables se llamará función objetivo. El usuario debe implementar esta función objetivo para que se realicen los cálculos oportunos para obtener el valor escalar que devuelve la función. Se puede describir de forma breve el propósito de la función de minimización como sigue:

Calcular el mínimo de f(x) sujeta a las restricciones

donde A, Aeq, son matrices, x, b, beq, lb y lu son vectores y c(x) y ceq(x) son funciones que devuelven vectores y la función f(x) es una función multivariable que devuelve un escalar. Las funciones f(x), c(x) y ceq(x) pueden ser funciones no lineales.

Para comprender cómo se ha usado la función de minimización no lineal

escogida en el programa diseñado en MatLab para la automatización del proceso de diseño de un circuito electrónico, veamos detalladamente en los apartados siguientes la sintaxis y el significado de los parámeros de entrada y salida más notables de la función de minimización fmincon.

5.2.1 Sintaxis de la función fmincon

Para un correcto uso de la función de minimización fmincon en cualquier programa que se desarrolle en MatLab, es importante conocer que parámetros recibe y devuelve ésta, así como el significado de cada uno de estos parámetros con los que la función trabaja. Existen distintas sintaxis para invocar a la función fmincon, desde la forma más fácil en la que la rutina sólo devuelve un parámetro de salida, hasta la forma más compleja en la que la función proporciona al usuario distintos parámetros de salida que pueden

c(x)= 0 ceq(x)=0 A.x = b Aeq.x = beq lb = x = ub

Page 10: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

66

resultarle de gran utilidad en la resolución de su problema e incluso le pueden ser útiles para comprobar que el funcionamiento de la función ha sido el deseado. Veamos a continuación todas y cada una de las formas de invocar la función en MatLab, y que parámetros de salida nos puede proporcionar.

• x = fmincon (fun,x0,A,b) • x = fmincon(fun,x0,A,b,Aeq,beq) • x = fmincon(fun,x0,A,b,Aeq,beq,lb,lu) • x = fmincon (fun,x0,A,b,Aeq,beq,lb,lu,nonlcon) • x = fmincon (fun,x0,A,b,Aeq,beq,lb,lu,nonlcon,options) • x = fmincon (fun,x0,A,b,Aeq,beq,lb,lu,nonlcon,options,P1,P2,…) • [x,fval] = fmincon (…) • [x,fval,exitflag] = fmincon (…) • [x,fval,exitflag,output] = fmincon (…) • [x,fval,exitflag,output,lambda] = fmincon (…) • [x,fval,exitflag,output,lambda,grad] = fmincon (…) • [x,fval,exitflag,output,lambda,grad,hessian] = fmincon (…)

Veamos una descripción más amplia de cómo funcionaría la función cuando se invoca con cada una de las sintaxis especificadas anteriormente:[3]

X = fmincon (fun,x0,A,b) empieza con los valores especificados por el vector de inicio x0, y encuentra un valor mínimo del vector x para la función que ha sido descrita en fun, y tal que se cumpla la inecuación lineal A.x = b. x = fmincon (fun,x0,A,b,Aeq,beq) encuentra el mínimo de la función fun, sujeta a la condición de igualdad Aeq.x = beq, además de la inecuación A.x = b. Cuando no existan condiciones de desigualdad, se debe establecer las variables A=[ ], y b=[ ]. x = fmincon(fun,x0,A,b,Aeq,beq,lb,lu) encuentra el mínimo de la función fun, sujeta a las condiciones A.x = b y Aeq.x < beq. Ahora se definen unos límites inferiores y superiores para los valores de las variables de diseño, el vector x, así que la solución que haya la rutina estará comprendida en el rango lb = x = lu. Cuando no se usen las restricciones de igualdad de la función fun habrá que establecer Aeq=[ ], y beq=[ ]. x = fmincon(fun,x0,A,b,Aeq,beq,lb,lu,nonlcon) encuentra el mínimo de la función fun, para que se cumplan las anteriores restricciones y además sujeta la minimización de las inecuaciones no lineales c(x) o ceq(x) definidas en la función nonlcon. fmincon minimiza tal que se cumpla que c(x)= 0 y ceq(x)= 0. Cuando no se usen límites inferiores y/o superiores para los valores del vector de parámetros, habrá que establecer lb=[ ] y lu=[ ]. x = fmincon(fun,x0,A,b,Aeq,beq,lb,lu,nonlcon,options) minimiza la función objetivos, teniendo en cuenta los parámetros de optimización especificados en la estructura options. Si no se usan las restricciones del tipo c(x)= 0 y ceq(x)= 0, establecer nonlcon=[ ]. La estructura de optimización options merece un estudio aparte, ya que los parámetros de

Page 11: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

67

optimización que integran la estructura pueden influir notablemente en la solución que se obtenga en el proceso de minimización de fmincon. Por ello se estudiarán en un apartado siguiente cada uno de los elementos de la estructura, para comprender como pueden afectar a la solución encontrada. x = fmincon(fun,x0,A,b,Aeq,beq,lb,lu,nonlcon,options,P1,P2,…) pasa parámetros adicionales a la función objetivo, sin necesidad de tener variables globales. Cuando los argumentos de la función A,b,Aeq,beq,lb,lu,nonlcon y options, no sean necesarios, habrá que establecerlos como matrices vacías. [x,fval] = fmincon (…), devuelve el valor de la función objetivo fun, evaluada en el vector de parámetros x. [x,fval,exitflag] = fmincon (…), devuelve el valor de la función objetivo fun, evaluada en el vector de parámetros x y una bandera exitflag que indica la condición de salida o finalización de la función fmincon. [x,fval,exitflag,output] = fmincon (…), devuelve el valor de la función objetivo fun, evaluada en el vector de parámetros x, la condición de salida, exitflag, de la función de minimización, y una estructura llamada output que contiene información sobre la minimización llevada a cabo por la función fmincon. [x,fval,exitflag,output,lambda] = fmincon (…), devuelve los mismos valores anteriores y además una estructura llamada lambda que contiene los multiplos Lagrangianos en el vector obtenido x. [x,fval,exitflag,output,lambda,grad] = fmincon (…), devuelve los mismos valores anteriores y además el valor del gradiente de la función fun en la solución obtenda x. [x,fval,exitflag,output,lambda,grad,hessian] = fmincon (…), devuelve los mismos valores anteriores y además el valor del Hessian de la función fun en la solución obtenda x. Veamos a continuación algunos detalles importantes de algunos de los argumentos que usa la función fmincon. 5.2.2 Argumentos importantes de la función fmincon

Uno de los argumentos de entrada más interesantes de ésta y otras funciones de minimización es la función objetivo, fun, o función a ser minimizada. fun toma el vector x y devuelve un valor escalar, por ejemplo f, que es el valor que toma la función evaluada en x. El argumento que define la función objetivo, se puede especificar de dos formas. fun puede ser el nombre de una función con extensión .m, realizada por el usuario, y que realiza los

Page 12: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

68

cálculos necesarios para evaluar f(x) en x. La segunda forma de pasar el argumento fun a la función ‘fmincon’ es como un objeto en línea, es decir, en el lugar del parámetro fun se escribe directamente la expresión de la función f(x). Veamos como se puede usar este argumento de ‘fmincon’ con un sencillo ejemplo:

Ejemplo: Se desean encontrar los valores de x1, x2, x3 que minimizan la función f(x)= -x1.x2.x3. Para especificar el objeto fun en línea, tan sólo habría que invocar a la función ‘fmincon’ como sigue: [x,fval] = fmincon (inline(-x(1)*x(2)*x(3)), x0,…), donde x es un vector de tres elementos, y fval es el valor mínimo de la función evaluada en el valor encontrado para el vector x. Si por el contrario, se desease optar por la otra forma de pasar el parámetro de la función objetivo a la función ‘fmincon’, se debe realizar una función .m que compute la función f(x) de la siguiente forma: function f= myfun(x) f = - x(1)*x(2)*x(3); y la forma de invocar fmincon sería: [x,fval] = fmincon ( ‘myfun’, x0,…) Se puede además obtener el gradiente de la función objetivo, para ello habrá que activar un elemento de la estructura de opciones de optimización options que permite que la función objetivo compute el cálculo del gradiente. Para activar dicho elemento en la estructura de optimización se usa ‘optimset’, que es una instrucción que permite crear o modificar los parámetros de optimización de la estructura. El uso de esta instrucción es como sigue en este caso: options = optimset(‘GradObj’, ‘on’)

El gradiente es la derivada parcial de f en el punto x. Es decir, si se llama g al gradiente, el i-ésimo componente de g sería la derivada parcial de la función f(x) respecto del i-ésimo componente del vector x y evaluada en la solución x. En el caso de que se active la opción de cálculo del gradiente, la función fun devuelve dos parámetros de salida, es decir, tendríamos en este caso algo tal que así: function [f,g] = myfun(x) f = …; if nargout > 1 % fun se usa con dos argumentos de salida

g = …; end Notar que chequeando el valor de la variable nargout se evita el cómputo de g si la función fun se llama con sólo un argumento de salida ( es

Page 13: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

69

decir, el caso en el que el algoritmo de optimización sólo necesita el valor f y no g). También se puede calcular la matriz Hessiana, activando esta opción en la estructura options. Es decir, se debería escribir antes de usar fmincon: options = optimset(‘Hessian’, ‘on’). En este caso, también se puede chequear el valor de la variable nargout para evitar el computo de H si la función fun se llama con sólo con uno o dos argumentos de salida ( es decir, en el caso en el que la optimización sólo necesita los valores de f y g, pero no H ). La matriz Hessiana es una matriz simétrica, donde cada elemento es una derivada parcial segunda. Esto es, el elemento (i,j) de la matriz H sería la derivada parcial segunda de f con respecto al elemento i-ésimo y j-ésimo de x,

ji xxf

∂∂∂ 2

.

La estructura de la función objetivo en el caso de que se compute la

matriz Hessiana sería algo tal que así: function [f,g,H] = myfun(x) f = …; if nargout > 1 % fun se usa con dos argumentos de salida g = …; if nargout > 2 H = …; % matriz Hessiana evaluada en x end end Otro argumento de entrada de gran importancia a la hora de usar tanto la función de minimización no lineal fmincon, como cualquiera de las demás funciones del Toolbox de Optimización de MatLab, es la estructura de opciones de optimización, llamada options. Esta estructura contiene varios campos que permiten influir de manera notable en el proceso que lleva a cabo la rutina de optimización. Debido a la importancia de la estructura options y a la gran cantidad de parámetros que ésta contiene, se verá en el siguiente apartado. Hay dos argumentos de salida que merecen ser tenidos en cuenta. Estos dos parámetros son exitflag y output. El argumento de salida exitflag es una bandera que indica al usuario la razón por la que ha finalizado la función de optimización y puede tomar los siguientes valores:

• Exitflag > 0, indica que la función f(x) converge en la solución x.

• Exitflag = 0, indica que se ha alcanzado el número máximo de evaluaciones permitidas a la función f(x) o de iteracciones de la función fmincon.

• Exitflag < 0, indica que la función f(x) no converge a una solución.

Page 14: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

70

El argumento de salida output es una estructura, cuyos campos contienen información sobre la optimización que se ha llevado a cabo en la rutina. Los parámetros de esta estructura y el significado de ellos son:

• output.Iterations: iteraciones llevadas a cabo por fmincon. • output.funcCount: número de evaluaciones de la funcion objetivo. • output.algorithm: El algoritmo usado por la función fmincon. • output.cgiterations: número de iteraciones de PCG ( solo para el caso de algoritmos de escala amplia). • output.stepsize: El tamaño del paso final tomado

(sólo para algoritmos de media escala). • output.firstorderopt: Es una media de optimicidad de primer orden (sólo para algoritmos de escala amplia).

5.2.3 La estructura de parámetros de optimización ‘options’

El argumento de entrada options es una estructura cuyos campos proporcionan a las funciones opciones adicionales para el proceso de optimización. Cada uno de los campos que componen la estructura tiene asignado un valor por defecto, que puede cambiarse usando la función de MatLab ‘optimset’. Algunos de los parámetros son aplicables a todos los algoritmos, otros sólo con relevantes si la rutina de optimización usa un algoritmo de amplia escala y de forma similar, hay parámetros que sólo tienen sentido para la función de optimización si ésta usa un algoritmo de escala media. Para la función fmincon, sólo tiene sentido usar algunos de los parámetros de la estructura options, pero antes de hablar de cómo afectan éstos a la función, veamos todos los parámetros que componen la estructura options y una breve descripción de cada uno en la tabla adjunta 5.2.3-1.

Parámetro Descripción DerivativaCheck Compara derivadas analíticas proporcionadas por el usuario

(gradientes y jacobienos) y derivadas diferenciales finitas. Diagnotics Imprime información de diagnostico sobre la función objetivo. DiffMinChange Mínimo incremento diferencial en los elementos del vector x. DiffMinChange Máximo incremento diferencial en los elementos del vector x. Display Nivel de display. Si se establece este parámetro como ‘off’ no

muestra nada a la salida de la función. Si se establece como ‘iter’ muestra la salida en cada iteración de la función; si se establece como ‘final’ sólo muestra la salida al finalizar la función.

GoalsExatAchieve Número de logros que se desean conseguir. GradConstr Gradientes de las restricciones no lineales definidas por el usuario. GradObj Gradiente de la función objetivo definida por el usuario. El gradiente

de la función debe ser proporcionado cuando se usa un algoritmo de amplia escala. En caso contrario, es decir se usa uno de media escala, es opcional.

Hessian Matriz Hessiana para la función objetivo. HessPattern Grado de libertad de la matriz Hessiana en diferenciales finitos. HessUpdate Esquema de actualización Quasi-Newton.

Page 15: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

71

Jacobian Jacobiano de la función objetivo. JacobPattern Grado de libertad del Jacobiano en diferenciales finitos. LargeScale Usar un algoritmo de amplia escala si es posible. Cuando el

parámetro largeScale se establece a ‘on’; Cuando está establecido como ‘off’ la función usará un algoritmo de media escala.

LevenbergMarquardt

Elegir un algoritmo de Leverberg-Marquardt en lugar de un algoritmo de Gauss-Newton.

LineSearchType Línea de búsqueda del algoritmo elegido. MaxFunEvals Máximo número de evaluaciones de fun permitidos. MaxIter Máximo número de iteraciones de la función de optimización

permitido. MaxPCGIter Máximo número de iteraciones PCG (preconditioned conjugate

gradient) permitido. Sólo será necesario cuando se use un algoritmo de amplia escala en la rutina de optimización.

MeritFunction Usar una función de mérito. MinAbsMax Número de F(x) a minimizar en el peor de los casos. PrecondBandwidth Ancho de banda superior del precondicional para el PCG. TolCon Tolerancia de finalización en la violación de las restricciones. TolFun Tolerancia de finalización en el valor de fun. TolPCG Tolerancia de finalización en la iteración PCG.

TolX Tolerancia de finalización en el valor de x.

TypicalX Valores típicos de los elementos del vector x. Sólo se usará en los algoritmos de escala amplia.

Tabla 5.2.3-1 Parametros de la estructura ‘options’

Una vez vistos todos los parámetros que integran los campos de la estructura de opciones de optimización, pasemos a hacer un estudio de los parámetros que han tenido mayor relevancia en nuestro caso. Hay varios parámetros que permiten influir en el proceso de optimización que lleva a cabo la rutina, pero para nuestro problema en particular, y en orden de importancia estos parámetros han sido: TolFun, TolX, MaxFunEvals, MaxIter. Hay que decir que el parámetro TolCon tiene tanta o más importancia que los parámetros TolFun y TolX. Ahora bien, dado que no ha sido necesario definir restricciones del tipo c(x)= 0, ceq(x)=0, A.x = b o Aeq.x = beq en la forma en la que se ha planteado el problema que se ha resuelto con el uso de la función fmincon en nuestro programa en MatLab, el parámetro TolCon carece de significado en nuestro caso.

- Los parámetros TolFun y TolX:

Los campos TolFun y TolX son parámetros de tolerancias relativas que pueden influenciar en cómo y cuando se converge a una solución, y por tanto afectan a la solución que encuentra la función de optimización, x y fval (véase la tabla de argumentos de salida 5.1.2-2). TolFun es la tolerancia de finalización que se permite a la función objetivo fun. Cuando la función de optimización use como criterio de optimización el valor del parámetro TolFun, entonces buscará que la derivada direccional en la dirección de búsqueda del

Page 16: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

72

valor que devuelve fun sea al menos 2*options.TolFun. Es decir, se converge a una solución cuando la pendiente entre dos valores consecutivos del valor que devuelve la función objetivo sea al menos del orden de 2*TolFun. La función de optimización se parará si la pendiente entre dos valores consecutivos del valor devuelto es menor de lo especificado. Si se sigue este criterio de optimización, al finalizar satisfactoriamente la rutina de optimización, se mostrará en la pantalla del computador un mensaje como el siguiente: “Optimization terminated successfully: Magnitude of direccional derivative in search direction less than 2*options.TolFun and maximum constraint violation is less than options.TolCon.”

Del mismo modo, el parámetro TolX es una tolerancia de terminación

para los valores estimados del vector solución x. Si se usa como criterio de optimización el valor del parámetro TolX, se buscará que el cambio del valor de los parámetros del vector x sea menor que TolX. El mensaje que se mostrará por pantalla cuando se haya encontrando una solución y finalice la rutina sería como el siguiente:

“Optimization terminated successfully: Search direction less than 2*options.TolX and maximum constraint violation is less than options.TolCon.”

Es muy importante tener en cuenta que las rutinas de optimización hacen un OR entre los parámetros de optimización TolFun y TolX, así que el hecho de seguir uno u otro criterio de terminación dependerá del valor que tengan tales parámetros. Por defecto, TolFun y TolX tienen el mismo valor, 1e-006. En caso de que no se cambien estos dos valores, y al ser los dos parámetros iguales, la función sigue cualquiera de los dos criterios de optimización vistos. Para cambiar el valor de cualquier parámetro de la estructura options, como ya se ha visto anteriormente, se usa la función optimset. Alterar el valor de los parámetros TolFun y TolX supone alterar la solución a la que converge la rutina de optimización. Por ejemplo, supongamos que se cambia el valor por defecto de los dos parámetros de 1e-006 a 1e-005; este aumento relaja los dos criterios de optimización vistos, resultando en una solución notablemente menos exacta. De forma similar, si se disminuye el valor de TolFun y/o TolX, por ejemplo de 1e-006 a 1e-008 se limita uno o los dos criterios de optimización, resultando en una solución más exacta, aunque muy posiblemente se requieran un mayor número de iteraciones de la función de optimización. Normalmente el usuario disminuye los valores de estos parámetros cuando observa que la solución encontrada es subóptima. Dado que la función que se pretende resolver en este proyecto es fuertemente no lineal, se ha ido apurando en la solución que encuentra la función fmincon cambiando los valores de los parámetros vistos TolFun y TolX. Se verán las soluciones obtenidas para distintos valores de estos parámetros en el capítulo 7.

Page 17: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

73

- Los parámetros MaxFunEvals y MaxIter:

El parámetro MaxIter es el número de iteraciones permitidas en el proceso de estimación que lleva a cabo la función fmincon. Cada iteración, involucra una optimización, y por lo tanto distintas evaluaciones de la función objetivo fun. El valor por defecto que tiene MaxIter es 400. Aunque el proceso de estimación raramente excede este número de iteraciones de la función de optimización, se puede incrementar este valor usando optimset si se sospechase que el proceso ha terminado prematuramente.

MaxFunEvals, un campo estrechamente relacionado con el anterior,

MaxIter, especifica el máximo número de evaluaciones que se realizarán, a lo largo de todo el proceso de estimación de una solución optima, de la función objetivo. El valor por defecto de MaxFunEvals es 100 veces el número de parámetros que se están estimando. Es decir, si la función objetivo recibe un vector con 3 elementos, el valor de MaxFunEvals es 300. Cuando la rutina de optimización acaba prematuramente, sin encontrar una solución, será normalmente porque se ha excedido este parámetro. Al igual que en el caso anterior, se puede incrementar este valor usando optimset si el proceso ha finalizado y se sospecha que se puede conseguir una mejor solución.

Los campos MaxFunEvals y MaxIter son por naturaleza puramente

mecánicos. Aunque el usuario puede encontrar situaciones en las que se alcance el valor de MaxFunEvals y/o MaxIter, no suelen ser situaciones comunes. Si se aumenta el valor de estos campos, se puede converger a una solución mas satisfactoria; ahora bien, si la rutina de optimización finaliza por haber alcanzado alguno de estos valores, se está indicando que el modelo descrito es demasiado complicado. Finalmente, aunque los parámetros MaxFunEvals y MaxIter pueden ser causa de finalización de la función de optimización, hay que decir que su valor no afecta a la solución una vez ésta ha sido encontrada.

5.2.4 Ejemplo de la función fmincon

Veamos un ejemplo sencillo para comprender cómo se usa la función fmincon antes de pasar al siguiente apartado. Usaremos el ejemplo anterior en el que se mostró las dos formas de pasar a la función fmincon la función objetivo fun. Esto es, se desean encontrar los valores de x1, x2, x3 que minimizan la función f(x)= -x1.x2.x3, tal que además se cumpla que: 0 = x1 + 2x2+ 2x3 = 0.

El primer paso sería escribir el una función .m, que realiza los calculos de f(x) y devuelve el valor escalar f de la función objetivo evaluada en x. En este ejemplo, x es un vector de tres elementos, y el código de la rutina de la función objetivo simplemente: function f= myfun(x) f = - x(1)*x(2)*x(3);

Page 18: CapÃ-tulo 5

CAPÍTULO 5 Optimización en MatLab: la función fmincon

74

Ahora se escribirían las restricciones, y dado que tenemos dos desigualdades lineales, se escribirán procurando obtener algo tal que A.x = b. Si se reescribe la ecuación 0 = x1 + 2x2+ 2x3 = 0 como dos inecuaciones en las que ambas se tiene el signo menor o igual, tendríamos que: - x1 - 2x2 - 2x3 = 0 y x1 + 2x2 + 2x3 = 72. Por tanto, la matriz A y el vector b serían:

221221 −−−

=A y 720

=b

Es decir para poder invocar finalmente la función fmincon, deberíamos

escribir el siguiente conjunto de variables en MATLAB y la sentencia que invoca a la función tal como se indica a continuación: % Example fmincon------------------------------------------ A=[-1 -2 -2; 1 2 2]; b=[0 72]; x0 = [10; 10; 10]; % Starting guess at the solution

[x,fval,exitflag,output]=fmincon(@myfun,x0,A,b) % --------------------------------------------------------- Después de 64 iteraciones de fmincon, se obtiene la solución, siendo ésta x = (24 12 12) y el valor de la función fun evaluada en x, fval = 3.4560e+003. Al finalizar la función, la bandera exitflag es igual a 1, lo cual indica que se la función converge a una solución, y el mensaje final obtenido es el primer criterio de optimización visto anteriormente.