Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

fminunc

Encontrar el mínimo de una función multivariable no restringida

Descripción

Solver de programación no lineal.

Encuentra el mínimo de un problema especificado por

minxf(x)

donde f(x) es una función que devuelve un escalar.

x es un vector o una matriz; consulte Argumentos de matriz.

ejemplo

x = fminunc(fun,x0) comienza en el punto x0 e intenta encontrar un mínimo local x de la función descrita en fun. El punto x0 puede ser un escalar, un vector o una matriz.

Nota

En Pasar parámetros adicionales se explica cómo pasar parámetros adicionales a la función objetivo y a las funciones de restricción no lineales, si fuera necesario.

fminunc es para problemas no lineales sin restricciones. Si su problema tiene restricciones, por lo general se debe utilizar fmincon. Consulte Tabla de decisiones de optimización.

ejemplo

x = fminunc(fun,x0,options) minimiza fun con las opciones de optimización especificadas en options. Utilice optimoptions para configurar estas opciones.

ejemplo

x = fminunc(problem) encuentra el mínimo para problem, una estructura descrita en problem.

ejemplo

[x,fval] = fminunc(___), para cualquier sintaxis, devuelve el valor de la función objetivo fun en la solución x.

ejemplo

[x,fval,exitflag,output] = fminunc(___), devuelve adicionalmente un valor exitflag que describe la condición de salida de fminunc y una estructura output con información sobre el proceso de optimización.

[x,fval,exitflag,output,grad,hessian] = fminunc(___) devuelve adicionalmente:

Ejemplos

contraer todo

Minimice la función f(x)=3x12+2x1x2+x22-4x1+5x2.

Para hacerlo, escriba una función anónima fun que calcule el objetivo.

fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);

Llame a fminunc para encontrar un mínimo de fun cerca de [1,1].

x0 = [1,1];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    2.2500   -4.7500

fval = -16.3750

fminunc puede ser más rápida y más fiable cuando se le proporcionan derivadas.

Escriba una función objetivo que devuelva tanto el gradiente como el valor de la función. Use el formato condicionalizado descrito en Incluir gradientes y matrices hessianas. La función objetivo es la función de Rosenbrock,

f(x)=100(x2-x12)2+(1-x1)2,

que tiene el gradiente

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

El código de la función objetivo con gradiente aparece al final de este ejemplo.

Cree opciones para utilizar el gradiente de la función objetivo. Asimismo, establezca el algoritmo en 'trust-region'.

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

Establezca el punto inicial en [-1,2]. Después, llame a fminunc.

x0 = [-1,2];
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

El siguiente código crea la función rosenbrockwithgrad, que incluye el gradiente como la segunda salida.

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

Resuelva el mismo problema que en Proporcionar gradiente utilizando una estructura de problema en lugar de argumentos separados.

Escriba una función objetivo que devuelva tanto el gradiente como el valor de la función. Use el formato condicionalizado descrito en Incluir gradientes y matrices hessianas. La función objetivo es la función de Rosenbrock,

f(x)=100(x2-x12)2+(1-x1)2,

que tiene el gradiente

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

El código de la función objetivo con gradiente aparece al final de este ejemplo.

Cree opciones para utilizar el gradiente de la función objetivo. Asimismo, establezca el algoritmo en 'trust-region'.

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

Cree una estructura de problema incluyendo el punto inicial x0 = [-1,2]. Para obtener más información sobre los campos requeridos en esta estructura, consulte problem.

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';

Resuelva el problema.

x = fminunc(problem)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

El siguiente código crea la función rosenbrockwithgrad, que incluye el gradiente como la segunda salida.

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

Encuentre tanto la ubicación como el mínimo de una función no lineal y el valor de la función en ese mínimo. La función objetivo es

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

Encuentre la ubicación y el valor de la función objetivo del minimizador comenzando en x0 = [1,2].

x0 = [1,2];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052

Escoja opciones y salidas de fminunc para examinar el proceso de resolución.

Establezca opciones para obtener una visualización iterativa y utilice el algoritmo 'quasi-newton'.

options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');

La función objetivo es

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

Comience la minimización en x0 = [1,2] y obtenga salidas que le permitan examinar la calidad de la solución y el proceso.

