4 votos

Optimización de funciones trigonométricas y no lineales

Primero, por favor, tened en cuenta que soy programador, no matemático, y que tengo una buena formación matemática.

He utilizado la optimización en Java para ajustar algunas observaciones a una función trigonométrica, he probado los siguientes optimizadores: BOBYQA, CMA-ES, Powell, y Simplex para optimizar la función como función escalar, y también Levenberg-Marquardt y Gauss-Newton para optimizarla como función vectorial, obtuve buenos resultados para

$z = a.\sin(x)+b.\cos(y)$

pero para una relación no lineal como: $y = \cos(a.x)$ o $z = \sin(a.x) + \cos(b.x)$ los resultados son muy insatisfactorios y tengo que elegir una estimación inicial muy cercana a los valores correctos de $a$ y $b$ Y ciertamente esto no es práctico, ejemplo:

$y=6.4\cdot e^{5.5x}$

da

$(6.39 \text{ and } 5.5)$ si la conjetura inicial se establece en $(7,7)$

y da

$(2.07 \text{ and }5.5)$ para la estimación inicial de $(8,8)$

y, ciertamente, esta es una suposición muy mala. Así que supongo que necesito cualquiera de las dos opciones:

  1. Encontrar un método para seleccionar una muy buena suposición inicial
  2. Encontrar un método para mejorar el optimizador de manera que pueda obtener un buen resultado aunque la conjetura inicial no sea buena.

Gracias

4voto

user3648062 Puntos 8

Finalmente lo conseguí, el problema era causado por caer en un óptimo local, a continuación una breve comparación entre los resultados que obtuve de los algoritmos mencionados:

  • Powell y BOBYQA dan resultados maravillosos con alta precisión pero baja precisión Esto significa que tiene que proporcionar un muy buena suposición inicial y límites bastante estrechos
  • Simplex es ligeramente mejor en no caer en un óptimo local Creo que esto se debe a que utiliza Nelder-Mead Simplex o Simplex multidireccional para actualizar sus conjeturas, tanto permite proporcionar pasos largos para buscar lejos de la conjetura inicial y así evitar el óptimo local También requiere sin límites Los estima bien
  • CMA-ES es mucho más exacto pero ligeramente menos preciso, permite especificar límites y longitud del paso pero, extrañamente, da resultados diferentes para distintas ejecuciones y algunas de ellas pueden caer en un óptimo local.

Finalmente hice el siguiente algoritmo para obtener resultados fiables, exactos y precisos:

  1. Utilice CMA-ES para obtener una estimación aproximada con gran precisión
  2. Calcular el error cuadrático medio
  3. Si el error cuadrático medio es mayor que un umbral, repita CMA-ES de nuevo
  4. Con un error aceptable, utilice Simplex para obtener un resultado más preciso
  5. También utilicé un Optimizador multivariante con CMA-ES y simplex para ayudar a evitar los óptimos locales

Esto dio resultados aceptables

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X