Main Content

fminsearch

Encontrar el mínimo de una función multivariable no restringida utilizando el método sin derivadas

Descripción

Solver de programación no lineal. Busca el mínimo de un problema que especifica

minxf(x)

f(x) es una función que devuelve un escalar y x es un vector o una matriz; consulte Argumentos de matriz.

ejemplo

x = fminsearch(fun,x0) comienza en el punto x0 e intenta encontrar un mínimo local x de la función descrita en fun.

ejemplo

x = fminsearch(fun,x0,options) minimiza con las opciones de optimización que se especifican en la estructura options. Utilice optimset para configurar estas opciones.

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

ejemplo

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

[x,fval,exitflag] = fminsearch(___) devuelve adicionalmente un valor exitflag que describe la condición de salida.

ejemplo

[x,fval,exitflag,output] = fminsearch(___), devuelve adicionalmente una estructura output con información sobre el proceso de optimización.

Ejemplos

contraer todo

Minimice la función de Rosenbrock, un problema de optimización de conocida dificultad para muchos algoritmos:

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

La función se minimiza en el punto x = [1,1] con el valor mínimo 0.

Establezca el punto de inicio en x0 = [-1.2,1] y minimice la función de Rosenbrock utilizando fminsearch.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
x = 1×2

    1.0000    1.0000

Establezca opciones para monitorizar el proceso a medida que fminsearch intenta localizar un mínimo.

Establezca opciones para representar la función objetivo en cada iteración.

options = optimset('PlotFcns',@optimplotfval);

Establezca la función objetivo en la función de Rosenbrock,

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

La función se minimiza en el punto x = [1,1] con el valor mínimo 0.

Establezca el punto de inicio en x0 = [-1.2,1] y minimice la función de Rosenbrock utilizando fminsearch.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

Figure Optimization Plot Function contains an axes object. The axes object with title Current Function Value: 8.17766e-10, xlabel Iteration, ylabel Function value contains an object of type scatter.

x = 1×2

    1.0000    1.0000

Minimice una función objetivo cuyos valores vienen dados por la ejecución de un archivo. Un archivo de función debe aceptar un vector real x y devolver un escalar real que es el valor de la función objetivo.

Copie el siguiente código e inclúyalo como un archivo llamado objectivefcn1.m en la ruta de MATLAB®.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

Empiece en x0 = [0.25,-0.25] y busque un mínimo de objectivefcn.

x0 = [0.25,-0.25];
x = fminsearch(@objectivefcn1,x0)
x =

   -0.1696   -0.5086

En ocasiones, la función objetivo tiene parámetros adicionales. Esos parámetros no son variables para optimizar, sino que son valores fijos durante la optimización. Por ejemplo, suponga que tiene un parámetro a en la función de tipo Rosenbrock

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

Esta función tiene un valor mínimo de 0 en x1=a, x2=a2. Si, por ejemplo, a=3, puede incluir el parámetro en la función objetivo creando una función anónima.

Cree la función objetivo con sus parámetros adicionales como argumentos adicionales.

f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;

Coloque el parámetro en el área de trabajo de MATLAB®.

a = 3;

Cree una función anónima de x sola que incluya el valor del área de trabajo del parámetro.

fun = @(x)f(x,a);

Resuelva el problema empezando en x0 = [-1,1.9].

x0 = [-1,1.9];
x = fminsearch(fun,x0)
x = 1×2

    3.0000    9.0000

Para obtener más información sobre utilizar parámetros adicionales en la función objetivo, consulte Parametrizar funciones.

Encuentre tanto la ubicación como el valor de un mínimo de una función objetivo utilizando fminsearch.

Escriba una función objetivo anónima para un problema de tres variables.

x0 = [1,2,3];
fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));

Encuentre el mínimo de fun empezando en x0. Encuentre también el valor del mínimo.

[x,fval] = fminsearch(fun,x0)
x = 1×3

    1.5359    2.5645    3.5932

fval = -5.9565e+04

Inspeccione los resultados de una optimización, tanto mientras se está ejecutando como después de que termine.

Establezca opciones para proporcionar una visualización iterativa, que proporciona información sobre la optimización mientras se ejecuta el solver. Asimismo, establezca una función de gráfica para mostrar el valor de la función objetivo mientras se ejecuta el solver.

options = optimset('Display','iter','PlotFcns',@optimplotfval);

Establezca una función objetivo y un punto de inicio.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

Incluya el código para objectivefcn1 como un archivo en la ruta de MATLAB®.

