fminunc
Encontrar el mínimo de una función multivariable no restringida
Sintaxis
Descripción
Solver de programación no lineal.
Encuentra el mínimo de un problema especificado por
donde f(x) es una función que devuelve un escalar.
x es un vector o una matriz; consulte Argumentos de matriz.
comienza en el punto x
= fminunc(fun
,x0
)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.
minimiza x
= fminunc(fun
,x0
,options
)fun
con las opciones de optimización especificadas en options
. Utilice optimoptions
para configurar estas opciones.
Ejemplos
Minimizar un polinomio
Minimice la función .
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
Proporcionar gradiente
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,
que tiene el gradiente
.
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
Usar la estructura de problema
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,
,
que tiene el gradiente
.
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
Obtener un valor óptimo de la función objetivo
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
.
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
Examinar el proceso de resolución
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
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.
Utilizar la aproximación de la matriz hessiana "lbfgs"
para problemas grandes
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
fun
— Función que desea minimizar
identificador de función | nombre de función
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
x0
— Punto inicial
vector real | arreglo real
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
options
— Opciones de optimización
salida de optimoptions
| estructura como la que devuelve optimset
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 | |
| Escoja el algoritmo de El algoritmo |
CheckGradients | Compare las derivadas proporcionadas por el usuario (gradiente de objetivo) con las derivadas de diferencias finitas. Las opciones son Para La opción |
Diagnóstico | Muestre información de diagnóstico sobre la función que se desea minimizar o resolver. Las opciones son |
DiffMaxChange | Cambio máximo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es |
DiffMinChange | Cambio mínimo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es |
Display | Nivel de visualización (consulte Visualización iterativa):
|
FiniteDifferenceStepSize | Factor de tamaño de paso de escalar o vector para diferencias finitas. Cuando establece
sign′(x) = sign(x) excepto sign′(0) = 1 . Las diferencias finitas centrales son
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 Para |
FiniteDifferenceType | Las diferencias finitas, utilizadas para estimar gradientes, son o bien Para |
FunValCheck | Compruebe si los valores de la función objetivo son válidos. El ajuste predeterminado, |
MaxFunctionEvaluations | Número máximo de evaluaciones de función permitidas, un entero positivo. El valor predeterminado es Para |
MaxIterations | Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es Para |
OptimalityTolerance | Tolerancia de terminación en la optimalidad de primer orden (un escalar positivo). La opción predeterminada es Para |
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 ( |
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 (
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 |
SpecifyObjectiveGradient | Gradiente para la función objetivo definida por el usuario. Consulte la descripción de Para |
StepTolerance | Tolerancia de terminación en Para |
TypicalX | Valores El algoritmo |
Algoritmo trust-region | |
FunctionTolerance | Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es Para |
HessianFcn | Si se ha establecido en Si se ha establecido en Para |
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 W = hmfun(Hinfo,Y) donde El primer argumento es el mismo que el tercer argumento devuelto por la función objetivo [f,g,Hinfo] = fun(x)
Nota Para utilizar la opción Para ver un ejemplo, consulte Minimization with Dense Structured Hessian, Linear Equalities. Para |
HessPattern | Patrón de dispersión de la matriz hessiana para diferenciación finita. Establezca Utilice Cuando la estructura sea desconocida, no establezca |
MaxPCGIter | Número máximo de iteraciones de gradiente conjugado precondicionado (PCG), un escalar positivo. La opción predeterminada es |
PrecondBandWidth | Ancho de banda superior del precondicionador para PCG, un entero no negativo. De forma predeterminada, |
SubproblemAlgorithm | Determina cómo se calcula el paso de iteración. La opción predeterminada, |
TolPCG | Tolerancia de terminación en la iteración PCG, un escalar positivo. La opción predeterminada es |
Algoritmo quasi-newton | |
HessianApproximation | Especifica cómo
La opción Para Nota Por lo general, los valores |
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 |
UseParallel | Cuando |
Ejemplo: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
problem
— Estructura de problema
estructura
Estructura de problema, especificada como una estructura con los siguientes campos:
Nombre de campo | Entrada |
---|---|
| Función objetivo |
| Punto inicial para x |
| 'fminunc' |
| Opciones creadas con optimoptions |
Tipos de datos: struct
Argumentos de salida
x
— Solución
vector real | arreglo real
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.
fval
— Valor de la función objetivo en la solución
número real
Valor de la función objetivo en la solución, devuelto como un número real. Por lo general, fval
= fun(x)
.
exitflag
— Razón por la que fminunc
se ha detenido
valor entero
Razón por la que fminunc
se ha detenido, devuelta como un entero.
| La magnitud del gradiente es menor que la tolerancia |
| El cambio en |
| El cambio en el valor de la función objetivo ha sido menor que la tolerancia |
| La reducción prevista en la función objetivo ha sido menor que la tolerancia |
| El número de iteraciones ha sobrepasado |
| El algoritmo ha sido terminado por la función de salida. |
| La función objetivo en la iteración actual ha descendido por debajo de |
output
— Información sobre el proceso de optimización
estructura
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 |
lssteplength | Tamaño del paso de búsqueda de recta relativo a la dirección de búsqueda (solo algoritmo |
stepsize | Desplazamiento final en |
message | Mensaje de salida |
grad
— Gradiente en la solución
vector real
Gradiente en la solución, devuelto como un vector real. grad
indica el gradiente de fun
en el punto x(:)
.
hessian
— Matriz hessiana aproximada
matriz real
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
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
Soporte paralelo automático
Acelere código mediante la ejecución automática de cálculo paralelo mediante Parallel Computing Toolbox™.
Para ejecutar en paralelo, establezca la opción 'UseParallel'
en true
.
options = optimoptions('
solvername
','UseParallel',true)
Para obtener más información, consulte Usar la computación paralela en Optimization Toolbox.
Historial de versiones
Introducido antes de R2006aR2023b: La opción CheckGradients
se eliminará
La opción CheckGradients
se eliminará en una versión futura. Para comprobar las primeras derivadas de funciones objetivo o funciones de restricción no lineales, utilice la función checkGradients
.
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)