Main Content

fminsearch

Encontrar el mínimo de una función multivariable sin restricciones con un método sin derivadas

Descripción

Solver de programación no lineal. Busca el mínimo de un problema especificado por

minxf(x)

f(x) es una función que devuelve un escalar y x es un vector o una 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 especificadas en la estructura options. Utilice optimset para establecer estas opciones.

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

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(___) también devuelve un valor exitflag que describe la condición de salida.

ejemplo

[x,fval,exitflag,output] = fminsearch(___) también devuelve 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 notorio por su 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 valor mínimo 0.

Establezca el punto de inicio en x0 = [-1.2,1] y minimice la función de Rosenbrock con 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 las opciones para monitorizar el proceso cuando fminsearch intenta localizar un mínimo.

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

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

Establezca la función objetivo para 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 valor mínimo 0.

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

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

x = 1×2

    1.0000    1.0000

Minimice una función objetivo cuyos valores se obtengan ejecutando un archivo. Un archivo de función debe aceptar un vector real x y devolver un escalar real que sea 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

Comience 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 extra. Estos parámetros no son variables que optimizar, sino valores fijos durante la optimización. Por ejemplo, suponga que tiene un parámetro a en la función 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 extra como argumentos extra.

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

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

a = 3;

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

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

Resuelva el problema comenzando 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 acerca de cómo usar parámetros extra en la función objetivo, consulte Parametrizar funciones.

Encuentre la ubicación y el valor de un mínimo de una función objetivo con 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 comenzando 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 mientras se ejecuta y después de que haya finalizado.

Establezca opciones para proporcionar una visualización iterativa, lo que proporciona información sobre la optimización mientras se ejecuta el solver. Establezca también una función de representación 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 el solver finalice.

[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, fminsearch probablemente convergió en un mínimo local.

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

Argumentos de entrada

contraer todo

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

fminsearch pasa x a la función objetivo en la forma del 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 vector real o arreglo real. Los solvers utilizan el número de elementos 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 optimset devuelve. Puede utilizar optimset para establecer o cambiar los valores de estos campos en la estructura de opciones. Para obtener información detallada, consulte Configurar opciones de optimización.

Display

Nivel de visualización (consulte Optimization Solver Iterative Display):

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

  • 'final' muestra solo la salida final.

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

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

FunValCheck

Comprobar 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. El valor predeterminado 'off' no muestra error.

MaxFunEvals

Número máximo de evaluaciones de función permitidas, un entero positivo. El valor predeterminado es 200*numberOfVariables. Consulte Tolerancias y criterios de parada.

MaxIter

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es 200*numberOfVariables. Consulte Tolerancias y criterios de parada.

OutputFcn

Especificar una o más funciones definidas por el usuario a las que una función de optimización llama en cada iteración, ya sea como identificador de función o como arreglo de celdas de identificadores de función. El valor predeterminado es ninguno []. Consulte Optimization Solver Output Functions.

PlotFcns

Representar varias medidas de progreso mientras se ejecuta el algoritmo. Seleccione desde las gráficas predefinidas o cree la suya. Pase un nombre o identificador de función o un arreglo de celdas de nombres o identificadores de función. El valor predeterminado es ninguno ([]):

  • @optimplotx representa el punto actual.

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

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

Para obtener más información sobre cómo escribir una función de representación gráfica personalizada, consulte Optimization Solver Plot Functions.

TolFun

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

TolX

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

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

Tipos de datos: struct

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

Nombre de campoEntrada

objective

Función objetivo

x0

Punto inicial para x

solver

'fminsearch'

options

Estructura de opciones como la devuelta por optimset

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como vector real o arreglo real. El tamaño de x es igual que el tamaño de x0. Habitualmente, x es una solución local al problema cuando exitflag es positivo.

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

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

1

La función convergió en una solución x.

0

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

-1

El algoritmo fue terminado por la función de salida.

Información sobre el proceso de optimización, devuelto 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 los números reales, es decir, el vector o arreglo x debe constar únicamente 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, en particular si no se produce una discontinuidad cerca de la solución.

Algoritmos

fminsearch utiliza el método de búsqueda simplex de Lagarias et al. [1]. Se trata de un método de búsqueda directa que no usa gradientes numéricos o analíticos como en fminunc (Optimization Toolbox). El 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