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.

Pasar parámetros adicionales

Parámetros adicionales, variables fijas o datos

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

f(x)=(abx12+x14/3)x12+x1x2+(c+cx22)x22(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

Funciones anónimas

Para pasar parámetros utilizando funciones anónimas:

  1. 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;

  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:fMATLAB®

    a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; f = @(x)parameterfun(x,a,b,c);

  3. Llame al solucionador con la función anónima:fminunc

    [x,fval] = fminunc(f,x0)
    El siguiente resultado se muestra en la ventana de comandos:
    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ó.parameterfuna = 4f

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:lsqcurvefitxxdata

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 a través de una función anidada, escriba un único archivo queEcuación 1

  • Acepta,, y como entradasabcx0

  • 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
nestedfunabc

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) 
Funciones anónimas

Variables globales

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.

  1. 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;

  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

Temas relacionados