Optimización numérica con restricciones
El paquete cobyla
de Maxima permite calcular numéricamente valores mínimos para una función objetivo F(X) sujeta a restricciones sobre X con desigualdades de la forma g(X) > = 0, donde X es una lista de variables. El paquete ha de ser cargado de forma explícita en la sesión
load(fmin_cobyla)$
a menos que esté declarado entre los que pueden ser cargados automáticamente por Maxima cuando se requiere su uso. Véase al respecto lo señalado a propósito del paquete draw
- fmin_cobyla(F,X,Semilla);
fmin_cobyla(F,X,Semilla,Opciones );
Devuelve una aproximación del valor mínimo de la función F(X) donde X es una lista de variables de las que depende la función F, cuya fórmula explícita ha de ser definida en ese momento en términos de las variables que aparecen en X, sujetas a un conjunto opcional de restricciones. La Semilla es un punto inicial para la variable X.
Las Opciones pueden ser una o varias de entre las que siguen. Todas son declaradas en la forma opción=valor
- constraints
Lista de restricciones en forma de desigualdades e igualdades que debe satisfacer X.
Las restricciones de desigualdades deben ser de la forma g(X) > = h(X) o g(X) <= h(X).
Las restricciones de igualdad deben ser de la forma g(X) = h(X).
- rhobeg
Valor inicial de la variable interna RHO, que controla el tamaño del simplejo. Su valor por defecto es 1.0.
- rhoend
Valor final deseado para el parámetro RHO. Es aproximadamente la precisión de las variables. Su valor por defecto es 1d-6 (es decir, 10^(-6)).
- iprint
Nivel de información de salida. Su valor por defecto es 0. Y los posibles valores son:
0 - Sin información de salida
1 - Sumario al final de los cálculos
2 - Se van mostrando los nuevos valores de RHO y SIGMA, incluyendo el vector de variables
3 - Como en 2, pero la información se muestra cuando se calcula F(X)
- maxfun
Número máximo de evaluaciones de la función. Su valor por defecto es 1000.
Existe una variante que funciona como fmin_cobyla
, salvo por el hecho de que utiliza aritmética de precisión arbitraria (bigfloat) y que el valor por defecto de rhoend es 10^(fpprec/2). Los correspondientes comandos son:
- bf_fmin_cobyla(F,X,Semilla);
bf_fmin_cobyla(F,X,Semilla,Opciones );
-
load(fmin_cobyla)$
Las restricciones no son obligatorias. El ejemplo que sigue sirve de ilustración
f(x,y):= (x^2-y)^2 + (1+x)^2;
fmin_cobyla(f(x,y), [x, y], [1,1], iprint=1);
Los resultados obtenidos indican que, que en términos aproximados, la función alcanza en el punto (-1,1) su mínimo de valor 0.
En este caso es posible calcular en mínimo de la función de forma exacta al ser una función no negativa que se anula en (0,0), lo cual también puede corroborarse con técnicas del cálculo diferencial.
-
En este ejemplo se calcula el valor mínimo de la función
F(x,y)=xy
sobre el círculo unidad en el plano:
x^2+y^2 <= 1
.
Obviamente, el m&eiacute;nimo absoluto existe, al ser el dominio compacto y la función continua.
También es posible en este ejemplo encontrar el mínimo de forma exacta, aplicando el cálculo diferencial de varias variables a la determinación de extremos de funciones. El lector iniciado en tales herramientas podrá hacer los cálculos pertinentes, con ayuda de Maxima, si así lo desea.
fmin_cobyla(x*y, [x, y], [1,1], constraints=[x^2+y^2<=1], iprint=1);
-
En modelos de mercados financieros con un número finito de activos cuyo precio en tiempo t=0 es conocido así como los posibles precios aleatorios de los mismos en tiempo t=1, con un número finito de escenarios,
una oportunidad de arbitraje consiste en la existencia de una cartera de activos cuyo precio en t=0 sea menor o igual que cero,
pero que su valor en t=1 en cualquiera de los posibles escenarios es siempre mayor o igual que cero, y además en alguno de ellos es estrictamente positivo. Un mercado con oportunidades de arbitraje no es financieramente viable.
A continuación nos planteamos analizar si existen oportunidades de arbitraje en el mercado que definen las siguientes matrices de valor para cuatro activos en t=0 y t=1
Mt0: transpose(matrix([1, 2, 3, 1]));
Mt1: matrix([2,0.2,0.5,1],[0.1,2,0.1,1],[5,0.1,1.5,4],[3.5,0.6,2,1.5]);
-
cartera: matrix([H1,H2,H3,H4]);
CV0 : cartera.Mt0;
CV1 : cartera.Mt1;
- fmin_cobyla(CV0,[H1,H2,H3,H4],
[1,1,1,1],
constraints=[CV1[1,1]>=0,
CV1[1,2]>=0,
CV1[1,3]>=0,
CV1[1,4]>=0,
CV1[1,1]^2+ CV1[1,2]^2+ CV1[1,3]^2+ CV1[1,4]^2=1
],
iprint=1 );
De acuerdo con esos resultados, en t=1 la cartera determinada por Maxia tiene un valor casi 1 si ocurre el escenario 3,
y en los demás escenarios su valor nunca es negativo. Siendo además el coste de la misma en t=0 inferior a 0.
Ap_Optimizacion.wxmx