Estoy trabajando en el grupo de Renormalización de la red Tensor. Mientras trato de implementar TRG en la red Honeycomb, me quedé atascado emparejando dos tensores de tres rangos y representándolo como matriz D ^ 2 * D ^ 2. ¿Puedes ayudarme a hacer este?
Necesito emparejar dos tensores de rango tres. . Entonces necesito encontrar un tensor C y D en la forma . ¿Cómo puedo hacerlo?
Implementación de Mathematica. Defina la función de traza del tensor:
tTr[Ts_,s_]:=Activate@TensorContract[Inactive[TensorProduct]@@Ts,s];
La traza del tensor se puede implementar simplemente especificando la lista de tensores y los pares de patas deben contraerse. Las patas se indexan siguiendo las órdenes de los tensores. Por ejemplo, el siguiente código toma los tensores de 3 patas y y contraer las piernas para formar el tensor de 4 patas .
A = RandomReal[1, {2, 2, 2}];
B = RandomReal[1, {2, 2, 2}];
X = tTr[{A, B}, {{3, 4}}];
Para usar la tTr
función correctamente, uno necesita entender cómo traducir la notación de Einstein
al lenguaje de red de tensores. La regla es bastante simple, simplemente adjunte a cada índice en la notación de Einstein por el índice de la pierna 1,2,3... de izquierda a derecha. Por ejemplo, uno puede reescribir
como
, entonces sabemos
y
son piernas que se van a contraer, así que tenemos que decirles tTr
que emparejen las piernas
. Después de la traza del tensor, obtenemos un tensor de 4 patas
.
Entonces para dividir el tensor , tenemos que agrupar las piernas y primero. Para ayudarnos a encontrar los índices de las piernas, escribimos como , entonces sabemos que las piernas en realidad son piernas y las piernas en realidad son piernas , por lo que podemos agrupar las piernas y realizar el SVD por
{U, S, V} = SingularValueDecomposition@Flatten[X, {{4, 1}, {2, 3}}];
Entonces piernas ir a y las piernas ir a ahora. Necesitamos absorber el valor singular en las matrices unitarias izquierda y derecha, esto se puede hacer mediante
V = V.Sqrt[S];
U = U.Sqrt[S];
Para el tensor RG, es posible que desee restringir la dimensión de las patas internas en este paso. Por ejemplo, puede hacer
V = V[[;; d]];
U = U[[;; d]];
dónde debe ser la dimensión de enlace que especificó anteriormente. Pero no haremos este truncamiento por ahora. Finalmente, remodelamos las matrices. y en tensores de 3 patas y por
C = ArrayReshape[U, {2, 2, 4}];
D = ArrayReshape[V, {2, 2, 4}];
Así hemos obtenido los nuevos tensores
y
. Para verificar que esta es la respuesta correcta, podemos contraer los tensores
y
. Por la reescritura
, sabemos que esta vez necesitamos contraer las piernas
, así que le decimos eso atTr
Y = tTr[{C, D}, {{3, 6}}];
Ahora hemos obtenido un tensor de 4 patas
. Nosotros deberíamos tener
. Pero no podemos pedirle directamente a Mathematica que verifique si Y == X
, porque los dos tensores ahora tienen diferentes ordenaciones de piernas. Para reorganizar las piernas, podemos usar la transposición generalizada. Pero necesitamos decirle a Mathematica las reglas de mapeo de piernas. Para encontrar las reglas de mapeo de
a
, podemos escribir
, por lo que hemos establecido el mapeo para cada pierna como
,
,
,
. No necesitamos mantener los nombres.
, podemos simplemente escribir el mapeo como
. Ni siquiera necesitamos decirle a Mathematica el lado izquierdo del mapeo, porque por definición, el lado izquierdo siempre debe estar ordenado como 1,2,3..., entonces solo necesitamos decirle a Mathematica transponer el tensor
por
, luego compare el resultado con el tensor
.
Transpose[Y, {4, 1, 2, 3}] == X
El resultado es True
a pesar de eso
y
se generan aleatoriamente. Entonces sabemos que todo el procedimiento funciona.
En conclusión, podemos realizar operaciones tensoriales en Mathematica muy fácilmente. Las siguientes cuatro funciones cubren básicamente todas nuestras necesidades:
tTr
: realizar seguimiento de tensor (contracción de red de tensor),Transpose
: reorganizar las patas del tensor,Flatten
: agrupar patas tensoras,ArrayReshape
: dividir las patas del tensor (en realidad, se puede usar para remodelar el tensor en cualquier forma que desee).Puede crear un paquete RG de tensor sobre estas cuatro funciones con el solucionador SVD proporcionado por SingularValueDecomposition
.
qmecanico
Norberto Schuch