# `NUMERICAL POISSON GEOMETRY`

Este *notebook* fue utilizado en la charla **Un breve vistazo a la Geometría de Poisson Computacional** durante la realización del *Congreso Nacional Virtual de la Sociedad Matemática Mexicana en 2020* 

Videos de la plática:
*   [Parte I](https://www.youtube.com/watch?v=27nBbz8BbL0&feature=emb_logo)
*   [Parte II](https://www.youtube.com/watch?v=PtTaK_Qef54&feature=emb_logo)



# Instalación y sintaxis
---


```
!pip install numericalpoissongeometry
```

### Bivector



El bivector asociado a $\mathfrak{so}(3)$ es 

$$\Pi_{\mathfrak{so(3)}} = x_{3}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{2}} - x_{2}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{3}} + x_{1}\frac{\partial}{\partial x_{2}} \wedge \frac{\partial}{\partial x_{3}}$$



```
P_so3 = {(1, 2): 'x3', (1, 3): '-1*x2', (2, 3): 'x1'}
P_so3 = {(1, 2): 'x3', (1, 3): '-x2', (2, 3): 'x1'}
```

Recuerde lo siguiente para `Python`

 

*   `**` --> exponente
*   `*`  --> multiplicación
*   `+`  --> suma
*   `-`  --> resta
*   `/`  --> división

Más info https://docs.python.org/3/library/numeric.html


### Funciones Escalares 


Sea $K_{\mathfrak{so}(3)}: \mathbb{R}^{3} \to \mathbb{R}$ definida como $$K_{\mathfrak{so}(3)}(x_{1}, x_{2}, x_{3}) = \frac{x^{2}_{1}}{2} + \frac{x^{2}_{2}}{2} + \frac{x^{2}_{3}}{2} $$



```
K_so3 = '(1/2)*(x1**2 + x2**2 + x3**2)'
K_so3 = '(x1**2)/2 + (x2**2)/2 + (x3**2)/2'
```

### Mallas

Las mallas que utiliza el módulo `NumericalPoissonGeometry` son las siguientes:
*   Lista de listas
*   Arreglos de `Numpy`


#### Lista de listas (`Python` nativo)


```
# Simple lista de listas en Python
R3_list = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
R3_list
```

#### Arreglos de `Numpy`

Para manipular una gran cantidad de puntos, es recomendable utilizar el módulo de `python` para análisis numérico `numpy`. 


```
import numpy as np # Importamos el módulo numpy

 # Generamos un malla de 10**4 puntos con números aleatorios 
R3_numpy_ramdon = np.random.rand(10**4, 3)
R3_numpy_ramdon
```


```
len(R3_numpy_ramdon)
```

### Primer uso del módulo 


```
# Importamos el módulo NumericalPoissonGeometry
from numpoisson.numpoisson import NumPoissonGeometry as npg 

# Instanciar el módulo NumericalPoissonGeometry con la dimensión y la variable a usar 
npg3 = npg(3, 'x') 
# Esta función muestra todos los métodos de una clase
dir(npg) 
```

#### $\LaTeX$ bonito


```
import sympy
def custom_latex_printer(exp,**options):
    from google.colab.output._publish import javascript
    url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=default"
    javascript(url=url)
    return sympy.printing.latex(exp,**options)
sympy.init_printing(use_latex="mathjax",latex_printer=custom_latex_printer)
```

# Álgebra de Lie $\mathfrak{so}(3)$

---



Recordemos 

$$\mathfrak{so}(3)\simeq\{ M \in Mat_{3\times 3}(\mathbb{R}) | M^{T} = -M \}$$  
  

La estructura de álgebra de Lie en $\{ M \in Mat_{3\times 3}(\mathbb{R}) | M^{T} = -M \}$ es la inducida por el conmutador $[A, B]:= AB - BA$

El bivector asociado a $\mathfrak{so}(3)$ es 

$$\Pi_{\mathfrak{so(3)}} = x_{3}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{2}} - x_{2}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{3}} + x_{1}\frac{\partial}{\partial x_{2}} \wedge \frac{\partial}{\partial x_{3}}$$

### Evaluación de la matriz asociada al bivector $\Pi_{\mathfrak{so(3)}}$


```
# Importamos el módulo NumericalPoissonGeometry
from numpoisson.numpoisson import NumPoissonGeometry as npg

# Instanciamos el módulo NumericalPoissonGeometry 
npg3 = npg(3, 'x') 
# Definimos el bivector asociado a so(3)
P_so3 = {(1, 2): 'x3', (1, 3): '-x2', (2, 3): 'x1'} 
```

Para el caso de la malla `R3_list`




```
R3_list
```


```
# Importamos el módulo PoissonGeometry
from poisson.poisson import PoissonGeometry as pg 

# Instanciamos el módulo PoissonGeometry 
pg3 = pg(3, 'x')
# Calculamos la matriz asociada al bivector P_so3 
pg3.bivector_to_matrix(P_so3) 
```

Las funciones del método `NumericalPoissonGeometry` retornan 4 tipos de resultados:


*   `Numpy`, 
*   tf_output  --->  `TensorFlow`
*   pt_output  --->  `Pytorch`
*   dict_output -->  `PoissonGeometry`




```
# Evaluamos la matriz asociada al bivector P_so3 en la malla R3_list
result_np = npg3.num_bivector_to_matrix(P_so3, R3_list)
result_np
```


```
type(result_np)
```


```
# Evaluamos la matriz asociado al bivector P_so3 en la malla R3_list
result_pt = npg3.num_bivector_to_matrix(P_so3, R3_list, pt_output=True)
result_pt
```


```
type(result_pt)
```


```
# Evaluamos la matriz asociada al bivector P_so3 en la malla R3_list
result_tf = npg3.num_bivector_to_matrix(P_so3, R3_list, tf_output=True)
result_tf
```


```
type(result_tf)
```

Para el caso de la malla `R3_numpy_ramdon`


```
# Evaluamos la matriz asociada al bivector P_so3 en la malla R3_numpy_ramdon
result_np = npg3.num_bivector_to_matrix(P_so3, R3_numpy_ramdon)
result_np
```

### Evaluación del bivector $\Pi_{\mathfrak{so(3)}}$ 


```
# Evaluamos el bivector P_so3 en la malla  
npg3.num_bivector(P_so3, R3_list)
```


```
# Evaluamos el bivector asociado a P_so3 en la malla R3_list
result_dict = npg3.num_bivector(P_so3, R3_list, dict_output=True)
result_dict
```


```
type(result_dict)
```

#### Evaluación de $X_{h}$ relativo a $\Pi_{\mathfrak{so(3)}}$


Caso 1: 

Sea $h = K_{\mathfrak{so}(3)}: \mathbb{R}^{3} \to \mathbb{R}$ definida como $$K_{\mathfrak{so}(3)}(x_{1}, x_{2}, x_{3}) = \frac{x^{2}_{1}}{2} + \frac{x^{2}_{2}}{2} + \frac{x^{2}_{3}}{2} $$



```
# Encontramos el campo vectorial asociado a K_so3 inducido por P_so3 con el módulo simbólico  
pg3.hamiltonian_vf(P_so3, K_so3) 
```


```
# Evaluamos el campo vectorial en la malla R3_numpy_ramdon
npg3.num_hamiltonian_vf(P_so3, K_so3, R3_numpy_ramdon, pt_output=True)
```

Caso 2:  
 
Sea $h: \mathbb{R}^{3} \to \mathbb{R}$ definida como $$h(x_{1}, x_{2}, x_{3}) = \frac{x^{2}_{1}}{2} - \frac{x^{2}_{2}}{2} - \frac{x^{2}_{3}}{2} $$



```
# Definimos una función escalar h
h = '(x1**2)/2 - (x2**2)/2 - (x3**2)/2' 
# Encontramos el campo vectorial asociado a K_so3 inducido por P_so3 con el módulo simbólico  
pg3.hamiltonian_vf(P_so3, h) 
```


```
# Evaluamos el campo vectorial en la malla R3_list
npg3.num_hamiltonian_vf(P_so3, h, R3_list)
```


```
# Evaluamos el campo vectorial en la malla R3_numpy_ramdon
npg3.num_hamiltonian_vf(P_so3, h, R3_numpy_ramdon)
```

# Álgebra de Lie $\mathfrak{sl}(2)$

---

Recordemos 

$$\mathfrak{sl}(2)\simeq\{ M \in Mat_{3\times 3}(\mathbb{R}) | tr(M) = 0 \}$$  
  

La estructura de álgebra de Lie en $\{ M \in Mat_{3\times 3}(\mathbb{R}) | tr(M) = 0 \}$ es la inducida por el conmutador $[A, B]:= AB - BA$

El bivector asociado a $\mathfrak{sl}(2)$ es 

$$\Pi_{\mathfrak{sl(2)}} = - x_{3}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{2}} - x_{2}\frac{\partial}{\partial x_{1}} \wedge \frac{\partial}{\partial x_{3}} + x_{1}\frac{\partial}{\partial x_{2}} \wedge \frac{\partial}{\partial x_{3}}$$

Evaluación del operador de cofrontera inducido por $\Pi_{\mathfrak{sl(2)}}$ en el campo vectorial  

$$W = \frac{x_{1} x_{3} exp^{\frac{-1}{(x_1^2 + x_2^2 - x_3^2)^{2}}}}{x_1^2 + x_2^2}\frac{\partial}{\partial x_1} + \frac{x_{2} x_{3} exp^{\frac{-1}{(x_1^2 + x_2^2 - x_3^2)^{2}}}}{x_1^2 + x_2^2}\frac{\partial}{\partial x_2} + exp^{\frac{-1}{(x_1^2 + x_2^2 - x_3^2)^{2}}} \frac{\partial}{\partial x_3} $$


```
# Importamos el módulo NumericalPoissonGeometry
from numpoisson.numpoisson import NumPoissonGeometry as npg
# Importamos el módulo PoissonGeometry 
from poisson.poisson import PoissonGeometry as pg 

# Instanciar el módulo NumericalPoissonGeometry con la dimensión y la variable a usar 
npg3 = npg(3, 'x')
# Instanciar el módulo PoissonGeometry con la dimensión y la variable a usar  
pg3 = pg(3, 'x') 

```


```
# Definimos el bivector asociado a so(3)
P_sl2 = {(1, 2): '-x3', (1, 3): '-x2', (2,3): 'x1'}
# Definimos el campo vectorial W
W = {(1,): 'x1 * x3* exp(-1/(x1**2 + x2**2 - x3**2)**2) / (x1**2 + x2**2)',
     (2,): 'x2 * x3* exp(-1/(x1**2 + x2**2 - x3**2)**2) / (x1**2 + x2**2)',
     (3,): 'exp(-1 / (x1**2 + x2**2 - x3**2)**2)'}
# Calculamos la imagen del operador de cofrontera inducido por P_sl2 en el campo vectorial W
pg3.lichnerowicz_poisson_operator(P_sl2, W)
```

Para tener un ejemplo distinto a cero redefinimos el campo vectorial  

$$W = \frac{x_{1}exp^{\frac{-1}{(x_1^2 + x_2^2 - x_3^2)^{2}}}}{x_1^2 + x_2^2}\frac{\partial}{\partial x_1} + \frac{x_{2}exp^{\frac{-1}{(x_1^2 + x_2^2 - x_3^2)^{2}}}}{x_1^2 + x_2^2}\frac{\partial}{\partial x_2} + x_3 \frac{\partial}{\partial x_3} $$




```
# Redefinimos el campo vectorial W
W = {(1,): 'x1 * exp(-1/(x1**2 + x2**2 - x3**2)**2) / (x1**2 + x2**2)',
     (2,): 'x2 * exp(-1/(x1**2 + x2**2 - x3**2)**2) / (x1**2 + x2**2)',
     (3,): 'x3'}
# Calculamos la imagen del operador de cofrontera inducido por P_sl2 en el campo vectorial W
pg3.lichnerowicz_poisson_operator(P_sl2, W)
```


```
# Evaluamos la imagen del operador de cofrontera inducido por P_sl2 en el campo vectorial W en la malla R3_numpy_ramdon
npg3.num_coboundary_operator(P_sl2, W, R3_list)
```


```
npg3.num_coboundary_operator(P_sl2, W, R3_list, dict_output=True)
```

#### Evaluación de mapeo $\Pi_{\mathfrak{sl(2)}}^{\#}$

Sea $$\alpha = x_1 dx_1 + x_2 dx_2 + x_3 dx_3$$

Calculemos $\Pi_{\mathfrak{sl(2)}}^{\#}(\alpha)$ con ayuda del módulo simbólico.



```
# Definimos la 1-forma alpha
alpha = {(1,): 'x1', (2,): 'x2', (3,): '-x3'}
# Calculamos el morfismo sharp en alpha de manera simbólica
pg3.sharp_morphism(P_sl2, alpha)
```


```
# Evaluamos el morfismo sharp en alpha en la malla R3_numpy_ramdon
npg3.num_sharp_morphism(P_sl2, alpha, R3_numpy_ramdon)
```

Ahora consideremos $\alpha= (x_2-x_3)dx_1 + (x_3-x_1)dx_2 + (x_1-x_2)dx_3$



```
# Redefinimos la 1-forma alpha
alpha = {(1,): 'x2-x3', (2,): 'x3-x1', (3,): 'x1-x2'}
# Calculamos el morfismo sharp en alpha de manera simbólica
pg3.sharp_morphism(P_sl2, alpha)
```


```
# Evaluamos el morfismo sharp en alpha en la malla R3_list
npg3.num_sharp_morphism(P_sl2, alpha, R3_list)
```

#### Evaluación del corchete de Poisson asociado a $\Pi_{\mathfrak{sl(2)}}$ 

Calculamos $$\{x_1, x_3\}_{\Pi_{\mathfrak{sl(2)}}} = -x_2$$


```
# Definimmos las funciones f y g
f = 'x1'
g = 'x3'
# Calculamos el corchete de Poisson de forma simbólica
pg3.poisson_bracket(P_sl2, f, g)
```


```
# Evaluamos el corchete de Poisson en la malla R3_list
npg3.num_poisson_bracket(P_sl2, f, g, R3_list)
```

De igual manera para  

*   $\{x_1, x_2\}_{\Pi_{\mathfrak{sl(2)}}} = -x_3$
*   $\{x_2, x_3\}_{\Pi_{\mathfrak{sl(2)}}} = x_1$


```
# Definimmos las funciones f y g
f = 'x1'
g = 'x2'
# Calculamos el corchete de Poisson de forma simbólica
pg3.poisson_bracket(P_sl2, f, g)
```


```
# Evaluamos el corchete de Poisson en la malla R3_list
npg3.num_poisson_bracket(P_sl2, f, g, R3_list)
```


```
# Definimmos las funciones f y g
f = 'x2'
g = 'x3'
# Calculamos el corchete de Poisson de forma simbólica
pg3.poisson_bracket(P_sl2, f, g)
```


```
# Evaluamos el corchete de Poisson en la malla R3_list
npg3.num_poisson_bracket(P_sl2, f, g, R3_list)
```

#### Los métodos


| **num_bivector_field**        | **num_bivector_to_matrix**    | **num_poisson_bracket**           |
| :---------------------------: | :---------------------------: | :------------------------------:  |
| **num_hamiltonian_vf**        | **num_sharp_morphism**        | **num_coboundary_operator**       |
| **num_modular_vf**            | **num_curl_operator**         | **num_one_forms_bracket**         |
| **num_gauge_transformation**  | **num_linear_normal_form_R3** | **num_flaschka_ratiu_bivector**   |


### Referencias


* Miguel Evangelista-Alvarado, José C. Ruíz Pantaleón & P. Suárez-Serrato, <br/>
 [On Computational Poisson Geometry I: Symbolic Foundations](https://arxiv.org/pdf/1912.01746.pdf), <br/> 
   arXiv:1912.01746 [math.DG] (2019)

* https://github.com/mevangelista-alvarado/NumericalPoissonGeometry/blob/master/README.md


8513b1a6ef1770d73f18a8c5eed801bf02a9a72c
ipynb
Jupyter Notebook
docs/CNVSMM-2020/CNVSMM_2020.ipynb
mevangelista-alvarado/NumericalPoissonGrometry-
76f41be4eb11248c3206b5e371c7aa9eb9d73b44
MIT
2020-10-30T22:49:49.000Z
2021-07-15T20:56:13.000Z
docs/CNVSMM-2020/CNVSMM_2020.ipynb
mevangelista-alvarado/NumericalPoissonGrometry-
76f41be4eb11248c3206b5e371c7aa9eb9d73b44
MIT
2020-11-13T19:01:28.000Z
2021-03-24T04:55:34.000Z
docs/CNVSMM-2020/CNVSMM_2020.ipynb
mevangelista-alvarado/NumericalPoissonGrometry-
76f41be4eb11248c3206b5e371c7aa9eb9d73b44
MIT
2021-02-23T05:41:02.000Z
2021-02-23T05:41:02.000Z
Qwen/Qwen-72B
1. YES
2. YES