«Figuras envueltas» en LyX

No, no estoy hablando de una comida y por lo tanto no haré el chiste mitológico de que los «niños envueltos es la comida favorita de Saturno». De lo que hablaré en este artículo es de un documento con figuras rodeadas de texto, como lo que se muestra en la siguiente captura de pantalla:

Un ejemplo de «figura envuelta»

Un ejemplo de «figura envuelta»

Este es uno de los (pocos) puntos donde Writer funciona mejor que LaTeX. No, no estoy exagerando: en Writer es simplemente hacer un clic derecho, seleccionar el ajuste deseado y marcar la opción «seguir flujo de texto» para que las figuras envueltas funcionen sin problemas (por supuesto, hablo de esto en cierto libro…), mientras que en LaTeX los resultados pueden ser… imprevisibles.

Por ejemplo, consideren la siguiente captura de pantalla

Una «figura envuelta» con los parámetros por defecto de LaTeX

Una «figura envuelta» con los parámetros por defecto de LaTeX

Como pueden ver, no solo la figura está «perforando» el margen inferior de la primer página: ¡en la siguiente ha quedado un hueco!

Hoy veremos cómo enfrentar estos problemas en un documento LyX.

El paquete a utilizar se llama wrapfig. LyX tiene soporte completo para este paquete, por lo que para utilizarlo solo tenemos que ir a Insertar → Flotante → Figura envuelta (también podemos insertar tablas cuadros envueltos desde allí). El problema está en que con los valores por defecto, la figura caerá directamente en el texto que le sigue y el paquete no verificará si existe lugar en la página para poner la figura allí, llevándonos a situaciones como la mostrada en la anterior captura de pantalla. Es decir, si colocamos la figura envuelta entre dos párrafos, esta será rodeada por el segundo mientras que si la colocamos entre dos palabras dentro de un párrafo será rodeada por las líneas de texto a partir de aquella en la que se encuentran esas palabras.

Esto implica la necesidad de mucho cuidado y control manual de la posición de las figuras envueltas, por lo que surge la pregunta de si es posible hacer que estas «floten» como las figuras normales. Y además, ¿cómo elegimos de qué lado de la página aparecerá la figura o la fracción del ancho de página que esta ocupará?

En LyX, haciendo clic derecho sobre la etiqueta del «envoltorio»…

Configurando la «figura envuelta»

Accediendo a la configuración de la «figura envuelta»

… accedemos al menú de configuración:

Eligiendo las opciones de configuración

Eligiendo las opciones de configuración

Las opciones de «ubicación» son Exterior (a la derecha en páginas impares y a la izquierda en las pares de los documentos «a dos caras»), Interior (lo contrario), siempre Izquierda y siempre Derecha. La opción señalada en la captura, Permitir flotación, es la que corrige los problemas que mostramos en la segunda captura de pantalla de este artículo.

¿Listo? Bueno, no del todo:

  • Las figuran envueltas no pueden utilizarse en combinación con listas numeradas o viñetas
  • Si la figura envuelta está en el último párrafo y el texto no es suficiente para «envolverla», dependiendo de si se ha activado la flotación o no podemos tener una figura que se desplaza luego del texto y que no respeta el lado elegido (con flotación) o una figura «envuelta a mitad» (sin flotación)
  • Si se tienen dos figuras envueltas cercanas, el resultado puede ser malo (hagan la prueba…)
  • Si bien la numeración se «integra» con la numeración de las figuras normales, podría darse que no aparezcan «en orden», dándonos, por ejemplo, la figura normal de número 5 en el principio de la página y la envuelta de número 4 más abajo

En fin, que es un paquete cuyos resultados pueden traer algunos dolores de cabeza, requiriendo mucho control manual del documento antes de poder considerarlo «listo». ¡Están advertidos!

Deja un comentario

Cálculo diferencial 6: una solución numérica para el paracaidista

Última parte del recorrido hacia las ecuaciones diferenciales. Para un índice de los artículos sobre este tema, puede consultarse este enlace.


Aquí estamos llegando al final de esta extraña y para nada rigurosa introducción al cálculo diferencial. Y como lo prometido es deuda, veremos de hacer un cálculo numérico que nos de la velocidad en función del tiempo para la caída libre con una atmósfera que limita la velocidad. Veremos aquí solamente la primer parte de la caída, antes de la apertura del paracaídas, la que inicia con velocidad cero y llega a la velocidad límite de la cual hablamos en la primer entrada: la segunda parte de la caída la dejo como ejercicio para el lector.

[Ya que estamos, Alan Eustace ha superado el record de Baumgartner... ;) ]

