domingo, 7 de noviembre de 2010

Cómo calcular el mínimo de una función sin restricciones

Resolver un problema NLP en Matlab es muy sencillo. Por ejemplo, vamos a calcular el mínimo de la función de Rosenbrock:

z = (1-x)2 + 100(y-x2)2



En primer lugar, definimos la función a minimizar en un archivo .m ("f01.m"):

function z = f01(u)
x = u(1);
y = u(2);
z = (1-x).^2 + 100*(y-x.^2).^2;

A continuación, usamos la función "fminsearch" para encontrar la solución.

La función fminsearch se utiliza para encontrar la solución a un problema NLP sin restricciones. Por ejemplo, en este caso, escribimos:

[u,f] = fminsearch(@(u) f01(u),[0 0])

donde u son los valores de "x" e "y" que minimizan la función, mientras que "f" es el valor de la función en ese punto. [0 0] es un vector con los valores iniciales de "x" e "y", con los que Matlab empezará a buscar la solución.

Matlab nos devuelve lo siguiente:

u =

    1.0000    1.0000


f =

  3.6862e-010



En el caso de que queramos utilizar límites superior e inferior para las variables, podemos usar la función "fmincon". Por ejemplo, si tenemos los siguientes límites en las variables:

2.0 < x  > 1.1
0.8 < y < 2.2

Calculamos directamente el mínimo como:

u0 = [0 0]; % valores iniciales
umin = [1.1 0.8]; % valores minimos
umax = [2.0 2.2]; % valores maximos

[u, f] = fmincon(@(u) f01(u),u0,[],[],[],[],umin,umax)

Matlab nos devuelve los siguientes valores:

u =

    1.1000    1.2100


f =

    0.0100

No hay comentarios: