Pasar parámetros adicionales
Parámetros adicionales, variables fijas o datos
En ocasiones, las funciones objetivo o de restricción tienen parámetros además de la variable independiente. Los parámetros adicionales pueden ser datos o pueden representar variables que no cambian durante la optimización. Existen tres métodos para pasar estos parámetros:
Las variables globales son problemáticas porque no permiten reutilizar nombres entre las funciones. Es mejor utilizar uno de los otros dos métodos.
En general, para la optimización basada en problemas, se pasan parámetros adicionales de forma natural. Consulte Pasar parámetros adicionales en el enfoque basado en problemas.
Por ejemplo, suponga que desea minimizar la función
(1) |
para valores diferentes de a, b y c. Los solvers aceptan funciones objetivo que dependen solo de una única variable (en este caso x). En las siguientes secciones se muestra cómo proporcionar los parámetros adicionales a, b y c. Las soluciones son para valores de parámetro a = 4, b = 2.1 y c = 4 cerca de x0 = [0.5 0.5] utilizando fminunc
.
Funciones anónimas
Para pasar parámetros utilizando funciones anónimas:
Escriba un archivo que contenga el siguiente código:
function y = parameterfun(x,a,b,c) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ... (-c + c*x(2)^2)*x(2)^2;
Asigne valores a los parámetros y defina un identificador de función
f
para una función anónima introduciendo los siguientes comandos en la línea de comandos de MATLAB®:a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; f = @(x)parameterfun(x,a,b,c);
Llame al solver
fminunc
con la función anónima:La siguiente salida se muestra en la ventana de comandos:[x,fval] = fminunc(f,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = -0.0898 0.7127 fval = -1.0316
Nota
Los parámetros pasados en la función anónima son aquellos que existen en el momento en el que se crea la función anónima. Considere el ejemplo
a = 4; b = 2.1; c = 4; f = @(x)parameterfun(x,a,b,c)
Suponga que posteriormente cambia a
a 3 y ejecuta
[x,fval] = fminunc(f,x0)
Obtiene la misma respuesta que anteriormente, ya que parameterfun
utiliza a = 4
, el valor cuando se creó f
.
Para cambiar los parámetros que se pasan a la función, renueve la función anónima reintroduciéndola:
a = 3; f = @(x)parameterfun(x,a,b,c)
Puede crear funciones anónimas de más de un argumento. Por ejemplo, para utilizar lsqcurvefit
, cree primero una función que tome dos argumentos de entrada, x
y xdata
:
fh = @(x,xdata)(sin(x).*xdata +(x.^2).*cos(xdata)); x = pi; xdata = pi*[4;2;3]; fh(x, xdata)
ans = 9.8696 9.8696 -9.8696
lsqcurvefit
:% Assume ydata exists
x = lsqcurvefit(fh,x,xdata,ydata)
Funciones anidadas
Para pasar los parámetros de Ecuación 1 mediante una función anidada, escriba un único archivo que
acepte
a
,b
,c
yx0
como entradas;contenga la función objetivo como una función anidada;
llame a
fminunc
.
Este es el código para el archivo de función de este ejemplo:
function [x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0); % Nested function that computes the objective function function y = nestedfun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) +... (-c + c*x(2)^2)*x(2)^2; end end
nestedfun
, que tiene acceso a las variables a
, b
y c
.Para ejecutar la optimización, introduzca:
a = 4; b = 2.1; c = 4;% Assign parameter values
x0 = [0.5,0.5];
[x,fval] = runnested(a,b,c,x0)
Variables globales
Las variables globales pueden ser problemáticas, por lo que es mejor no utilizarlas. Además, las variables globales fallan en los cálculos en paralelo. Consulte Factors That Affect Results.
Para utilizar variables globales, declare que las variables son globales en el espacio de trabajo y en las funciones que utilizan las variables.
Escriba un archivo de función:
function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ... (-c + c*x(2)^2)*x(2)^2;
En su espacio de trabajo de MATLAB, defina las variables y ejecute
fminunc
:global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)
La salida es la misma que en Funciones anónimas.