Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

fminsearch

Encuentre el mínimo de la función multivariable sin restricciones usando el método libre de derivativos

Descripción

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

minxf(x)

() es una función que devuelve un escalar, y es un vector o una matriz; Ver.fxxArgumentos de matriz

ejemplo

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

ejemplo

x = fminsearch(fun,x0,options) minimiza con las opciones de optimización especificadas en la estructura.Opciones Se usa para establecer estas opciones.optimset

x = fminsearch(problem) encuentra el mínimo para, donde es una estructura.problemproblem Crear mediante la exportación de un problema desde la aplicación de optimización, como se describe en.problemExportar su trabajo

ejemplo

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

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

ejemplo

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

Ejemplos

contraer todo

Minimizar la función de Rosenbrock, un problema de optimización notoriamente difícil para muchos algoritmos:

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>-</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>-</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>.</mo>
</mrow>
</math>

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

Establecer el punto de inicio y minimizar la función de Rosenbrock utilizando.x0 = [-1.2,1]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

Configure las opciones para supervisar el proceso como intentos de localizar un mínimo.fminsearch

Configure las opciones para trazar la función objetiva en cada iteración.

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

Fije la función objetiva a la función de Rosenbrock,

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>-</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>-</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>.</mo>
</mrow>
</math>

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

Establecer el punto de inicio y minimizar la función de Rosenbrock utilizando.x0 = [-1.2,1]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 objetiva cuyos valores se dan mediante la ejecución de un archivo. Un archivo de función debe aceptar un vector real y devolver un escalar real que es el valor de la función objetiva.x

Copie el código siguiente e incluirlo como un archivo denominado en la ruta de acceso de MATLAB®.objectivefcn1.m

 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  

Comienza y busca un mínimo de.x0 = [0.25,-0.25]objectivefcn

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

A veces la función objetiva tiene parámetros adicionales. Estos parámetros no son variables para optimizar, son valores fijos durante la optimización. Por ejemplo, supongamos que tiene un parámetro en la función de tipo Rosenbrocka

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>a</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>-</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>a</mi>
<mo>-</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>.</mo>
</mrow>
</math>

Esta función tiene un valor mínimo de 0 en

<math display="block">
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<mi>a</mi>
</mrow>
</math>
,
<math display="block">
<mrow>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>=</mo>
<msup>
<mrow>
<mi>a</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
</math>
. Si, por ejemplo,
<math display="block">
<mrow>
<mi>a</mi>
<mo>=</mo>
<mn>3</mn>
</mrow>
</math>
, puede incluir el parámetro en la función objetiva mediante la creación de una función anónima.

Cree la función objetiva 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 espacio de trabajo de MATLAB®.

a = 3;

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

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

Resuelve el problema a partir de.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 el uso de parámetros adicionales en la función objetivo, consulte.Parameterizing Functions

Encuentra tanto la ubicación como el valor de un mínimo de una función objetiva usando.fminsearch

Escribir una función objetiva 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));

Encuentra el mínimo de inicio.funx0 Encuentra el valor del mínimo también.

