Main Content

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 Pass Extra Parameters in Problem-Based Approach.

Por ejemplo, suponga que desea minimizar la función

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

  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 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);

  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 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
Ahora llame a 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 y x0 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
La función objetivo es la función anidada 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)
La salida es la misma que en Funciones anónimas.

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.

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

  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.

Temas relacionados