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.

Cuando el Solver falla

Demasiadas iteraciones o evaluaciones de funciones

El solucionador se detuvo porque alcanzó un límite en el número de iteraciones o evaluaciones de funciones antes de minimizar el objetivo a la tolerancia solicitada. Para continuar, pruebe uno o más de los siguientes.

1. habilite la visualización iterativa
2. tolerancias de relax
3. Inicie el Solver desde diferentes puntos
4. Compruebe las definiciones de función de objetivo y restricción
5. centrar y escalar su problema
6. proporcionar gradiente o jacobiano
7. proveer a hessian

1. habilite la visualización iterativa

Establezca la opción en.Display'iter' Esta configuración muestra los resultados de las iteraciones del solucionador.

Para habilitar la visualización iterativa:

  • Con la aplicación de optimización, elija serLevel of display iterative O iterative with detailed message.

  • En la línea de comando, escribaMATLAB®

    options = optimoptions('solvername','Display','iter');

    Llame al solucionador mediante la estructura.options

Para ver un ejemplo de visualización iterativa, consulte.Interprete el resultado

Qué buscar en la pantalla iterativa

  • Ver si la función objetiva (o o) disminuye.Fvalf(x)Resnorm La disminución indica el progreso.

  • Examine la infracción de restricción () para asegurarse de que disminuye hacia.Max constraint0 La disminución indica el progreso.

  • Vea si la optimalidad del primer orden disminuye hacia.0 La disminución indica el progreso.

  • Vea si las disminuciones a un valor pequeño.Trust-region radius Esta disminución indica que el objetivo podría no ser suave.

¿Qué hacer

  • Si el solucionador parecía progresar:

    1. Establecer y/o valores más grandes que los predeterminados.MaxIterationsMaxFunctionEvaluations Puede ver los valores predeterminados en la aplicación optimización o en la tabla opciones de las páginas de referencia de la función del solucionador.

    2. Inicie el solucionador desde su último punto calculado.

  • Si el solucionador no avanza, pruebe las otras sugerencias enumeradas.

2. tolerancias de relax

Si o, por ejemplo, son demasiado pequeños, es posible que el solucionador no reconozca Cuándo ha alcanzado un mínimo; puede hacer iteraciones ftiles indefinidamente.StepToleranceOptimalityTolerance

Para cambiar las tolerancias mediante la aplicación de optimización, use la lista en la parte superior del panel.Stopping criteriaOptions

Para cambiar las tolerancias en la línea de comando, utilice como se describe en.optimoptionsEstablecer y cambiar opciones

La opción (o las opciones) pueden afectar al progreso del solucionador.FiniteDifferenceStepSizeDiffMaxChangeDiffMinChange Estas opciones controlan el tamaño del paso en la diferencia finita para la estimación derivada.

3. Inicie el Solver desde diferentes puntos

Ver.Cambie el punto inicial

4. Compruebe las definiciones de función de objetivo y restricción

Por ejemplo, compruebe que las funciones de restricción objetiva y no lineal devuelven los valores correctos en algunos puntos. Ver.Compruebe las funciones de objetivo y restricción Compruebe que un punto no factible no provoque un error en sus funciones; Ver.Las iteraciones pueden violar restricciones

5. centrar y escalar su problema

Los solucionadores funcionan de forma más fiable cuando cada coordenada tiene el mismo efecto en las funciones objetivo y restricción. Multiplique sus direcciones de coordenadas con los escalares apropiados para igualar el efecto de cada coordenada. Agregue los valores apropiados a ciertas coordenadas para igualar su tamaño.

Ejemplo: centrado y escalado.  Considere minimizar:1e6*x(1)^2 + 1e-6*x(2)^2

f = @(x) 10^6*x(1)^2 + 10^-6*x(2)^2;

Minimice el uso del algoritmo:ffminunc'quasi-newton'

opts = optimoptions('fminunc','Display','none','Algorithm','quasi-newton'); x = fminunc(f,[0.5;0.5],opts)  x =          0     0.5000

El resultado es incorrecto; mala escala interfirió con la obtención de una buena solución.

Escale el problema. Me

D = diag([1e-3,1e3]); fr = @(y) f(D*y); y = fminunc(fr, [0.5;0.5], opts)  y =      0      0 % the correct answer

Del mismo modo, el centrado deficiente puede interferir con una solución.