x0 = [1,2];
[x,fval,exitflag,output] = fminunc(fun,x0,options)
                                                        First-order 
 Iteration  Func-count       f(x)        Step-size       optimality
     0           3         0.256738                         0.173
     1           6         0.222149              1          0.131  
     2           9          0.15717              1          0.158  
     3          18        -0.227902       0.438133          0.386  
     4          21        -0.299271              1           0.46  
     5          30        -0.404028       0.102071         0.0458  
     6          33        -0.404868              1         0.0296  
     7          36        -0.405236              1        0.00119  
     8          39        -0.405237              1       0.000252  
     9          42        -0.405237              1       7.97e-07  

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052
exitflag = 1
output = struct with fields:
       iterations: 9
        funcCount: 42
         stepsize: 2.9343e-04
     lssteplength: 1
    firstorderopt: 7.9721e-07
        algorithm: 'quasi-newton'
          message: 'Local minimum found....'

  • El indicador de salida 1 muestra que la solución es un óptimo local.

  • La estructura output muestra el número de iteraciones, el número de evaluaciones de función y otra información.

  • La visualización iterativa también muestra el número de iteraciones y las evaluaciones de función.

Cuando el problema tiene un número elevado de variables, el valor predeterminado de la HessianApproximation puede provocar que fminunc utilice una gran cantidad de memoria y que se ejecute despacio. Para utilizar menos memoria y ejecutar más rápido, especifique HessianApproximation="lbfgs".

Por ejemplo, si intenta minimizar la función multirosenbrock (enumerada abajo) con variables 1e5 utilizando los parámetros predeterminados, fminunc emite un error.

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
[x,fval] = fminunc(@multirosenbrock,x0)
Error using eye
Requested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to become
unresponsive.

Error in optim.internal.fminunc.AbstractDenseHessianApproximation (line 21)
        this.Value = eye(nVars);

Error in optim.internal.fminunc.BFGSHessianApproximation (line 14)
        this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars);

Error in fminusub (line 73)
    HessApprox = optim.internal.fminunc.BFGSHessianApproximation(sizes.nVar);

Error in fminunc (line 488)
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...

Para resolver este problema, establezca la opción HessianApproximation en "lbfgs". Para acelerar la resolución, establezca opciones para utilizar el gradiente proporcionado.

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
options = optimoptions("fminunc",HessianApproximation="lbfgs",...
    SpecifyObjectiveGradient=true);
[x,fval] = fminunc(@multirosenbrock,x0,options);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

La solución teórica es x(i) = 1 para todo i. Compruebe la precisión de la solución devuelta.

max(abs(x-1))
ans =

   1.3795e-04

Este código crea la función multirosenbrock.

function [f,g] = multirosenbrock(x)
% Get the problem size
n = length(x);  
if n == 0, error('Input vector, x, is empty.'); end
if mod(n,2) ~= 0
   error('Input vector, x ,must have an even number of components.');
end
% Evaluate the vector function
odds  = 1:2:n;
evens = 2:2:n;
F = zeros(n,1);
F(odds,1)  = 1-x(odds);
F(evens,1) = 10.*(x(evens)-x(odds).^2); 
f = sum(F.^2);
if nargout >= 2 % Calculate gradient
    g = zeros(n,1);
    g(evens) = 200*(x(evens)-x(odds).^2);
    g(odds) = -2*(1 - x(odds)) - 400*(x(evens)-x(odds).^2).*x(odds);
end
end

Argumentos de entrada

contraer todo

Función que desea minimizar, especificada como un identificador de función o un nombre de función. fun es una función que acepta un vector o un arreglo x y devuelve un escalar real f, con la función objetivo evaluada en x.

fminunc pasa x a su función objetivo en forma de argumento x0. Por ejemplo, si x0 es un arreglo de 5 por 3, fminunc pasa x a fun como un arreglo de 5 por 3.

Especifique fun como un identificador de función para un archivo:

x = fminunc(@myfun,x0)

donde myfun es una función de MATLAB® como

function f = myfun(x)
f = ...            % Compute function value at x

También puede especificar fun como un identificador de función para una función anónima:

x = fminunc(@(x)norm(x)^2,x0);

Si puede calcular el gradiente de fun y la opción SpecifyObjectiveGradient está establecida en true, según establece

