Proyecto Billar (Método 2). Introducción: Este método comparte con su antecesor, método 1, la suposición de que las bolas de una partida de snooker (o cualquier modalidad del billar, no nos hemos centrado en una determinada) se comportan como discos sin rozamiento rígidos y que no pueden rotar sobre sí mismos; lo cual ya es mucho pedir. Sin embargo, este método ya no necesita suponer que las bolas/discos estén separados, es más, necesita que el triángulo inicial sea compacto. Esta nueva suposición, más cercana a la realidad que la anterior, permite a método 2 creer que sólo va a haber una colisión múltiple, en el que la transferencia de momento va a viajar de unas bolas a otras hasta que el triángulo finalemente se rompa. Resolución del problema: El camino por el que se atacan los problemas del sólido rígido, y en concreto de las colisiones bidimensionales, es siempre el mismo, la energía y el momento se deben conservar. Partiendo de esta suposición, hay que tener en cuenta que en este problema hay 16 cuerpos que colisionan y se transmiten momento por parejas, es decir, hay 120 (16 sobre 2) transmisiones de momento… Esto ya no resulta tan sencillo, pero hay un matiz importante. Una vez la bola blanca ha llegado al triángulo, es decir, una vez el conjunto de bolas ya es compacto, la dirección de su velocidad no importa a la hora de calcular la dirección de la velocidad de la bola adyacente, lo que realmente importa es la posición relativa de esas bolas. Lo que intento decir es que la proporcionalidad de las velocidades finales es determinada por las posiciones de las bolas (veánse ejemplos 1,2,3,4 en “method1”). La consecuencia del párrafo anterior, que nos va a permitir solucionar este problema, es que podemos dividirlo en dos fase. La primera será resolver el problema de minimización descrito a continuación: 𝑀𝑖𝑛𝑖𝑚𝑖𝑧𝑎𝑟 ∑ Δ𝑝𝑖𝑗 𝑖𝑗 𝑆𝑢𝑗𝑒𝑡𝑜 𝑎: 〈𝑟𝑖𝑗 , Δ𝑝𝑖𝑗 〉 ≤ 0 Donde Δ𝑝𝑖𝑗 es la diferencia entre el momento final relativo y el inicial de la pareja compuesta por las bolas “i” y “j”. 𝑟𝑖𝑗 es el vector posición relativa de la misma pareja. Nótese que es equivalente hablar de la pareja “i j” que de la “j i”. Las restricciones descritas en la segunda fila se deben a dos razones. La primera es que si el producto escalar de esos dos vectores fuese mayor que cero, significaría que el ángulo entre ellos se encuentra entre π y –π, es decir, las bolas estaría intercambiándose momento sólo para permanecer pegadas entre ellas, y eso no tiene sentido físico alguno. La segunda es que con estas restricciones y el objetivo de minimización nuestro problema se ha convertido en una optimización lineal. También es importante notar que, mientras la función objetivo usa el módulo como variable, las restricciones usan al vector. Esto no causa ningún problema debido a que ambos vectores del producto escalar son colineales (la transmisión del momento siempre es perpendicular a las superficies de lsa bolas, y la posición relativa también), por lo tanto el producto escalar se convierte en producto usual entre escalares. −Δ𝑝𝑖𝑗 × 𝑟𝑖𝑗 , ahora un La segunda fase del problema es, simplemente, encontrar un factor de corrección que, multiplicando a la solución del problema de minimización permita la conservación del momento (de ahí que fuese importante que la proporcionalidad de las velocidades finales fuese determinada por las posiciones de las bolas). Implementación del programa: Los pasos que sigue método 2 para resolver el problema que nos ocupa de acuerdo con el apartado anterior son: 1. Usando la función “timeColission”, explicada en el primer método, se halla el tiempo en el que se alcanzará la colisión, es decir, se hallará el tiempo en el que la bola blanca alcanza el triángulo. 2. La simulación avanza hasta ese momento y se calculan las posiciones de las bolas entonces (sólo habrá cambiado la posición de la bola blanca, que es la que se mueve). 3. Usando el método simplex (detallado en su apartado propio) se resuelve el problema de minimización. Nótese que el algoritmo hallará los intercambios de momento, no los momentos finales, pero se pueden obtener estos de la ecuación: 𝑝𝑖 = 𝑝𝑖0 − ∑ ∆𝑝𝑖𝑗 𝑟̂𝑖𝑗 𝑗 4. Usando la conservación de la energía se halla el factor de corrección que nos dará la solución real: 𝑝02 𝑝𝑖2 = 𝛼∑ 2𝑚 2𝑚 ⇒ 𝛼= 𝑖 𝑝02 ∑𝑖 𝑝𝑖2 El Algoritmo Símplex: Desarrollado en 1947 por el matemático George B. Dantzig este algoritmo permite hallar de forma eficiente la solución óptima de una problema de programación lineal, esto es, un problema en el cual se pretende hallar el valor de unas variables que minimicen o maximicen una función lineal a la vez que estas variables cumplen ciertas restricciones también lineales. Recordemos ahora el problema de programación lineal que nos ocupaba: 𝑀𝑖𝑛𝑖𝑚𝑖𝑧𝑎𝑟 ∑ Δ𝑝𝑖𝑗 𝑖𝑗 𝑆𝑢𝑗𝑒𝑡𝑜 𝑎: 〈𝑟𝑖𝑗 , Δ𝑝𝑖𝑗 〉 ≤ 0 Bien, para la programación lineal esto se escribe: 𝑀𝑖𝑛𝑖𝑚𝑖𝑧𝑎𝑟 𝐜∙𝐱 𝑆𝑢𝑗𝑒𝑡𝑜 𝑎: 𝐀𝐱 = 𝐛 𝐱 ≥𝟎 Donde “c” es un vector de 120 componentes idénticamete 1, “x” es el vector que contiene las transmisiones de momento (en módulo) y “A” es una matriz con “-rij” en su diagonal (para que se puedan obtener todas las restricciones de nuestro problema). Nótese que además se pide la no negatividad de las soluciones, cosa que nosotros dábamos por supuesta pues en nuestro problema las variables son módulos. Si bien una demostración rigurosa de como funciona el algoritmo símplex no va a darse, hay una serie de conceptos y teoremas que el lector debe conocer antes continuar: 1. Si cada restricción se convierte en una ecuación, ésta define un hiperplano (es decir, un conjunto de una dimensión menos que el original, en este caso ℝ120 ). La desigualdad define una región del espacio llamada hiperplano afín (el hiperplano y “lo que hay a un lado de él”). 2. El conjunto de los hiperplanos afines definidos por A forman un poliedro o politopo. 3. Si el politopo es acotado la solución óptima se alcanza en uno de sus vértices. Dada la última afirmación, cabría esperar que para obtener la solución óptima solo habría que demostrar que el politopo objetivo es acotado y evaluar la función en todos los vértices o extremales y mirar donde es mínima. Sin embargo esto es muy poco eficiente, por lo que el algortimo símplex lo que hace es evaluar una solución básica inicial (toda solución básica inicial se corresponde con un vértice, pero no al revés) y encontrar otra “adyacente” que optimice mejor la función (intuitivamente se podría decir que viaja de un vértice a otro hasta que no puede mejorar la función). Para esto sigue los siguietes pasos: 1. En primer lugar, minimizar una función “z” es lo mismo que maximizar y = -z, y como las iteraciones me han parecido más sencillas así, hago este pequeño cambio. 2. Se crea un matriz en la que colocan “A”, a partir de la siguiente columna, la identidad (que representa los coeficientes de unas variable virtuales que convierten las inecuaciones en ecuaciones, son las variables de exceso). Después, en otra nueva columna se coloca “b” y depués una columna de ceros. En una nueva fila por debajo se coloca “c” (con el coeficiente 1 de la función objetivo en la última columna, la de ceros por encima). 3. Se busca un elemento menor que cero en la última fila. Si no se encuentra se ha terminado la optimización. 4. Se busca un elemento mayor que cero en la columna del elemento del paso anterior. Si no se encuentra no hay solución acotada. 5. Se pivota la matriz entorno al elemento del paso 4. 6. Se repite el proceso hasta que el paso 3 no sea posible. Los datos finales no son precisamente cómodos de extraer de la matriz. Si el problema tiene m variables, la matriz final tiene unos y ceros en la región comprendida por las primeras m columnas y filas. Bien, si en la primera fila hay un uno en la i-ésima columna, a la i-ésima variable le correspone el valor que se encuentra en esa fila, pero en la penúltima columna (donde se introdujo “b” antes de las iteraciones). NOTA AL PROFESOR: el programa “method2” falla en algún momento pues dice que la solución no está acotada o simplemente se bloquea en un bucle infinito (esto puede deberse a que el algoritmo se mueve de una solución básica a otra (degenerada) que representa el mismo vétrice). Sin embargo, otro problema más grave es que, dado que las restricciones incumben a una sola variable a la vez, estas definen hiperplanos sencillos (básicamente el plano p_ij = 0). Se puede ver claramente que el único vértice es el (0,0,0,…) y que ahí se minimiza perfectamente la función, hace falta alguna otra restricción que no hemos conseguido hallar.