fc = @(z)fr([z(1)-1e6;z(2)+1e6]); % poor centering z = fminunc(fc,[.5 .5],opts)  z =   1.0e+005 *    10.0000  -10.0000 % looks good, but...  z - [1e6 -1e6] % checking how close z is to 1e6  ans =     -0.0071    0.0078 % reveals a distance   fcc = @(w)fc([w(1)+1e6;w(2)-1e6]); % centered  w = fminunc(fcc,[.5 .5],opts)  w =      0     0 % the correct answer

6. proporcionar gradiente o jacobiano

Si no proporciona gradientes o Jacobianos, los solucionadores estiman gradientes y Jacobianos por diferencias finitas. Por lo tanto, proporcionar estos derivados puede ahorrar tiempo de cálculo y puede conducir a una mayor precisión.

Para problemas restringidos, proporcionar un degradado tiene otra ventaja. Un solucionador puede alcanzar un punto tal que sea factible, pero las diferencias finitas alrededor siempre conducen a un punto inviable.xxx En este caso, un solucionador puede fallar o detenerse prematuramente. Proporcionar un degradado permite que un solucionador proceda.

Proporcionar gradientes o Jacobianos en los archivos para su función objetiva y funciones de restricción no lineal. Para obtener información detallada sobre la sintaxis, vea y.Escribir funciones de objetivo escalarEscritura de funciones de objetivo vectorial y matrizRestricciones no lineales

Para comprobar que la función de degradado o jacobiana es correcta, utilice la opción, como se describe en.CheckGradientsComprobación de la validez de gradientes o Jacobianos

Si tiene una licencia, puede calcular gradientes y Hessios mediante programación.Symbolic Math Toolbox™ Para ver un ejemplo, vea.Calcula gradientes y hessianosSymbolic Math Toolbox

Para ver ejemplos con degradados y Jacobianos, vea,,, y.Minimización con gradiente y hessianRestricciones no lineales con degradadosCalcula gradientes y hessianosSymbolic Math ToolboxEcuaciones no lineales con analítica jacobianaEcuaciones no lineales con

7. proveer a hessian

Los solvers a menudo funcionan de forma más fiable y con menos iteraciones cuando se suministra un hessian.

Los siguientes solucionadores y algoritmos aceptan los hessianos:

Si tiene una licencia, puede calcular gradientes y Hessios mediante programación.Symbolic Math Toolbox Para ver un ejemplo, vea.Calcula gradientes y hessianosSymbolic Math Toolbox

Convergido a un punto inviable

Normalmente, obtiene este resultado porque el solucionador no pudo encontrar un punto que satisfaciera todas las restricciones dentro de la tolerancia.ConstraintTolerance Sin embargo, el solucionador puede haber localizado o comenzado en un punto factible, y convergido a un punto inviable. Si el solucionador perdió viabilidad, vea.Solver Lost factibilidad Si devuelve este resultado, consultequadprogConverges en un punto inviablequadprog

Para continuar cuando el solucionador no encontró ningún punto factible, pruebe uno o más de los siguientes.

1. Compruebe las restricciones lineales
2. comprobar restricciones no lineales

1. Compruebe las restricciones lineales

Intente encontrar un punto que satisfaga los límites y las restricciones lineales resolviendo un problema de programación lineal.

  1. Definir un problema de programación lineal con una función objetiva que siempre es cero:

    f = zeros(size(x0)); % assumes x0 is the initial point
  2. Resuelva el problema de programación lineal para ver si hay un punto factible:

    xnew = linprog(f,A,b,Aeq,beq,lb,ub);
  3. Si hay un punto factible, utilice como punto inicial y vuelva a ejecutar el problema original.xnewxnew

  4. Si no hay un punto factible, su problema no está bien formulado. Compruebe las definiciones de los límites y las restricciones lineales.

2. comprobar restricciones no lineales

Después de asegurarse de que los límites y las restricciones lineales son factibles (contienen un punto que satisface todas las restricciones), compruebe las restricciones no lineales.

  • Establezca la función objetiva en cero:

    @(x)0

    Ejecuta tu optimización con todas las restricciones y con el objetivo cero. Si encuentras un punto factible, establece y vuelve a ejecutar el problema original.xnewx0 = xnew

  • Si no encuentra un punto factible utilizando una función de objetivo cero, utilice la función de objetivo cero con varios puntos iniciales.

    • Si encuentras un punto factible, establece y vuelve a ejecutar el problema original.xnewx0 = xnew

    • Si usted no encuentra un punto factible, intente relajar las restricciones, discutidas después.