options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun debe devolver el vector gradiente g(x) en el segundo argumento de salida.

Si también puede calcular la matriz Hessiana y la opción HessianFcn está establecida en 'objective' mediante options = optimoptions('fminunc','HessianFcn','objective') y la opción Algorithm está establecida en 'trust-region', fun debe devolver el valor hessiano H(x), una matriz simétrica, en un tercer argumento de salida. fun puede dar una matriz hessiana dispersa. Consulte Matriz hessiana para los algoritmos fminunc trust-region o fmincon trust-region-reflective para ver más detalles.

El algoritmo trust-region le permite proporcionar una función de multiplicación de matriz hessiana. Esta función da el resultado de un producto del vector por la matriz hessiana sin calcular la matriz Hessiana directamente. Esto puede ahorrar memoria. Consulte Función de multiplicación de matriz hessiana.

Ejemplo: fun = @(x)sin(x(1))*cos(x(2))

Tipos de datos: char | function_handle | string

Punto inicial, especificado como un vector real o un arreglo real. Los solvers utilizan el número de elementos en x0 y el tamaño de x0 para determinar el número y el tamaño de las variables que fun acepta.

Ejemplo: x0 = [1,2,3,4]

Tipos de datos: double

Opciones de optimización, especificadas como la salida de optimoptions o una estructura como la que devuelve optimset.

Algunas opciones son aplicables a todos los algoritmos y otras son relevantes para algoritmos particulares. Consulte Referencia de opciones de optimización para ver información detallada.

Algunas opciones no aparecen en la visualización optimoptions. Estas opciones se muestran en cursiva en la siguiente tabla. Para obtener más detalles, consulte Consultar las opciones de optimización.

Todos los algoritmos

Algorithm

Escoja el algoritmo de fminunc. Las opciones son 'quasi-newton' (predeterminada) o 'trust-region'.

El algoritmo 'trust-region' necesita que proporcione el gradiente (consulte la descripción de fun) o, si no, fminunc utiliza el algoritmo 'quasi-newton'. Para obtener información sobre cómo elegir el algoritmo, consulte Seleccionar el algoritmo.

CheckGradients

Compare las derivadas proporcionadas por el usuario (gradiente de objetivo) con las derivadas de diferencias finitas. Las opciones son false (predeterminada) o true.

Para optimset, el nombre es DerivativeCheck y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

La opción CheckGradients se eliminará en una versión futura. Para comprobar las derivadas, utilice la función checkGradients.

Diagnóstico

Muestre información de diagnóstico sobre la función que se desea minimizar o resolver. Las opciones son 'off' (predeterminada) o 'on'.

DiffMaxChange

Cambio máximo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es Inf.

DiffMinChange

Cambio mínimo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es 0.

Display

Nivel de visualización (consulte Visualización iterativa):

  • 'off' o 'none' no muestran salida alguna.

  • 'iter' muestra la salida en cada iteración y emite el mensaje de salida predeterminado.

  • 'iter-detailed' muestra la salida en cada iteración y emite el mensaje de salida técnico.

  • 'notify' solo muestra la salida si la función no converge y emite el mensaje de salida predeterminado.

  • 'notify-detailed' solo muestra la salida si la función no converge y emite el mensaje de salida técnico.

  • 'final' (predeterminada) solo muestra la salida final y emite el mensaje de salida predeterminado.

  • 'final-detailed' solo muestra la salida final y emite el mensaje de salida técnico.

FiniteDifferenceStepSize

Factor de tamaño de paso de escalar o vector para diferencias finitas. Cuando establece FiniteDifferenceStepSize en un vector v, las diferencias finitas progresivas delta son

delta = v.*sign′(x).*max(abs(x),TypicalX);

, donde sign′(x) = sign(x) excepto sign′(0) = 1. Las diferencias finitas centrales son

delta = v.*max(abs(x),TypicalX);

Un escalar FiniteDifferenceStepSize se expande a un vector. La opción predeterminada es sqrt(eps) para diferencias finitas progresivas y eps^(1/3) para diferencias finitas centrales.

El algoritmo trust-region utiliza FiniteDifferenceStepSize solo cuando CheckGradients está establecido en true.

Para optimset, el nombre es FinDiffRelStep. Consulte Nombres de opciones actuales y antiguos.

FiniteDifferenceType

Las diferencias finitas, utilizadas para estimar gradientes, son o bien 'forward' (la opción predeterminada), o bien 'central' (centradas). La opción 'central' requiere el doble de evaluaciones de función, pero debería ser más precisa. El algoritmo trust-region utiliza FiniteDifferenceType solo cuando CheckGradients está establecido en true.

Para optimset, el nombre es FinDiffType. Consulte Nombres de opciones actuales y antiguos.

FunValCheck

Compruebe si los valores de la función objetivo son válidos. El ajuste predeterminado, 'off', no realiza una comprobación. El ajuste 'on' muestra un error cuando la función objetivo devuelve un valor complex, Inf o NaN.

MaxFunctionEvaluations

Número máximo de evaluaciones de función permitidas, un entero positivo. El valor predeterminado es 100*numberOfVariables. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxFunEvals. Consulte Nombres de opciones actuales y antiguos.

MaxIterations

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es 400. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxIter. Consulte Nombres de opciones actuales y antiguos.

OptimalityTolerance

Tolerancia de terminación en la optimalidad de primer orden (un escalar positivo). La opción predeterminada es 1e-6. Consulte Medida de optimalidad de primer orden.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

OutputFcn

Especifique una o varias funciones definidas por el usuario a las que una función de optimización llame en cada iteración. Pase un identificador de función o un arreglo de celdas de identificadores de función. La opción predeterminada es ninguno ([]). Consulte Sintaxis de función de salida y función de gráfica.

PlotFcn

Representa varias medidas de progreso mientras el algoritmo se ejecuta; seleccione una de las gráficas predefinidas o escriba la suya propia. Pase un nombre de función de gráfica integrada, un identificador de función o un arreglo de celdas de nombres de función de gráfica integrada o identificadores de función. Para funciones de gráfica personalizadas, pase identificadores de función. La opción predeterminada es ninguno ([]):

  • 'optimplotx' representa el punto actual.

  • 'optimplotfunccount' representa el recuento de la función.

  • 'optimplotfval' representa el valor de la función.

  • 'optimplotstepsize' representa el tamaño de paso.

  • 'optimplotfirstorderopt' representa la medida de optimalidad de primer orden.

Las funciones de gráfica personalizadas utilizan la misma sintaxis que las funciones de salida. Consulte Funciones de salida para Optimization Toolbox y Sintaxis de función de salida y función de gráfica.

Para optimset, el nombre es PlotFcns. Consulte Nombres de opciones actuales y antiguos.

SpecifyObjectiveGradient

Gradiente para la función objetivo definida por el usuario. Consulte la descripción de fun para ver cómo definir el gradiente en fun. Establezca la opción true para hacer que fminunc utilice un gradiente definido por el usuario de la función objetivo. La opción predeterminada false hace que fminunc estime los gradientes utilizando diferencias finitas. Debe proporcionar el gradiente y establecer SpecifyObjectiveGradient en true para utilizar el algoritmo trust-region. Esta opción no es necesaria para el algoritmo quasi-Newton.

Para optimset, el nombre es GradObj y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

StepTolerance

Tolerancia de terminación en x, un escalar positivo. El valor predeterminado es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolX. Consulte Nombres de opciones actuales y antiguos.

TypicalX

Valores x típicos. El número de elementos en TypicalX es igual al número de elementos en x0, el punto de inicio. El valor predeterminado es ones(numberofvariables,1). fminunc utiliza TypicalX para escalar diferencias finitas para la estimación de gradientes.

El algoritmo trust-region utiliza TypicalX solo para la opción CheckGradients.

Algoritmo trust-region
FunctionTolerance

Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

HessianFcn

Si se ha establecido en [] (predeterminada), fminunc aproxima la matriz hessiana utilizando diferencias finitas.

Si se ha establecido en 'objective', fminunc utiliza una matriz hessiana definida por el usuario para la función objetivo. La matriz hessiana es la tercera salida de la función objetivo (consulte fun).

Para optimset, el nombre es HessFcn. Consulte Nombres de opciones actuales y antiguos.

HessianMultiplyFcn