[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 está en ejecución como después de que finalice.

Configure las opciones para proporcionar una visualización iterativa, que proporciona información sobre la optimización a medida que se ejecuta el solucionador. Además, establezca una función de trazado para mostrar el valor de la función objetiva a medida que se ejecuta el solucionador.

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

Establezca una función objetiva y un punto inicial.

 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 como archivo en la ruta de acceso de MATLAB®.objectivefcn1

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

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

[x,fval,exitflag,output] = fminsearch(fun,x0,options) 
   Iteration   Func-count     min 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 is, lo que significa que probablemente convergió a un mínimo local.exitflag1fminsearch

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

Argumentos de entrada

contraer todo

Función para minimizar, especificada como un identificador de función o un nombre de función. es una función que acepta un vector o array y devuelve un escalar real (la función objetiva evaluada).funxfx

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

x = fminsearch(@myfun,x0)

donde se encuentra una función comomyfunMATLAB®

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

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

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 una matriz real. Solvers utilizan el número de elementos en y el tamaño de para determinar el número y el tamaño de las variables que acepta.x0x0fun

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

Tipos de datos: double

Opciones de optimización, especificadas como una estructura como devoluciones.optimset Puede utilizar para establecer o cambiar los valores de estos campos en la estructura de opciones.optimset Consulte para obtener información detallada.Opciones de optimización referencia

Display

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

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

  • muestra sólo la salida final.'final'

  • o no muestra ninguna salida.'off''none'

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

FunValCheck

Compruebe si los valores de función objetiva son válidos. muestra un error cuando la función objetiva devuelve un valor que es o.'on'complexNaN El valor predeterminado no muestra ningún error.'off'

MaxFunEvals

Número máximo de evaluaciones de funciones permitidas, un entero positivo. El valor predeterminado es.200*numberOfVariables Mira y.Tolerancias y criterios de detenciónIteraciones y recuentos de funciones

MaxIter

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado es.200*numberOfVariables Mira y.Tolerancias y criterios de detenciónIteraciones y recuentos de funciones

OutputFcn

Especifique una o varias funciones definidas por el usuario que una función de optimización llama en cada iteración, ya sea como un identificador de función o como una matriz de celdas de identificadores de función. El valor predeterminado es None ().[] Ver.Sintaxis de función de salida

PlotFcns

Traza varias medidas de progreso mientras se ejecuta el algoritmo. Seleccione entre parcelas predefinidas o escriba las suyas propias. Pasar un identificador de función o una matriz de celdas de identificadores de función. El valor predeterminado es None ():[]

  • traza el punto actual.@optimplotx

  • traza el recuento de funciones.@optimplotfunccount

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

Para obtener información sobre cómo escribir una función de trazado personalizada, consulte.Sintaxis de función de trazado

TolFun

Tolerancia de terminación en el valor de la función, un escalar positivo. El valor predeterminado es.1e-4 Ver.Tolerancias y criterios de detención A diferencia de otros solucionadores, se detiene cuando satisface y.fminsearchbothTolFunTolX

TolX

Tolerancia de terminación activada, un escalar positivo.x El valor predeterminado es.1e-4 Ver.Tolerancias y criterios de detención A diferencia de otros solucionadores, se detiene cuando satisface y.fminsearchbothTolFunTolX

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

Tipos de datos: struct

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

Nombre de campoEntrada

Objetivo

Función objetiva

x0

Punto inicial parax

solver

'fminsearch'

Opciones

Estructura de opciones como devuelta poroptimset

La forma más sencilla de obtener una estructura es exportar el problema desde la aplicación de optimización.problem

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real o una matriz real. El tamaño de es el mismo que el tamaño de.xx0 Normalmente, es una solución local para el problema cuando es positivo.xexitflag Para obtener información sobre la calidad de la solución, consulte.Cuando el Solver se ejecuta correctamente

Valor de la función objetiva en la solución, devuelto como un número real. Generalmente, =.fvalfun(x)

Motivo detenido, devuelto como un entero.fminsearch

1

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

0

Número de iteraciones superada o número de evaluaciones de función superada.options.MaxIteroptions.MaxFunEvals

-1

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

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

iterations

Número de iteraciones

funcCount

Número de evaluaciones de funciones

algorithm

'Nelder-Mead simplex direct search'

message

Mensaje de salida

Sugerencias

  • sólo se minimiza sobre los números reales, es decir, sólo debe consistir en números reales y () sólo debe devolver números reales.fminsearchxfx Cuando tiene valores complejos, se dividen en partes reales e imaginarias.xx

  • Utilícese para resolver problemas o problemas no diferenciables con discontinuidades, especialmente si no se produce ninguna discontinuidad cerca de la solución.fminsearch

  • es generalmente menos eficiente que, especialmente para problemas de dimensión mayores que dos.fminsearchfminunc Sin embargo, cuando el problema es discontinuo, puede ser más robusto que.fminsearchfminunc

  • no es el solucionador preferido para los problemas que son sumas de cuadrados, es decir, de la formafminsearch

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

    En su lugar, utilice la función, que se ha optimizado para los problemas de este formulario.lsqnonlin

Algoritmos

utiliza el método de búsqueda simplex de Lagarias et al. .fminsearch[1] Se trata de un método de búsqueda directa que no utiliza gradientes numéricos o analíticos como en.fminunc El algoritmo se describe detalladamente en.Algoritmofminsearch No se garantiza que el algoritmo converja en un mínimo local.

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

Introducido antes de R2006a