Pruebe a relajar sus restricciones de desigualdad no lineales y luego apretarlas.

  1. Cambie la función de restricción no lineal para que devuelva Δ, donde Δ es un número positivo.cc- Este cambio hace que las restricciones no lineales sean más fáciles de satisfacer.

  2. Busque un punto factible para la nueva función de restricción, utilizando la función objetiva original o la función de objetivo cero.

    1. Si encuentras un punto factible,

      1. Reducir Δ

      2. Busque un punto factible para la nueva función de restricción, comenzando en el punto encontrado anteriormente.

    2. Si usted no encuentra un punto factible, intente aumentar Δ y mirando de nuevo.

Si no encuentra ningún punto factible, su problema podría ser realmente inviable, lo que significa que no existe ninguna solución. Vuelva a comprobar todas las definiciones de restricción.

Solver Lost factibilidad

Si el solucionador se inició en un punto factible, pero convergió en un punto inviable, pruebe las siguientes técnicas.

  • Pruebe con un algoritmo diferente. Los algoritmos y son generalmente los más robustos, así que pruebe uno o ambos primero.fmincon'sqp''interior-point'

  • Apriete los límites. Dé los vectores más altos y más bajos que pueda.lbub Esto puede ayudar al solucionador a mantener la viabilidad. Los algoritmos y obedecen los límites en cada iteración, por lo que los límites ajustados ayudan a lo largo de la optimización.fmincon'sqp''interior-point'

Converges en un punto inviablequadprog

Por lo general, recibe este mensaje porque las restricciones lineales son incoherentes, o son casi singulares. Para comprobar si existe un punto factible, cree un problema de programación lineal con las mismas restricciones y con un vector de función objetivo cero.f Resuelve usando el algoritmo:linprog'dual-simplex'

options = optimoptions('linprog','Algorithm','dual-simplex'); x = linprog(f,A,b,Aeq,beq,lb,ub,options)

Si no encuentra ningún punto factible, entonces su problema es realmente inviable.linprog

Si encuentra un punto factible, pruebe con un algoritmo diferente.linprogquadprog Alternativamente, cambie algunas tolerancias tales como o y resuelva el problema otra vez.StepToleranceConstraintTolerance

Problema ilimitado

El solucionador alcanzó un punto cuya función objetiva era menor que la tolerancia del límite objetivo.

  • Su problema podría ser realmente ilimitado. En otras palabras, hay una secuencia de puntos Xi Con

    LIMfXi) = – ∞.

    y tal que todos los Xi satisfacen las limitaciones del problema.

  • Compruebe que el problema esté formulado correctamente. Los solucionadores intentan minimizar las funciones objetivas; Si quieres un máximo, cambia tu función objetiva a su negativa. Para ver un ejemplo, vea.Maximizando un objetivo

  • Pruebe a escalar o centrar su problema. Ver.Centrar y escalar su problema

  • Relaja la tolerancia del límite objetivo usando para reducir el valor de la tolerancia.optimoptionsObjectiveLimit

fsolve no pudo resolver la ecuación

puede fallar en resolver una ecuación por varias razones.fsolve Aquí hay algunas sugerencias sobre cómo proceder:

  1. Tratar. se basa en un punto inicial.Cambiar el punto inicialfsolve Al darle diferentes puntos iniciales, aumenta las posibilidades de éxito.

  2. Compruebe la definición de la ecuación para asegurarse de que es suave. puede no converger para las ecuaciones con degradados discontinuos, como el valor absoluto. puede fallar al converger para las funciones con discontinuidades.fsolvefsolve

  3. Compruebe que la ecuación es "cuadrada", lo que significa dimensiones iguales para la entrada y la salida (tiene el mismo número de desconocidos que los valores de la ecuación).

  4. Cambiar las tolerancias, especialmente y.OptimalityToleranceStepTolerance Si intenta obtener una alta precisión estableciendo tolerancias en valores muy pequeños, puede fallar al converger.fsolve Si establece tolerancias que son demasiado altas, puede fallar para resolver una ecuación con precisión.fsolve

  5. Compruebe la definición del problema. Algunos problemas no tienen una solución real, como.x^2 + 1 = 0