Para esta tarea usaremos resultados vistos en la entrada anterior. ¿Ya repasaron? Bien, allí vamos.

Volvamos a escribir nuestra ecuación diferencial, olvidándonos por un momento de que la aceleración es la derivada de la velocidad (lo recordaremos pronto):

\displaystyle M g - k v^2 = M a

y despejemos de allí la aceleración

\displaystyle a = g -\frac{k}{M} v^2

La aproximación que haremos comienza con separar la caída en pequeños intervalos de tiempo \Delta t, todos iguales entre sí. Nada particular, pensará el lector atento, después de todo el cálculo diferencial (y el integral) no es otra cosa que tomar pequeños intervalos y luego hacer un límite para esos intervalos tendiendo a longitud cero. Y efectivamente no hay nada de particular en esta separación: el paso importante está en aproximar la aceleración en cada uno de esos pequeños intervalos por el valor que esta tendría al principio del mismo. Es decir, en lugar de una función que varía en forma continua diremos que la aceleración va tomando valores constantes en cada uno de los intervalos.

Esto claramente es erróneo, ya sabemos que al aumentar la velocidad de caída aumenta la fuerza de fricción con el aire y por lo tanto disminuye la aceleración. Esto hace que los valores de aceleración y velocidad que calculemos con nuestra aproximación sean siempre mayores que los reales, pero si tomamos intervalos de tiempo suficientemente pequeños (ya veremos qué significa «suficientemente») nos irá bastante bien.

Entonces el procedimiento es el siguiente. En el primer intervalo, donde la velocidad es aún pequeña, podemos despreciar el término de fricción para obtener así una la caída con una aceleración igual a la de la gravedad. Luego, utilizamos las fórmulas de cinemática que encontramos en la entrada anterior para calcular velocidad y posición al final de ese primer intervalo. Y ahora damos el «salto»: usamos el valor de la velocidad al final del primer intervalo para calcular la aceleración que utilizaremos en el segundo, aceleración con la cual calcularemos una nueva velocidad que será utilizada para calcular la aceleración del tercer intervalo y…

Es decir, en el intervalo 1 tenemos

a_1 \approx g;

v_1 \approx g \Delta t;

x_1 \approx \frac{1}{2} g \Delta t ^2.

Para el segundo intervalo, tomaremos por lo tanto los valores finales del primer intervalo como valores iniciales de este segundo, calculando una nueva aceleración:

\displaystyle a_2 \approx g -\frac{k}{M} v_1 ^2;

v_2 \approx v_1 + a_2 \Delta t;

x_2 \approx x_1 + \frac{1}{2} a_2 \Delta t ^2.

Y en general, para el paso n-ésimo

\displaystyle a_n \approx g -\frac{k}{M} v_{n-1} ^2;

v_n \approx v_{n-1} + a_n \Delta t;

x_n \approx x_{n-1} + \frac{1}{2} a_n \Delta t ^2.

Es decir, tenemos una fórmula recursiva que nos permite calcular una aproximación para un momento determinado en función del valor del momento anterior.

A este punto es importante remarcar qué estamos haciendo realmente en este algoritmo: en cada uno de los pequeños intervalos temporales en los que estamos dividiendo el problema, la aproximación realizada no es otra cosa que reemplazar la ecuación diferencial original por otra más simple, donde la aceleración es una constante. Resuelta esta ecuación simple en uno de los intervalos, usamos los resultados como valores iniciales del intervalo siguiente.

Antes de mostrar el guión para Octave, veamos un poco lo que significa realizar la aproximación de este modo y cuáles son sus «riesgos». Por ejemplo, si tomamos \Delta t = 2 s , obtendremos lo siguiente:

caer-2s

Como referencia, la línea roja muestra la solución exacta de la ecuación diferencial, la cual está dada por la función

\displaystyle v(t) = \sqrt{\frac{M g}{k}}\cdot \tanh{\left(\sqrt{\frac{k g}{M}}\cdot t \right)}

Como podemos ver, tomando dos segundos la velocidad dada por nuestro simple modelo numérico crece mucho más rápido de lo que debería, llegando a «pasarse de largo» de la velocidad límite: en lugar de aproximarse lentamente a su valor final nuestra solución numérica comienza a oscilar violentamente.

Claramente, dos segundos no es un intervalo temporal «suficientemente pequeño»…

Si en lugar de dos segundos tomamos \Delta t = 1 s , la situación mejora notablemente… aunque no del todo:

caer-1s

Seguimos teniendo un crecimiento exagerado al principio, pero ya casi no oscila y llega al valor correcto rápidamente. En cambio, con \Delta t = 0,1 s

caer-01s