Función de multiplicación de matriz hessiana, especificada como un identificador de función. Para problemas estructurados a gran escala, esta función calcula el producto de la matriz hessiana H*Y sin formar H. La función tiene el formato

W = hmfun(Hinfo,Y)

donde Hinfo contiene la matriz utilizada para calcular H*Y.

El primer argumento es el mismo que el tercer argumento devuelto por la función objetivo fun, por ejemplo,

[f,g,Hinfo] = fun(x)

Y es una matriz que tiene el mismo número de filas que dimensiones hay en el problema. La matriz W = H*Y, aunque H no está formada explícitamente. fminunc utiliza Hinfo para calcular el precondicionador. Para obtener información sobre cómo proporcionar valores para cualquier parámetro adicional que hmfun necesite, consulte Pasar parámetros adicionales.

Nota

Para utilizar la opción HessianMultiplyFcn, HessianFcn debe establecerse en [].

Para ver un ejemplo, consulte Minimization with Dense Structured Hessian, Linear Equalities.

Para optimset, el nombre es HessMult. Consulte Nombres de opciones actuales y antiguos.

HessPattern

Patrón de dispersión de la matriz hessiana para diferenciación finita. Establezca HessPattern(i,j) = 1 cuando puede tener ∂2fun/∂x(i)x(j) ≠ 0. De lo contrario, establezca HessPattern(i,j) = 0.

Utilice HessPattern cuando no sea conveniente calcular la matriz hessiana H en fun, pero puede determinar (por ejemplo, inspeccionándolo) cuándo el componente i-ésimo del gradiente de fun depende de x(j). fminunc puede aproximar H mediante diferencias finitas dispersas (del gradiente) si proporciona la estructura de dispersión de H como el valor para HessPattern. En otras palabras, proporcione la ubicación de los elementos distintos de cero.

Cuando la estructura sea desconocida, no establezca HessPattern. El comportamiento predeterminado es como si HessPattern fuera una matriz densa de unos. Entonces, fminunc calcula una aproximación completa de diferencias finitas en cada iteración. Este cálculo puede ser costoso para problemas grandes, por lo que normalmente es mejor determinar la estructura de dispersión.

MaxPCGIter

Número máximo de iteraciones de gradiente conjugado precondicionado (PCG), un escalar positivo. La opción predeterminada es max(1,floor(numberOfVariables/2)). Para obtener más información, consulte Algoritmo trust-region.

PrecondBandWidth

Ancho de banda superior del precondicionador para PCG, un entero no negativo. De forma predeterminada, fminunc utiliza precondicionamiento diagonal (ancho de banda superior de 0). Para algunos problemas, aumentar el ancho de banda reduce el número de iteraciones PCG. Estableciendo PrecondBandWidth en Inf se utiliza una factorización directa (Cholesky) en lugar de los gradientes conjugados (CG). La factorización directa es más costosa computacionalmente que CG, pero produce un paso de mejor calidad hacia la solución.

SubproblemAlgorithm

Determina cómo se calcula el paso de iteración. La opción predeterminada, 'cg', realiza un paso más rápido, pero menos preciso que 'factorization'. Consulte Algoritmo trust-region de fminunc.

TolPCG

Tolerancia de terminación en la iteración PCG, un escalar positivo. La opción predeterminada es 0.1.

Algoritmo quasi-newton
HessianApproximation

Especifica cómo fminunc calcula la matriz hessiana. Las opciones son las siguientes:

  • "bfgs" (valor predeterminado)

  • "lbfgs"

  • {"lbfgs",Positive Integer}

La opción "lbfgs" es la misma que {"lbfgs",10}, es decir, que el valor de memoria "lbfgs" predeterminado es 10. Utilice "lbfgs" para problemas con muchas variables. Consulte Resolver problemas no lineales con muchas variables.

Para optimset, el nombre de la opción es HessUpdate y los valores son "bfgs", "lbfgs", {"lbfgs",Positive Integer}, "dfp" y "steepdesc". Consulte Nombres de opciones actuales y antiguos.

Nota

Por lo general, los valores "dfp" y "steepdesc" no funcionan bien. Están disponibles para fines educativos; consulte Minimización de la función banana.

ObjectiveLimit

Una tolerancia (criterio de detención) que es un escalar. Si el valor de la función objetivo en una iteración es menor que o igual a ObjectiveLimit, las iteraciones se detienen porque, supuestamente, el problema está desacotado. El valor predeterminado es -1e20.

UseParallel

Cuando true, fminunc estima gradientes en paralelo. Deshabilite la opción estableciéndola en el valor predeterminado, false. trust-region requiere un gradiente en el objetivo, por lo que UseParallel no es aplicable. Consulte Computación paralela.

Ejemplo: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)

Estructura de problema, especificada como una estructura con los siguientes campos:

Nombre de campoEntrada

objective

Función objetivo

x0

Punto inicial para x

solver

'fminunc'

options

Opciones creadas con optimoptions

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real o un arreglo real. El tamaño de x es el mismo que el tamaño de x0. Habitualmente, x es una solución local al problema cuando exitflag es positivo. Para obtener información sobre la calidad de la solución, consulte Cuando el solver tiene éxito.

Valor de la función objetivo en la solución, devuelto como un número real. Por lo general, fval = fun(x).

Razón por la que fminunc se ha detenido, devuelta como un entero.

1

La magnitud del gradiente es menor que la tolerancia OptimalityTolerance.

2

El cambio en x ha sido menor que la tolerancia StepTolerance.

3

El cambio en el valor de la función objetivo ha sido menor que la tolerancia FunctionTolerance.

5

La reducción prevista en la función objetivo ha sido menor que la tolerancia FunctionTolerance.

0

El número de iteraciones ha sobrepasado MaxIterations o el número de evaluaciones de función ha sobrepasado MaxFunctionEvaluations.

-1

El algoritmo ha sido terminado por la función de salida.

-3

La función objetivo en la iteración actual ha descendido por debajo de ObjectiveLimit.

Información sobre el proceso de optimización, devuelta como estructura con campos:

iterations

Número de iteraciones realizadas

funcCount

Número de evaluaciones de función

firstorderopt

Medida de optimalidad de primer orden

algorithm

Algoritmo de optimización utilizado

cgiterations

Número total de iteraciones PCG (solo algoritmo 'trust-region')

lssteplength

Tamaño del paso de búsqueda de recta relativo a la dirección de búsqueda (solo algoritmo 'quasi-newton')

stepsize

Desplazamiento final en x

message

Mensaje de salida

Gradiente en la solución, devuelto como un vector real. grad indica el gradiente de fun en el punto x(:).

Matriz hessiana aproximada, devuelta como una matriz real. Para saber cuál es el significado de hessian, consulte Salida de matriz hessiana.

Si la opción HessianApproximation es "lbfgs" o {"lbfgs" n}, la matriz hessian devuelta es [].

Tipos de datos: double

Algoritmos

contraer todo

Algoritmo quasi-Newton

De forma predeterminada, el algoritmo quasi-newton utiliza el método quasi-Newton BFGS con un procedimiento de búsqueda de recta cúbica. El método quasi-Newton utiliza la fórmula BFGS ([1],[5],[8] y [9]) para actualizar la aproximación de la matriz Hessiana. También puede especificar el algoritmo BFGS de memoria baja ("lbfgs") como la opción HessianApproximation. Aunque no se recomienda, puede especificar la fórmula DFP ([4], [6] y [7]), que aproxima la matriz hessiana inversa estableciendo la opción en 'dfp'. Puede especificar un método de descenso más pronunciado estableciendo la opción en 'steepdesc', aunque este ajuste suele ser ineficiente. Consulte Algoritmo quasi-newton de fminunc.

Algoritmo trust-region

El algoritmo trust-region necesita que proporcione el gradiente en fun y que establezca SpecifyObjectiveGradient en true utilizando optimoptions. Este algoritmo es un método de región de confianza de subespacio y se basa en el método de Newton de reflejo de punto interior descrito en [2] y [3]. Cada iteración implica la solución aproximada de un sistema lineal amplio utilizando el método de gradientes conjugados precondicionados (PCG). Consulte Algoritmo trust-region de fminunc, Métodos trust-region para la minimización no lineal y Método del gradiente conjugado precondicionado.

Funcionalidad alternativa

App

La tarea Optimize de Live Editor proporciona una interfaz visual para fminunc.

Referencias

[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.

[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.

[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.

[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.

[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.

[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.

[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo