Hola a todos
En este artículo voy a hablar sobre programación avanzada en FORTRAN. Cuando me refiero a programación "avanzada" en FORTRAN quiero remarcar implícitamente que las estructuras sintácticas utilizadas para realizar nuestro programa no van a ser aquellas que permitan ejecutar correctamente el programa, sino aquellas que pueden ofrecer grandes ventajas en cuanto a TIEMPO DE COMPUTACIÓN Y ALMACENAMIENTO EN MEMORIA.
Una estructura de computación avanzada es extremadamente útil cuando se necesita elaborar un programa que por sus características requiere de un esfuerzo computacional muy elevado. Ejemplos clásicos de este tipo de programas pueden ser los programas CFD (donde los solvers utilizados requieren una malla de puntos muy extensa para llevar a cabo la computación de la ecuación a resolver en el dominio estudiado) o programas que manipulen listas o matrices de datos MUY grandes.
Dejando a un lado el caso de que seas un experto programador (en cuyo caso lo que voy a decir en este artículo seguramente ya lo sabes puesto que de facto yo no soy tal), a la hora de computar un programa no siempre conviene diseñar EL MEJOR PROGRAMA, sino aquel programa que te de lo que necesitas en el menor tiempo posible DESDE QUE COMIENZAS A DISEÑARLO HASTA QUE OBTIENES LA RESPUESTA: de nada sirve elaborar un programa extremadamente eficiente que ahorra un 12% tu tiempo de computación si has empleado un esfuerzo en depurarlo y modificarlo al diseñarlo que sobrepasa con creces dicha cantidad de tiempo.
A continuación anotaré una serie de consejos en cuanto al manejo de FORTRAN buscando una estructura avanzada de programación:
1 - Conseguir elaborar tu programa intentando optimizar estos requisitos es una tarea hartamente complicada si no conoces casi a fondo las estructuras sintácticas que permite FORTRAN y las funciones intrínsecas que tiene implementadas. Échale un vistazo a las funciones intrínsecas que tiene implementado el programa y siempre que puedas utilízalas en vez de hacerte unas propias.
2 - Evita el uso de bucles DO siempre que puedas, sustituyéndolas por funciones intrínsecas. Por ejemplo en vez de recorrer una matriz elemento a elemento y realizar una operación específica, utiliza notación matricial que afecta simultáneamente a todos los elementos de la misma y es mucho más rápida.
Ejemplo: A = A +5, donde A es una matriz de tamaño M x N.
3 - Si quieres filtrar ciertos elementos de la matriz que te interesan y que son fácilmente distinguibles del resto (por ejemplo, elementos menores que 0 o que cumplan algún requisito lógico), la declaración WHERE te permite seleccionarlos instantáneamente mucho más rápidamente.
4 - FORTRAN odia los mapeados no lineales de elementos, prefiriendo seleccionar datos de forma lineal. Ejemplo: Si b1 = [1 3 8] y b2 = [2 4 6] son dos vectores con las posiciones de ciertos elementos dentro de otro vector más grande, entonces FORTRAN tarda sensiblemente más en acceder a A(b1) que a A(b2), puesto que el acceso a b2 se puede introducir en notación intrínseca de FORTRAN como A(2:6:2).
5 - Utiliza los punteros. Para los que no saben que es esto (yo lo desconocía hasta hace poco), un puntero es un objeto que no tiene una forma predefinida, esto es, es un objeto que puede tomar una dimensión variable dentro de su clase. Lo que quiero decir es que un puntero es un "alias" del objeto al que apunta, de tal forma que cuando hago referencia al puntero estoy accediendo en memoria física al objeto que se le ha asignado. Ejemplo: si se apunta con un puntero llamado Punt a un array a1=[1 0 25 0 0]
Punt => a1
Entonces si se referencia Punt(3), entonces FORTRAN toma el valor 25. Pero a continuación se puede reasignar Punt a otro vector, b1=[2 3 4 5 6 7 8 9 0]. Ahora, Punt(3) = 4. Como se puede ver, los punteros son extremadamente eficientes cuando se realizan actualizaciones de matrices grandes a partir de datos del paso anterior, ya que estos me permiten en cada paso calcular el nuevo valor de mi matriz a partir de los datos anteriores y asignárselo al puntero (lo que cambio es la dirección en memoria) en vez de borrar la matriz del paso anterior y volver a copiarla de la ya calculada en el paso actual.
6 - Graba en tu fichero de datos sólo los datos que necesites. Parece un consejo estúpido, pero cuando se hacen las cosas por inercia se tienden a cometer fallos de bulto. Por ejemplo, si estoy manipulando una matriz 8000 x 8000, pero mi información realmente está en unos cuantos puntos de la misma, en vez de grabar la matriz entera, copia sólo los elementos que se necesiten y su posición en la matriz (si es relevante).
Eso te evitará generar ficheros extremadamente pesados cuando hablamos de matrices de datos grandes.
7 - Evita la salida de datos por pantalla. Si el ordenador tiene que escribir por pantalla la iteración en la que esta a cada instante y datos de la simulación, es tiempo que esta empleando en ofrecer información que quizá sea irrelevante una vez el programa ya funciona. Reduce la salida por pantalla hasta dejar sólo lo imprescindible.
8 - El uso de variables dinámicas (junto con ALLOCATE y DEALLOCATE) permite gestionar mucho más eficientemente la memoria disponible por el programa, la cual es finita. Esto se hace evidente cuando tienes que gestionar un volumen de datos muy grande. Utiliza este tipo de variables para aquellas variables tipo dummy, las cuales las quieres sólo para recoger una información que luego se guarda en otro sitio, quedando dicha variable inútil.
9 - Procura compactar tu código al máximo. Un código de 500 líneas es infinitamente más sencillo de repasar, corregir y mejorar que uno de 2000 líneas.
10 - Existen un sin fin de tutoriales y webs donde se describen todas las funciones intrínsecas y consejos sobre programación. Es fácil caer en el error de que uno sabe hacer bien las cosas, pero por norma general siempre se pueden hacer mejor. Sólo es cuestión de informarse adecuadamente.
Espero que estos consejos os ayuden en vuestros proyectos de programación.
Un saludo
La vida es un proceso no lineal, incluso caótico. Pero pienso que casi todo se puede modelar adecuadamente utilizando nuestro ingenio y una poderosa herramienta como son las matemáticas. Este blog PERSONAL (NO profesional) tratará de mostrar que es lo que he aprendido sobre matemáticas, así como dar algunos consejos sobre estas que puedan haceros la vida más fácil.
Mostrando entradas con la etiqueta Ciencia y tecnología. Mostrar todas las entradas
Mostrando entradas con la etiqueta Ciencia y tecnología. Mostrar todas las entradas
domingo, 7 de abril de 2013
lunes, 7 de mayo de 2012
Level - Set y método adjunto: comparativa
Estimados lectores
En este post voy a mostrar los resultados que se obtienen al utilizar dos métodos distintos para dibujar los resultados de un problema de optimización: en este caso se trata de la resolución de la "ecuación de radiación reducida", o también llamada ecuación de difusión (es el caso en el que el medio es ópticamente "grueso", esto es, que la absorción es despreciable frente al "scattering":
$$ \nabla \cdot (D(r) \nabla I(r)) + \mu_a (r)I(r) = 0 \text{ in } \Omega $$
$$ \mu_a (r)I(r) - \frac{2}{\pi} D(r) \nu(r_b) \nabla I(r)= f(r) \text{ in } \partial \Omega $$
He implementado dos soluciones: por un lado el método adjunto y por otro un método level-set. Las gráficas se anexan a continuación. Para el método level set se han utilizado dos pares de valores para el campo de valores de coeficiente de absorción del medio en la malla: por un lado un valor de 0.1 para el background y 0.03 para el objeto y para otro caso distinto un valor de 0.1 para el background y de 0.17 para el objeto. Esto se ha planteado así para analizar los resultados y ver las conclusiones.
En este post voy a mostrar los resultados que se obtienen al utilizar dos métodos distintos para dibujar los resultados de un problema de optimización: en este caso se trata de la resolución de la "ecuación de radiación reducida", o también llamada ecuación de difusión (es el caso en el que el medio es ópticamente "grueso", esto es, que la absorción es despreciable frente al "scattering":
$$ \nabla \cdot (D(r) \nabla I(r)) + \mu_a (r)I(r) = 0 \text{ in } \Omega $$
$$ \mu_a (r)I(r) - \frac{2}{\pi} D(r) \nu(r_b) \nabla I(r)= f(r) \text{ in } \partial \Omega $$
He implementado dos soluciones: por un lado el método adjunto y por otro un método level-set. Las gráficas se anexan a continuación. Para el método level set se han utilizado dos pares de valores para el campo de valores de coeficiente de absorción del medio en la malla: por un lado un valor de 0.1 para el background y 0.03 para el objeto y para otro caso distinto un valor de 0.1 para el background y de 0.17 para el objeto. Esto se ha planteado así para analizar los resultados y ver las conclusiones.
El resultado del método adjunto (resultado arriba ilustrado) muestra que en el dominio estudiado hay dos objetos
diagonalmente opuestos con unos coeficientes de difusión mayores y
menores que el valor de fondo del dominio, cuyo valor es de 0.1 . La
velocidad de convergencia fue muy lenta, del orden de horas.
Este resultado puede
confirmarse al desarrollar los métodos Level-Set:
- Al utilizar como
valores de referencia 0.1 para el fondo y 0.03 para el objeto, se
puede observar que el método level-set da como resultado un contorno
cercano al objeto con valor de coeficiente de absorción bajo en el
método adjunto, confirmando la ubicación predicha por el
primer método. El resultado se obtuvo en un tiempo de convergencia
mucho más bajo que en el caso del método adjunto. El resultado se ilustra a continuación:
- Al utilizar como
valores de referencia 0.1 para el fondo y 0.17 para el objeto se
visualiza que el método level-set da como resultado final el objeto
correspondiente a un coeficiente de absorción elevado obtenido en el
método adjunto. La velocidad de convergencia fue similar al
primer caso level-set.
Estos resultados permiten
concluir que:
- El método adjunto permite obtener en tu dominio todos los objetos que estén presentes
en el mismo, sea cual sea su coeficiente de absorción.
- El resultado de los
métodos level-set mostrarán un resultado u otro dependiendo del
valor escogido para el background y para el objeto. Si estos valores
no son cogidos de forma adecuada, puede que la solución obtenida sea
incompleta. Haría falta resolver el problema varias veces con
distintos valores para cerciorarse que el resultado obtenido es
correcto.
- El método adjunto es claramente más lento en términos de convergencia que los métodos
level-set, necesitando un número de iteraciones mucho mayor. Esto
concuerda con el hecho de que este método busca soluciones de coef.
de absorción en un campo de valores a priori infinito. Sin embargo,
el método level-set busca soluciones en un campo de coeficientes de
absorción limitado a dos valores: fondo u objeto. Por lo tanto se
espera que level- set sea mucho más rápido.
- El método adjunto da una solución difuminada en el espacio, esto es, la solución no
se sitúa en un punto sino en un área más o menos extensa.
- El método level-set
permite ubicar la posición del objeto de forma mucho más precisa,
ya que el campo de soluciones sólo permite dos valores para cada
punto de la malla.
- Como resumen de estas
conclusiones se puede comentar que el método level-set es un método
mucho más eficaz para si se conoce a priori el rango de valores que
puede adoptar el campo buscado. Si no se conoce información alguna,
el método adjunto puede resultar una opción acertada debido a
que permite averiguar todos los objetos con cualquier valor dentro
del dominio.
Si se deseara una buena
precisión, la opción preferida sería utilizar el método adjunto para acotar el valor que puede adoptar el campo estudiado y
posteriormente definir la posición de los objetos de forma mucho más
precisa con el método level-set.
Los resultados, como se pueden observar, no son exactos: como todo método de optimización, tu resultado final dependerá de lo preciso que sea el algoritmo de convergencia y de la estimación inicial que se realice. No obstante, este ejemplo permite visualizar la potencia de este tipo de técnicas.
Los resultados, como se pueden observar, no son exactos: como todo método de optimización, tu resultado final dependerá de lo preciso que sea el algoritmo de convergencia y de la estimación inicial que se realice. No obstante, este ejemplo permite visualizar la potencia de este tipo de técnicas.
Un saludo
lunes, 23 de abril de 2012
Métodos Level-Set
Estimados lectores
En esta ocasión voy a escribir sobre un tema sobre el cual estoy actualmente desarollando un trabajo y que me ha parecido ciertamente util: los métodos level-set.
Este tipo de métodos se engloban dentro de los métodos matemáticos de optimización, especialmente en aquellos destinados a la resolución de problemas inversos: ejemplos clásicos de problemas inversos pueden ser la reconstrucción de imágenes o la determinación de variables de campo implícitas mediante el uso de un número de datos obtenidos mediante la resolución del problema explícito (por ejemplo conocer el coeficiente de absorción de un dominio a partir de varios estímulos en la frontera con ciertas fuentes de luz de valor conocido).
Los métodos tipo level - set fueron planteados hace tiempo por Sethian y Onsager. Plantearon que resolviendo la siguiente ecuación, se podía conocer la evolución de la frontera de una función dada $\phi$ conocido el campo de velocidades $\vec{v}$ de cada uno de los puntos de la frontera:
$ \frac{\partial \phi}{\partial t} + \vec{v} \vec{\nabla} \phi = 0 $
con
$ \vec{\nabla} \phi = \vec{n} \mid \nabla \phi \mid $
El método en si es más sencillo de lo que parece. El punto clave consiste en que dada una función F en una dimensión arbitraria, por ejemplo dimensión 2, el problema se puede generalizar utilizando una función de una dimensión adicional $\phi$ (en el ejemplo dimensión 3) y buscar el valor de mi función cuando esta dimensión adicional adquiere un valor 0 "busco el nivel cero de la función $\phi$.
$$ F(x,y,t) \longrightarrow \phi(x,y,z,t) \longrightarrow z = \phi(x,y,t)$$
$$\Gamma (x,y,t) \equiv \phi(x,y,0,t) $$
En este caso, resulta que los valores de la función que hagan cero mi función son los valores de la frontera que estoy buscando.
Una vez conocida mi función $\phi$ de dimensión adicional, y conociendo el campo de velocidades $\vec{v}$, mediante la integración de la ecuación hiperbólica anteriormente descrita puedo hallar la evolución de mi frontera.
¿Como se traduce esto a efectos prácticos de resolver un problema concreto?
Es relativamente sencillo. Dada la función $F$ de tu problema dentro del dominio estudiado, se propone una función $\phi$ tal que $\Gamma = \phi = 0$
CUALQUIER FUNCIÓN PUEDE VALER. A priori vale cualquier forma siempre y cuando cumpla que en el instante inicial $\Gamma = \phi = 0$. Un ejemplo para el caso 3D puede ser un paraboloide de revolución clásico.
$$ z=(\frac{x}{a})^2 + (\frac{y}{b})^2 $$
Una vez se propone esta función, se comienza a integrar la PDE hiperbólica propuesta arriba utilizando el campo de velocidades del dominio. En cada paso "temporal", la función $\phi$ se irá deformando, pero sólo su proyección en el plano dimensional del problema adicional es nuestra solución ($\Gamma$). Así que representando al final de cada paso iterativo $\phi = 0$, obtendremos la deformación de la frontera.
Este tipo de métodos pueden ser combinado conjuntamente con otros métodos de optimización, como el método del gradiente. Utilizando la función de optimización respectiva y ajustando el tamaño del incremento mediante un parámetro escalar variable en magnitud en cada paso, se pueden resolver problemas inversos como se ha comentado anteriormente (como una reconstrucción de imágenes).
Un saludo
En esta ocasión voy a escribir sobre un tema sobre el cual estoy actualmente desarollando un trabajo y que me ha parecido ciertamente util: los métodos level-set.
Este tipo de métodos se engloban dentro de los métodos matemáticos de optimización, especialmente en aquellos destinados a la resolución de problemas inversos: ejemplos clásicos de problemas inversos pueden ser la reconstrucción de imágenes o la determinación de variables de campo implícitas mediante el uso de un número de datos obtenidos mediante la resolución del problema explícito (por ejemplo conocer el coeficiente de absorción de un dominio a partir de varios estímulos en la frontera con ciertas fuentes de luz de valor conocido).
Los métodos tipo level - set fueron planteados hace tiempo por Sethian y Onsager. Plantearon que resolviendo la siguiente ecuación, se podía conocer la evolución de la frontera de una función dada $\phi$ conocido el campo de velocidades $\vec{v}$ de cada uno de los puntos de la frontera:
$ \frac{\partial \phi}{\partial t} + \vec{v} \vec{\nabla} \phi = 0 $
con
$ \vec{\nabla} \phi = \vec{n} \mid \nabla \phi \mid $
El método en si es más sencillo de lo que parece. El punto clave consiste en que dada una función F en una dimensión arbitraria, por ejemplo dimensión 2, el problema se puede generalizar utilizando una función de una dimensión adicional $\phi$ (en el ejemplo dimensión 3) y buscar el valor de mi función cuando esta dimensión adicional adquiere un valor 0 "busco el nivel cero de la función $\phi$.
$$ F(x,y,t) \longrightarrow \phi(x,y,z,t) \longrightarrow z = \phi(x,y,t)$$
$$\Gamma (x,y,t) \equiv \phi(x,y,0,t) $$
En este caso, resulta que los valores de la función que hagan cero mi función son los valores de la frontera que estoy buscando.
Una vez conocida mi función $\phi$ de dimensión adicional, y conociendo el campo de velocidades $\vec{v}$, mediante la integración de la ecuación hiperbólica anteriormente descrita puedo hallar la evolución de mi frontera.
¿Como se traduce esto a efectos prácticos de resolver un problema concreto?
Es relativamente sencillo. Dada la función $F$ de tu problema dentro del dominio estudiado, se propone una función $\phi$ tal que $\Gamma = \phi = 0$
CUALQUIER FUNCIÓN PUEDE VALER. A priori vale cualquier forma siempre y cuando cumpla que en el instante inicial $\Gamma = \phi = 0$. Un ejemplo para el caso 3D puede ser un paraboloide de revolución clásico.
$$ z=(\frac{x}{a})^2 + (\frac{y}{b})^2 $$
Una vez se propone esta función, se comienza a integrar la PDE hiperbólica propuesta arriba utilizando el campo de velocidades del dominio. En cada paso "temporal", la función $\phi$ se irá deformando, pero sólo su proyección en el plano dimensional del problema adicional es nuestra solución ($\Gamma$). Así que representando al final de cada paso iterativo $\phi = 0$, obtendremos la deformación de la frontera.
Este tipo de métodos pueden ser combinado conjuntamente con otros métodos de optimización, como el método del gradiente. Utilizando la función de optimización respectiva y ajustando el tamaño del incremento mediante un parámetro escalar variable en magnitud en cada paso, se pueden resolver problemas inversos como se ha comentado anteriormente (como una reconstrucción de imágenes).
Un saludo
Disculpas a todos los lectores por la tardanza
Estimados lectores
Lamento profundamente no haber podido atender mi blog como es debido. Las obligaciones personales y con mi tesis doctoral no me han permitido actualizar los contenidos ni atender las preguntas a tiempo.
Espero en los próximos días ir actualizando con nuevo contenido mi blog.
Sin más, un saludo a todos
DAVID RODRIGUEZ
Lamento profundamente no haber podido atender mi blog como es debido. Las obligaciones personales y con mi tesis doctoral no me han permitido actualizar los contenidos ni atender las preguntas a tiempo.
Espero en los próximos días ir actualizando con nuevo contenido mi blog.
Sin más, un saludo a todos
DAVID RODRIGUEZ
lunes, 6 de febrero de 2012
Computación en paralelo I
Hola a todos
En esta ocasión voy a hablar muy escuetamente de lo que va a ser el futuro de la programación científica: la computación en paralelo.
Actualmente los procesadores tienden a tener un número de núcleos mayor de uno, tal y como era hace unos años: todos estamos familiarizados con los "Pentium core 2 duo" o los modernos "Pentium I3, I5, etc". Sin embargo, por lo que a mi respecta, la formación universitaria en ingeniería sólo cubre nociones básicas de programación en serie. Es obvio que, desde un punto de vista computacional, si se poseen varios núcleos de procesamiento, el realizar una programación capaz de utilizar simultáneamente la potencia de cálculo de esos cores va a ser mucho más ventajoso.
Sin embargo, hasta hace bien poco desconocía por completo un punto de partida que me pudiera orientar para empezar a caminar en este vasto campo. Pues bien, si queréis una piedra angular de referencia, vuestra palabra mágica es MPI.
El MPI se puede considerar como un anexo a los lenguajes de programación típicos en ciencias (Fortran, C) que permite procesar un código arrancando varios "threads", o hilos de computación. Realmente lo ideal es ejecutar tantos threads como núcleos tengas en tu cluster, pero no tiene por que ser así.
Para realizar un código en paralelo, hay que pasar de una mentalidad de cálculo en serie, y comenzar a pensar como se puede distribuir todas las tareas que tiene que hacer el código: habrá tareas, como una búsqueda de elementos en un fichero o matriz, que se puede "descomponer" en partes que pueden llevar a cabo cada núcleo. En cambio habrá otras que no se puedan descomponer de modo directo, como la escritura y lectura simultánea de un fichero.
Todas estas tareas deben ser coordinadas, esto es, normalmente se programa de forma que uno de los núcleos actúa como maestro y el resto como esclavos: el primero realizará tareas no paralelizables y se encargará de enviar y recibir información que los esclavos necesiten y/o proporcionen. Los cores esclavos se encargarán de realizar la computación respectiva, enviando o recibiendo información vital para el código.
MPI es una alternativa básica a la programación tradicional. Sin embargo, otras aplicaciones están desarrollándose rápidamente, con el afán de simplificar los procesos de comunicación entre cores y la distribución del trabajo: un ejemplo clásico es el OpenMP.
En próximos posts hablaré más en detalle de MPI y OpenMP.
Un saludo
En esta ocasión voy a hablar muy escuetamente de lo que va a ser el futuro de la programación científica: la computación en paralelo.
Actualmente los procesadores tienden a tener un número de núcleos mayor de uno, tal y como era hace unos años: todos estamos familiarizados con los "Pentium core 2 duo" o los modernos "Pentium I3, I5, etc". Sin embargo, por lo que a mi respecta, la formación universitaria en ingeniería sólo cubre nociones básicas de programación en serie. Es obvio que, desde un punto de vista computacional, si se poseen varios núcleos de procesamiento, el realizar una programación capaz de utilizar simultáneamente la potencia de cálculo de esos cores va a ser mucho más ventajoso.
Sin embargo, hasta hace bien poco desconocía por completo un punto de partida que me pudiera orientar para empezar a caminar en este vasto campo. Pues bien, si queréis una piedra angular de referencia, vuestra palabra mágica es MPI.
El MPI se puede considerar como un anexo a los lenguajes de programación típicos en ciencias (Fortran, C) que permite procesar un código arrancando varios "threads", o hilos de computación. Realmente lo ideal es ejecutar tantos threads como núcleos tengas en tu cluster, pero no tiene por que ser así.
Para realizar un código en paralelo, hay que pasar de una mentalidad de cálculo en serie, y comenzar a pensar como se puede distribuir todas las tareas que tiene que hacer el código: habrá tareas, como una búsqueda de elementos en un fichero o matriz, que se puede "descomponer" en partes que pueden llevar a cabo cada núcleo. En cambio habrá otras que no se puedan descomponer de modo directo, como la escritura y lectura simultánea de un fichero.
Todas estas tareas deben ser coordinadas, esto es, normalmente se programa de forma que uno de los núcleos actúa como maestro y el resto como esclavos: el primero realizará tareas no paralelizables y se encargará de enviar y recibir información que los esclavos necesiten y/o proporcionen. Los cores esclavos se encargarán de realizar la computación respectiva, enviando o recibiendo información vital para el código.
MPI es una alternativa básica a la programación tradicional. Sin embargo, otras aplicaciones están desarrollándose rápidamente, con el afán de simplificar los procesos de comunicación entre cores y la distribución del trabajo: un ejemplo clásico es el OpenMP.
En próximos posts hablaré más en detalle de MPI y OpenMP.
Un saludo
domingo, 4 de diciembre de 2011
Cambio en server de LATEX
Hola
Debido a que ha habido cambios en el server de LATEX del cual suministré su enlace, he buscado otro server para poder mostrar LATEX en tu propia web sin cambios. El nuevo script que tenéis que introducir (sustituyendo al que ya tenías en caso de que siguierais las instrucciones tal y como expliqué en el anterior post) es el siguiente:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script>
Con esto ya podréis escribir con LATEX.
Nota:
El script esta diseñado para que si se pone un dolar a cada lado de la escritura en latex ($ texto $), se mostrará el texto en línea, esto es, sin espacios. Si se escriben dobles dólares ($$ texto $$), se hace un punto y aparte y se separa del resto del cuerpo. Ejemplos:
Esto es una prueba de este texto $f=\sqrt{x^2+y^2}$ dentro de linea.
Esto es una prueba
$$ g=\frac{\partial}{\partial x}\left( z^2+6x \right) $$
de texto separado de cuerpo
miércoles, 26 de octubre de 2011
Escribe Latex en tu blog
Hola a todos
Para todos aquellos que utiliceis Latex en vuestros escritos científicos, pero no sabeis como implementar dicha escritura en vuestro blog, os remito a esta web que he encontrado que te explica como hacerlo (al menos en blogger/blogspot).
http://watchmath.com/vlog/?p=438
El proceso es muy sencillo: solo es copiar y pegar el script que deja el autor del blog tal y como se indica en su web, si bien hay que realizarun cambio en la dirección web que esta incluida en el script:
cambiar
por
Y ya está. A disfrutar de vuestra creatividad.
Para los que no sabeis que es Latex, os muestro un ejemplo para que veais de que va el tema. Y si os interesa, solo teneis que buscar información sobre el mismo en la web. Hay cientos de manuales y foros que hablan sobre Latex. Hace falta un poco de esfuerzo para adaptarse a la escritura, pero una vez controlas los comandos la escritura es muy rápida e intuitiva. Yo he dejado de usar word !!
$$ F(x,y)=\int_{a}^{b} g(x,y) dx $$
$$\nabla \cdot \gamma = \frac{\partial \gamma}{\partial x}+ \frac{\partial \gamma}{\partial y} $$
ATENCIÓN!! HA HABIDO CAMBIO DE SERVIDOR. ESTA DIRECCIÓN YA NO FUNCIONA. MIRAR POST POSTERIORES PARA ENCONTRAR ALTERNATIVA PARA ESCRITURA CON LATEX
Para todos aquellos que utiliceis Latex en vuestros escritos científicos, pero no sabeis como implementar dicha escritura en vuestro blog, os remito a esta web que he encontrado que te explica como hacerlo (al menos en blogger/blogspot).
http://watchmath.com/vlog/?p=438
El proceso es muy sencillo: solo es copiar y pegar el script que deja el autor del blog tal y como se indica en su web, si bien hay que realizarun cambio en la dirección web que esta incluida en el script:
cambiar
http://www.watchmath.com/cgi-bin/mathtex3.js
por
http://www.watchmath.com/main/cgi-bin/mathtex3.js
Y ya está. A disfrutar de vuestra creatividad.
Para los que no sabeis que es Latex, os muestro un ejemplo para que veais de que va el tema. Y si os interesa, solo teneis que buscar información sobre el mismo en la web. Hay cientos de manuales y foros que hablan sobre Latex. Hace falta un poco de esfuerzo para adaptarse a la escritura, pero una vez controlas los comandos la escritura es muy rápida e intuitiva. Yo he dejado de usar word !!
$$ F(x,y)=\int_{a}^{b} g(x,y) dx $$
$$\nabla \cdot \gamma = \frac{\partial \gamma}{\partial x}+ \frac{\partial \gamma}{\partial y} $$
ATENCIÓN!! HA HABIDO CAMBIO DE SERVIDOR. ESTA DIRECCIÓN YA NO FUNCIONA. MIRAR POST POSTERIORES PARA ENCONTRAR ALTERNATIVA PARA ESCRITURA CON LATEX
Suscribirse a:
Entradas (Atom)


