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.
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.
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.Fval
f(x)
Resnorm
La disminución indica el progreso.
Examine la infracción de restricción () para asegurarse de que disminuye hacia.Max constraint
0
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:
Establecer y/o valores más grandes que los predeterminados.MaxIterations
MaxFunctionEvaluations
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.
Inicie el solucionador desde su último punto calculado.
Si el solucionador no avanza, pruebe las otras sugerencias enumeradas.
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.StepTolerance
OptimalityTolerance
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.optimoptions
Establecer y cambiar opciones
La opción (o las opciones) pueden afectar al progreso del solucionador.FiniteDifferenceStepSize
DiffMaxChange
DiffMinChange
Estas opciones controlan el tamaño del paso en la diferencia finita para la estimación derivada.
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
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:f
fminunc
'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
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.x
x
x
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.CheckGradients
Comprobació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
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:
.fmincon
interior-point
Escriba el hessian como una función separada. Para ver un ejemplo, vea.Algoritmo de punto interior de fmincon con hessian analítico
.fmincon
trust-region-reflective
Dar el hessian como la tercera salida de la función objetiva. Para ver un ejemplo, vea.Minimización con hessian estructurado denso, Equalidades lineales
.fminunc
trust-region
Dar el hessian como la tercera salida de la función objetiva. Para ver un ejemplo, vea.Minimización con gradiente y hessian
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
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, consultequadprog
Converges 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 |
Intente encontrar un punto que satisfaga los límites y las restricciones lineales resolviendo un problema de programación lineal.
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
Resuelva el problema de programación lineal para ver si hay un punto factible:
xnew = linprog(f,A,b,Aeq,beq,lb,ub);
Si hay un punto factible, utilice como punto inicial y vuelva a ejecutar el problema original.xnew
xnew
Si no hay un punto factible, su problema no está bien formulado. Compruebe las definiciones de los límites y las restricciones 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.xnew
x0 = 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.xnew
x0 = 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.
Cambie la función de restricción no lineal para que devuelva Δ, donde Δ es un número positivo.c
c-
Este cambio hace que las restricciones no lineales sean más fáciles de satisfacer.
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.
Si encuentras un punto factible,
Reducir Δ
Busque un punto factible para la nueva función de restricción, comenzando en el punto encontrado anteriormente.
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.
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.lb
ub
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'
quadprog
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.linprog
quadprog
Alternativamente, cambie algunas tolerancias tales como o y resuelva el problema otra vez.StepTolerance
ConstraintTolerance
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.optimoptions
ObjectiveLimit
puede fallar en resolver una ecuación por varias razones.fsolve
Aquí hay algunas sugerencias sobre cómo proceder:
Tratar. se basa en un punto inicial.Cambiar el punto inicialfsolve
Al darle diferentes puntos iniciales, aumenta las posibilidades de éxito.
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.fsolve
fsolve
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).
Cambiar las tolerancias, especialmente y.OptimalityTolerance
StepTolerance
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
Compruebe la definición del problema. Algunos problemas no tienen una solución real, como.x^2 + 1 = 0