la solución numérica es ya casi indistinguible de la «real», por lo que finalmente podemos decir que una décima de segundo es un intervalo «suficientemente pequeño».

Como era de esperarse, tomar un valor para \Delta t más pequeño nos da mejores resultados. El problema, claro está, es que más pequeño es el intervalo mayor será el número de pasos necesarios por lo que se requiere cada vez más poder de cálculo. Ciertamente esto no es un inconveniente para el problema aquí propuesto: en mi procesador i3 tomando \Delta t = 0,0001 s octave no tarda más de quince segundos en realizar los más de 400000 pasos necesarios, pero en problemas más complejos como el cálculo de la órbita de una sonda interplanetaria, o las órbitas halo en torno al punto de Lagrange Tierra-Sol que usan los satélites que controlan la actividad solar, o realizar un pronóstico del tiempo, o calcular las energías disponibles para los electrones en los semiconductores que hacen funcionar nuestras computadoras, o encontrar las estructuras de las moléculas utilizadas en la industria farmacéutica… se requiere el uso de computadoras que difícilmente podrían caber en un escritorio.

Además, si bien en este caso de la caída libre es posible encontrar una solución exacta de la ecuación diferencial en otras situaciones la única posibilidad de obtener un resultado son las aproximaciones numéricas: los problemas que tienen una solución exacta son la excepción, no la regla. Pero lo importante es que para todos estos problemas existe una herramienta matemática que resulta fundamental en el desarrollo de un algoritmo que permita encontrar, aunque más no sea aproximadamente, la solución buscada: el cálculo diferencial.

Pues bien, hasta aquí hemos llegado. Antes de dejarte con el guión de Octave, estimado lector, solo me queda por decir que espero que estas seis entradas hayan sido de tu agrado.


Código a colocar en un archivo de extensión .m para ser llamado desde la línea de comando de Octave. El valor de \Delta t se maneja con el parámetro dt. Todo lo que está a la derecha de un % es un comentario que no será ejecutado.

M = 90; % la masa
g = 9.8; % aceleración de la gravedad
k = 0.29; % el coeficiente del término de rozamiento
h1 = 3000; % altura del salto
h2 = 1000; % altura al abrir el paracaídas
fin1 = h1-h2; % recorrido hecho hasta abrir el paracaídas

dt = 0.1; % intervalo de tiempo en segundos

pos = 0; % valor inicial de posición, velocidad aceleración y tiempo
vel = 0;
acc = g;
tem = 0;

j = 1; % un índice

x(1) = pos; % todo irá en vectores
v(1) = vel;
a(1) = acc;
t(1) = tem;

while pos < fin1 % mientras no llegamos al paracaídas, seguimos con el cálculo
j = j+1;
vel = vel + acc*dt;
v(j) = vel;
acc = g - (k/M)*(v(j-1))^2;
pos = pos + vel*dt + (acc*dt^2)/2;
x(j) = pos;
tem = tem + dt;
t(j) = tem;
end

vcorr = sqrt(M*g/k)*tanh(sqrt(k*g/M)*(t)); % la velocidad correcta
plot(t,v,t,vcorr,'r');xlabel('tiempo (s)');ylabel('velocidad (m/s)')
figure;plot(x,v,x,vcorr,'r');xlabel('posición (m)');ylabel('velocidad (m/s)')

, ,

Deja un comentario

openSUSE: los proyectos Tumbleweed y Factory se fusionan

openSUSEHace un tiempo hablamos del repositorio Factory convirtiéndose en una distribución «rolling» que sirviera también como base de la openSUSE tradicional, simplificando así el proceso de desarrollo de la distribución del camaleón. Otra variante de openSUSE de la que no he hablado por aquí es Tumbleweed, una serie de repositorios que podían utilizarse para convertir a openSUSE en una distribución «semi rolling»: ofreciendo nuevas versiones de casi todos los paquetes, aseguraba el tener una distribución siempre actualizada que al mismo tiempo se mantenía «sincronizada» con la versión de base.

Con Factory dejando de ser un repositorio experimental para convertirse en una distribución «rolling» bien definida, el papel de Tumbleweed dentro de la comunidad de openSUSE se volvió menos cierto. Pues bien, esta incerteza acabará el 4 de noviembre: cuando se libere openSUSE 13.2, los proyectos Factory y Tumbleweed se fusionarán bajo el nombre de este último.

El nombre «Factory» se seguirá utilizando para identificar el proceso de desarrollo de la distribución. En las próximas semanas surgirán seguramente más detalles sobre cómo se implementará este cambio.

,

Deja un comentario

Desenlace

Porque todas las historias tienen un final. Eso sí, antes de continuar aconsejo al lector consultar la tira original que en esta entrada alcanza su triste final:

Homenaje a xkcd

Y ahora sí, el temido desenlace:

tira-finalb

Deja un comentario

Cálculo diferencial 5: integrando ecuaciones diferenciales

Quinta parte del recorrido hacia las ecuaciones diferenciales. Para un índice de los artículos sobre este tema, puede consultarse este enlace.


En la última entrada hablamos de la relación entre derivadas e integrales. Si por ejemplo tenemos una ecuación donde la derivada de una función desconocida es igual a una función que conocemos,

\displaystyle \frac{d}{d\xi}f(\xi) = g(\xi)

tendremos que

\displaystyle f(\xi) -f(\xi_0) = \int \limits _{\xi_0} ^{\xi} g(\xi)d\xi

Por ejemplo, en una entrada anterior dijimos que la derivada de una recta me da una constante (su pendiente), por lo que si miramos todo del otro lado,

\displaystyle \frac{d}{dt}v(t) = A

con A una constante, implica que

 v(t) -v(t_0) = A(t -t_0)

También vimos que

\displaystyle \frac{d}{dt}\left[ A \left( t -t_0 \right)^2 \right]_{t_1} = 2 A \left( t_1 -t_0 \right)

Por lo tanto, no es difícil ver que

\displaystyle \int\limits _{t_0} ^{t} A(t -t_0) dt = \frac{1}{2}A(t -t_0)^2

Volvamos entonces a nuestra famosa ecuación diferencial

\displaystyle M g - k v^2 = M \frac{d}{dt}v

y hagamos algo que, si bien arriesgado para nuestro paracaidista, nos simplificará enormemente los cálculos: eliminemos la fricción con el aire haciendo k = 0. Es decir, una verdadera caída libre en ausencia de atmósfera. En esta situación, luego de simplificar el factor de la masa obtenemos

\displaystyle \frac{d}{dt}v = g

donde g es una constante (en este caso, la aceleración de la gravedad).

Con lo visto anteriormente podemos resolver esta ecuación simplemente integrando, lo que nos dará

\displaystyle v(t) -v(t_0) = \int\limits _{t_0} ^t g dt = g(t -t_0)

Recordando ahora que la velocidad es la derivada de la posición respecto del tiempo, podemos obtener

\displaystyle x(t) -x(t_0) = \int\limits _{t_0} ^t \left[ v(t_0) + g(t -t_0) \right]dt

Ahora bien, una integral es básicamente una suma de cosas (seguida de un límite), por lo que la integral de la suma de dos funciones será la suma de sus integrales. A partir de esto, de considerar que v(t_0) es simplemente un número constante (el valor de la velocidad en un único instante bien definido) y de lo que vimos durante esta entrada llegamos a

\displaystyle x(t) -x(t_0) = v(t_0) (t -t_0) + \frac{1}{2} g (t -t_0)^2

que no es otra cosa que la «ley horaria» del movimiento rectilíneo uniformemente acelerado. Hagan un esfuerzo de memoria, que seguro lo vieron en la escuela: ahora, ya saben de dónde sale.

Desafortunadamente, la ecuación diferencial que ha servido de hilo conductor en estas entradas es mucho más compleja. El término con la velocidad al cuadrado y la presencia de una constante hacen que sea particularmente difícil de resolver, por lo que el explicar el resultado exacto sería demasiado para estas modestas entradas (la solución general para la velocidad implica una función hiperbólica con otras funciones hiperbólicas —y otras cosas— en su argumento, mientras que integrar eso para obtener la posición agrega un logaritmo…). Pero a no desesperar, que aún así podremos utilizar lo aprendido para realizar un cálculo iterativo aproximado en Octave.

Pero eso será en la última entrada de la serie.

, ,

1 comentario

Programando el pasado en WordPress

Hace unos meses cometí un error: al escribir sobre cómo fue instalar Linux en mi nueva portátil decidí crear una página en lugar de un artículo. Esa página era una subpágina de «entradas destacadas», por lo que cada vez que pasaba el cursor por el menú de páginas me daba un submenú que resultaba bastante incómodo y no del todo claro. Quizás el problema fuera del tema usado en este sitio, pero la verdad es que luego de un tiempo me di cuenta de que sería mejor convertir esa página en un artículo, por lo que inmediatamente surgieron dos preguntas:

Pregunta 1: ¿existe una herramienta en WordPress para convertir páginas en artículos o viceversa?

Respuesta 1: No.

Pregunta 2: Si no queda otra alternativa que copiar el contenido de la página y pegarlo en un artículo, ¿existe una forma de hacer que el artículo se publique con la fecha anterior a la actual, por ejemplo cuando fue creada la página?

Respuesta 2: Sí.

A la derecha de la zona de edición del artículo tenemos la posibilidad de editar cuándo se publicará la entrada. Generalmente esta opción se usa para programar entradas futuras para que se publiquen automáticamente (de hecho, la mayor parte de las entradas de este sitio son programadas con varios días de anticipación), pero si ponemos allí una fecha anterior a la actual el artículo será publicado inmediatamente con esa fecha.

Programando esta entrada

Programando esta entrada

Y así fue como la página que hablaba de la experiencia de instalar Linux en mi nueva portátil terminó convirtiéndose en un artículo con fecha de publicación de un par de meses antes de cuando realmente presioné el botón «Programar».

Deja un comentario

Controlando la separación silábica en LaTeX/LyX

Cuando en un documento hacemos que el texto esté «justificado» (hacer que ambos márgenes, izquierdo y derecho, formen una línea) nos enfrentamos a un problema: si el texto está en columnas o la fuente tipográfica usada es grande en modo tal de tener pocas palabras por línea, el software que usemos se verá obligado a variar la distancia entre las palabras para ajustarse a los márgenes, lo que dará espacios en blanco de tamaño impredecible que harán incómoda la lectura. Para evitar esto, se recurre a la separación silábica de palabras a final de línea en modo tal que se reduzcan esos espacios… pagando el precio de tener muchas palabras «cortadas».

Comparen las siguientes capturas:

colortexto1 colortexto2

 

 

 

 

 

 

 

 

 

En la imagen de la izquierda la separación entre palabras es uniforme, pero tenemos una palabra quebrada casi en cada línea, lo cual dificulta la lectura. Por otra parte, la imagen de la derecha tiene solo una palabra separada, pero los espacios entre palabras son completamente aleatorios. Ambas situaciones son malas (si bien la segunda es mucho peor…).

En general, LaTeX hace un gran trabajo equilibrando los espacios con la separación silábica, pero solo cuando el texto es «lo suficientemente ancho». ¿Es posible cambiar manualmente el comportamiento de LaTeX? Sí, aunque lo que hay que hacer es más cercano a la «magia negra» que a un método de trabajo…

LaTeX usa un algoritmo complejo para decidir cómo distribuir el texto en las líneas del párrafo. Simplificando un poco el proceso, podríamos decir que calcula un parámetro que mide «qué tan mal» se ve el texto y trata de minimizarlo en dos pasadas. En la primer pasada, calcula qué tan mal se ve el texto sin la separación silábica y si el resultado es aceptable, pues todo listo. Si el resultado de la primer pasada no es aceptable (y suele no serlo), pasa de nuevo permitiendo esta vez la separación silábica al final de la línea.

Lo que dice si un resultado es «aceptable» o no, es un parámetro llamado «tolerancia»: si lo mal-que-se-ve está dentro de lo tolerado, pues pasa.

Y dado que el algoritmo hace dos pasadas, pues tenemos dos parámetros de «tolerancia», uno para la primer pasada y otro para la segunda.

¿Y como controlamos estas tolerancias? En el preámbulo LaTeX (en LyX: Documento → Configuración → Preámbulo LaTeX) se escribe

\pretolerance=<valor>
\tolerance=<valor>

Donde <valor> es un número entero entre 0 y 10000.

Y es en estos valores donde viene la «magia negra»: la imagen de la izquierda usa los valores por defecto de LaTeX mientras que la de la derecha usa 2000 para pretolerance y 3000 para tolerance.

Si para tolerance escribo en cambio 20, obtengo lo siguiente:

colortexto3

Lo cual está más «equilibrado»: tenemos la mitad de separaciones silábicas que en la primer imagen y los espacios, si bien no completamente homogéneos, son un poco más predecibles que en la segunda imagen.

El valor correcto para pretolerance y tolerance dependerá del tamaño de la página, de la fuente tipográfica, de los márgenes, del número de columnas… en fin, que encontrarlos es cosa de prueba y error. Y es que cuanto más «angosto» el texto es, menos estables estos parámetros resultan, todo lo cual viene a querer decir que cuando más los necesitemos más difícil será encontrarlos.

Y sí, la vida es cruel…


Para profundizar:

Unos tipos duros: ¿Menos guiones o más espacios irregulares? Este es el dilema

http://tex.stackexchange.com/questions/19178/whats-the-difference-between-tolerance-and-badness

http://tex.stackexchange.com/questions/31301/how-to-reduce-the-number-of-hyphenation

google, duck duck go o su buscador favorito ;)

3 comentarios

A %d blogueros les gusta esto: