Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.
A veces, las funciones objetivas 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. Hay 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.
Por lo general, para la optimización basada en problemas, se pasan parámetros adicionales de una manera natural. Ver.Pasar parámetros adicionales en enfoque basado en problemas
Por ejemplo, supongamos que desea minimizar la función
(1) |
para diferentes valores de, y.abc Solvers aceptar funciones objetivas que dependen sólo de una sola variable (en este caso).x En las secciones siguientes se muestra cómo proporcionar los parámetros adicionales y.abc Las soluciones son para los valores de parámetro a = 4, b = 2.1Y c = 4 Cerca x0 = [0.5 0.5] Usando.fminunc
Para pasar parámetros utilizando funciones anónimas:
Escriba un archivo que contenga el código siguiente:
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 para una función anónima introduciendo los siguientes comandos en el símbolo del sistema:f
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 solucionador con la función anónima:fminunc
[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 los que existen en el momento en 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)
Supongamos que posteriormente cambia, a 3 y ejecutaa
[x,fval] = fminunc(f,x0)
Obtienes la misma respuesta que antes, ya que usa, el valor cuando se creó.parameterfun
a = 4
f
Para cambiar los parámetros que se pasan a la función, renueve la función anónima reingresarla:
a = 3; f = @(x)parameterfun(x,a,b,c)
Puede crear funciones anónimas de más de un argumento. Por ejemplo, para usar, primero cree una función que tome dos argumentos de entrada y: ahora llame al:lsqcurvefit
x
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)
Para pasar los parámetros a través de una función anidada, escriba un único archivo queEcuación 1
Acepta,, y como entradasa
b
c
x0
Contiene la función objetivo como una función anidada
Llamadasfminunc
Aquí está el código para el archivo de función para este ejemplo: la función objetivo es la función anidada, que tiene acceso a las variables, y.
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
a
b
c
Para ejecutar la optimización, escriba: la salida es la misma que en.
a = 4; b = 2.1; c = 4;% Assign parameter values x0 = [0.5,0.5]; [x,fval] = runnested(a,b,c,x0)
Las variables globales pueden ser problemáticas, por lo que es mejor evitar usarlas. Además, las variables globales fallan en los cálculos paralelos. Ver.Factores que afectan a los resultados
Para utilizar variables globales, declare las variables para que sean globales en el espacio de trabajo y en las funciones que utilizan las variables.
Escribir 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 el espacio de trabajo, defina las variables y ejecute:MATLABfminunc
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