Estoy optimizando los parámetros de un algoritmo para minimizar su tiempo de ejecución. Sustituyendo algunas variables para limpiar la presentación, básicamente necesito resolver xlog2x−c=0 pero he olvidado cómo resolver una ecuación de esta forma. ¿Cómo puedo hacerlo?
Respuestas
¿Demasiados anuncios?Se puede utilizar Lambert's W -función para resolver esto. Pero tenga en cuenta que para 0<c≤4e−2 la solución no es única:
Para completar, las posibles soluciones son: x=exp[2W0(±√c2)], exp[2W−1(√c2)]0<c≤4e−2x=exp[2W0(√c2)]4e−2<c Dónde W0 y W−1 son las dos ramas del W como se describe en el enlace de la wikipedia. No sé qué software utilizas, pero no es necesario recurrir a la búsqueda de raíces numéricas: el W -se implementa en matemáticas , matlab y C++ .
EDITAR
Ya que has preguntado por la asintótica, añadiré que para grandes c tenemos x(c)=exp[2W0(√c2)]=O(clog2c) . En realidad, el siguiente límite se mantiene exactamente: lim Obtuve este resultado jugando con mathematica, y no me molesté en demostrarlo.
Tenga en cuenta, sin embargo, que se necesita un muy grande c para alcanzar este límite. Doy aquí el gráfico de esta relación en función de c :
No estoy seguro de si se puede hacer esto analíticamente, pero se podría hacer bastante rápido numéricamente y eso parece que debería ser suficiente. Sólo tienes que escribir x \log^2 x - c = 0 como x = \exp\left( (c/x)^{1/2} \right ) y luego encontrar numéricamente un punto fijo. Esto funcionará si c es positivo y si tu conjetura inicial es positiva, de lo contrario podrías tener problemas.
Un cálculo rápido muestra los siguientes valores para 20 iteraciones con un valor inicial de x=10 y c=1 :
{10, 1.37194, 2.34844, 1.92042, 2.05774, 2.00795, 2.02527, 2.01916,
2.02131, 2.02055, 2.02082, 2.02072, 2.02076, 2.02074, 2.02075,
2.02075, 2.02075, 2.02075, 2.02075, 2.02075, 2.02075}.
Sin embargo, este método puede ser bastante inestable para ciertas elecciones de c.
Como has mencionado, probablemente podrías intentar aproximar con una expansión de Taylor. El método de Newton utiliza una serie de taylor de segundo orden para encontrar las raíces. Pero, supongo que te gustaría alguna manera de encontrar la x apropiada más directamente o más automáticamente. Para aproximar con una serie de Taylor tendrías que elegir un punto alrededor del cual expandir. Si eliges expandir alrededor de x=b al segundo orden, entonces obtendrías la aproximación x \log ^2(x)-c \approx \left(b \log ^2(b)-c\right)+(x-b) \left(\log ^2(b)+2 \log (b)\right)+\frac{(x-b)^2 (\log (b)+1)}{b}+O\left((x-b)^3\right) . A continuación, se podría resolver para x, dado c: x = \frac{2 b-b \log ^2(b) \pm\sqrt{b} \sqrt{4 c \log (b)+b \log ^4(b)+4 c}}{2 (\log (b)+1)}
Una expansión de Taylor de mayor grado complicaría bastante este paso de resolución y habría que lidiar con más raíces.
Sin embargo, creo que el problema aquí es que no sabrías por dónde expandirte. Y expandir alrededor de un punto en particular y utilizarlo para todos los valores de c sería problemático porque la aproximación puede ser bastante mala cuanto más lejos te encuentres del punto de expansión. No estoy muy seguro de qué hacer. Pero, ¡suerte!