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

Algunas 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. Existen tres métodos para pasar estos parámetros:

Las variables globales son problemáticas porque no permiten que los nombres sean reutilizados entre las funciones. Es mejor utilizar uno de los otros dos métodos.

Por ejemplo, suponga que desea minimizar la función

f(x)=(abx12+x14/3)x12+x1x2+(c+cx22)x22(1)

para diferentes valores de a, by c. Los solucionadores aceptan funciones objetivas que dependen sólo de una única variable (x en este caso). En las secciones siguientes se muestra cómo proporcionar los parámetros adicionales a, by c. Las soluciones son para valores de parámetros a = 4, b = 2.1Y c = 4 Cerca x0 = [0.5 0.5] usando fminunc.

Funciones anónimas

Para pasar parámetros mediante funciones anónimas:

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

  2. Asigne valores a los parámetros y defina un identificador de función f a una función anónima introduciendo los siguientes comandos en el indicador MATLAB® :

    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 Solver fminunc con la función anónima:

    [x,fval] = fminunc(f,x0)
    La siguiente salida 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)

Suponga que posteriormente cambia, a a 3 y ejecute

[x,fval] = fminunc(f,x0)

Obtiene la misma respuesta que antes, 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 reingresando:

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, primero cree 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
ahora llame a lsqcurvefit:
% Assume ydata exists x = lsqcurvefit(fh,x,xdata,ydata)

Funciones anidadas

Para pasar los parámetros de Ecuación 1 a través de una función anidada, escriba un solo archivo que

  • Acepta a, b, cy x0 como entradas

  • Contiene la función objetiva como función anidada

  • Llamadas fminunc

Aquí está el código para el archivo de función para 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
la función objetivo es la función anidada nestedfun, que tiene acceso a las variables a, by c.

Para ejecutar la optimización, escriba:

a = 4; b = 2.1; c = 4;% Assign parameter values x0 = [0.5,0.5]; [x,fval] = runnested(a,b,c,x0) 
la salida es la misma que en 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 cálculos paralelos. Véase Factores que afectan a los resultados.

Para utilizar variables globales, declare que las variables son 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 su espacio de trabajo 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.