x0 = [0.25,-0.25];
fun = @objectivefcn1;

Obtenga todas las salidas del solver. Utilice estas salidas para inspeccionar los resultados después de que finalice el solver.

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count         f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 


x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

El valor de exitflag es 1, es decir, que es probable que fminsearch haya convergido en un mínimo local.

La estructura output muestra el número de iteraciones. La visualización iterativa y la gráfica también muestran esta información. La estructura output también muestra el número de evaluaciones de función, mostrado por la visualización iterativa pero no por la función de gráfica seleccionada.

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

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

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

x = fminsearch(@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 = fminsearch(@(x)norm(x)^2,x0);

Ejemplo: fun = @(x)-x*exp(-3*x)

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 una estructura como la que devuelve optimset. Puede utilizar optimset para establecer o cambiar los valores de estos campos en la estructura de las opciones. Consulte Referencia de opciones de optimización para ver información detallada.

Display

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

  • 'notify' (predeterminado) solo muestra salidas si la función no converge.

  • 'final' solo muestra la salida final.

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

  • 'iter' muestra la salida en cada iteración.

FunValCheck

Compruebe si los valores de la función objetivo son válidos. 'on' muestra un error cuando la función objetivo devuelve un valor que es complex o NaN. La opción predeterminada 'off' no muestra ningún error.

MaxFunEvals

Número máximo de evaluaciones de función permitidas, un entero positivo. La opción predeterminada es 200*numberOfVariables. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

MaxIter

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

OutputFcn

Especifica una o varias funciones definidas por el usuario a las que una función de optimización llama en cada iteración, ya sea como un identificador de función o como 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.

PlotFcns

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, un identificador de función o un arreglo de celdas de nombres o 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.

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.

TolFun

Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es 1e-4. Consulte Tolerancias y criterios de detención. A diferencia de otros solvers, fminsearch se detiene cuando satisface tanto TolFun como TolX.

TolX

Tolerancia de terminación en x, un escalar positivo. El valor predeterminado es 1e-4. Consulte Tolerancias y criterios de detención. A diferencia de otros solvers, fminsearch se detiene cuando satisface tanto TolFun como TolX.

Ejemplo: options = optimset('Display','iter')

Tipos de datos: struct

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

Nombre de campoEntrada

objective

Función objetivo

x0

Punto inicial para x

solver

'fminsearch'

options

Estructura de las opciones como la que devuelve optimset

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 fminsearch se ha detenido, devuelta como un entero.

1

La función ha convergido a una solución x.

0

El número de iteraciones ha sobrepasado options.MaxIter o el número de evaluaciones de función ha sobrepasado options.MaxFunEvals.

-1

La función de salida ha terminado el algoritmo.

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

iterations

Número de iteraciones

funcCount

Número de evaluaciones de función

algorithm

'Nelder-Mead simplex direct search'

message

Mensaje de salida

Sugerencias

  • fminsearch solo minimiza sobre los números reales, es decir, que x solo debe constar de números reales y f (x) solo debe devolver números reales. Cuando x tiene valores complejos, divida x en partes reales e imaginarias.

  • Utilice fminsearch para resolver problemas no diferenciables o problemas con discontinuidades, sobre todo si no se produce discontinuidad cerca de la solución.

  • Por lo general, fminsearch es menos eficiente que fminunc, sobre todo para problemas de una dimensión mayor que dos. Sin embargo, cuando el problema es discontinuo, fminsearch puede ser más robusto que fminunc.

  • fminsearch no es el solver preferido para problemas que son sumas de cuadrados, es decir, con el formato

    minxf(x)22=minx(f1(x)2+f2(x)2+...+fn(x)2)

    En su lugar, utilice la función lsqnonlin, que se ha optimizado para problemas con este formato.

Algoritmos

fminsearch utiliza el método simplex de búsqueda de Lagarias et al. [1]. Este es un método de búsqueda directa que no utiliza gradientes numéricos ni analíticos, como en fminunc. Este algoritmo se describe en detalle en Algoritmo fminsearch. No se garantiza que el algoritmo converja en un mínimo local.

Funcionalidad alternativa

App

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

Referencias

[1] Lagarias, J. C., J. A. Reeds, M. H. Wright, and P. E. Wright. “Convergence Properties of the Nelder-Mead Simplex Method in Low Dimensions.” SIAM Journal of Optimization. Vol. 9, Number 1, 1998, pp. 112–147.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a