<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Ejemplo 4. Valores y vectores propios
Si el tensor de esfuerzos en un punto $P$, en el sistema de referencia $X,Y,Z$ está definidido por
Step1:  Solución
Step2:  Resolviendo vía polinomio característico
Step3:  Resolviendo vía librerías python con linalg.eig podemos encontrar valores (la) y direcciones principales (n) simultaneamente
Step4:  De esta manera escribamos en tensor asociado a las direcciones principales
Step5:  Los vectores $i'$, $j'$ y $k'$ están dados por
Step6:  Verifiquemos que se cumplen los invariantes en el tensor asociado a direcciones principales
Step7:  Para terminar se debe de tener en cuenta que las direcciones principales no son otra cosa que la matriz de cosenos directores que transformaría el tensor original al tensor en direcciones principales mediante la ecuación de transformación
<ASSISTANT_TASK:>
Python Code:
from IPython.display import Image,Latex
#Image()
Image(filename='FIGURES/Sorigen.png',width=400)
Explanation: Ejemplo 4. Valores y vectores propios
Si el tensor de esfuerzos en un punto $P$, en el sistema de referencia $X,Y,Z$ está definidido por:
$$\begin{align}
\
&\sigma_{xx} = 200\dfrac{kgf}{cm^2}; \;\;\; \sigma_{yy} =0\dfrac{kgf}{cm^2}; \;\;\; \sigma_{zz} = 0\dfrac{kgf}{cm^2} \\
&\tau_{xy} = \tau_{yx} =100\dfrac{kgf}{cm^2}, \;\;\; \tau_{xz} = \tau_{zx} =300\dfrac{kgf}{cm^2}; \;\;\;\tau_{yz} = \tau_{zy} = 0 \dfrac{kgf}{cm^2}\\
\end{align}$$
Determine los valores y direccionees principales:
End of explanation
import numpy as np
from scipy import linalg
S = np.array([
    [200,100,300.],
    [100,0,0],
    [300,0,0]])
IS   = S[0,0]+S[1,1]+S[2,2]
IIS  = S[0,0]*S[1,1]+S[1,1]*S[2,2]+S[0,0]*S[2,2]-(S[0,1]**2)-(S[0,2]**2)-(S[1,2]**2)
IIIS = S[0,0]*S[1,1]*S[2,2]-S[0,0]*(S[1,2]**2)-S[1,1]*(S[0,2]**2)-S[2,2]*(S[0,1]**2)+2*S[1,2]*S[0,2]*S[0,1]
print
print 'Invariantes:', IS,IIS,IIIS
print 
Explanation: Solución:
Inicialmente encontremos los valores principales $(\lambda)$ a partir de la solución del polinomio característico: 
${\lambda ^3} - {I_\sigma}{\lambda ^2} + {II_\sigma}\lambda  - {III_\sigma} = 0$
Donde ${I_\sigma}$, ${II_\sigma}$ y ${III_\sigma}$ son los invariantes 1, 2 y 3 respectivamente que están dados por: 
${I_\sigma } = {\sigma {xx}} + {\sigma {yy}} + {\sigma _{zz}}$
${II_\sigma } = {\sigma {xx}}{\sigma {yy}} + {\sigma {xx}}{\sigma {zz}} + {\sigma {zz}}{\sigma {yy}} - \tau {xy}^2 - \tau {xz}^2 - \tau _{yz}^2$
${III_\sigma } = {\sigma {xx}}{\sigma {yy}}{\sigma {zz}} + 2{\tau {xy}}{\tau {xz}}{\tau {yz}} - {\sigma {xx}}\tau {yz}^2 - {\sigma {yy}}\tau {xz}^2 - {\sigma {zz}}\tau {xy}^2$
End of explanation
coeff=[1.0,-IS,IIS,-IIIS]
ps=np.roots(coeff)
print
print "Esfuerzos principales:", np.sort(np.round(ps,1))
print
Explanation: Resolviendo vía polinomio característico:
End of explanation
la, n= linalg.eigh(S)
la = la.real
print
print "Esfuerzos principales:", np.round(la,1)
print
#print S
print 
print 'n=', np.round(n,2)
print 
Explanation: Resolviendo vía librerías python con linalg.eig podemos encontrar valores (la) y direcciones principales (n) simultaneamente
End of explanation
print
Sp = np.array([
    [la[0],0,0],
    [0,la[1],0],
    [0,0,la[2]]])
print 'Sp =',np.round(Sp,1)
print
Image(filename='FIGURES/Sprinc.png',width=400)
Explanation: De esta manera escribamos en tensor asociado a las direcciones principales:
End of explanation
print "i'=", np.round(n[:,0],2)
print "j'=", np.round(n[:,1],2)
print "k'=", np.round(n[:,2],2)
print
Explanation: Los vectores $i'$, $j'$ y $k'$ están dados por:
End of explanation
IS  = Sp[0,0]+Sp[1,1]+Sp[2,2]
IIS  =Sp[0,0]*Sp[1,1]+Sp[1,1]*Sp[2,2]+Sp[0,0]*Sp[2,2]-(Sp[0,1]**2)-(Sp[0,2]**2)-(Sp[1,2]**2)
IIIS =Sp[0,0]*Sp[1,1]*Sp[2,2]-Sp[0,0]*(Sp[1,2]**2)-Sp[1,1]*(Sp[0,2]**2)-Sp[2,2]*(Sp[0,1]**2)+2*Sp[1,2]*Sp[0,2]*Sp[0,1]
print
print 'Invariantes:', IS,IIS,IIIS
print
Explanation: Verifiquemos que se cumplen los invariantes en el tensor asociado a direcciones principales:
End of explanation
C = n.T
Sp2 = np.dot(np.dot(C,S),C.T)
print
print 'Sp =', np.round(Sp2,1)
from IPython.core.display import HTML
def css_styling():
    styles = open('./custom_barba.css', 'r').read()
    return HTML(styles)
css_styling()
Explanation: Para terminar se debe de tener en cuenta que las direcciones principales no son otra cosa que la matriz de cosenos directores que transformaría el tensor original al tensor en direcciones principales mediante la ecuación de transformación: 
\begin{align}
&[\sigma']=[C][\sigma][C]^T\
\end{align}
Teniendo en cuenta que n es dado por vectores columna entonces la matriz de cosenos directores está dada por:
\begin{align}
&[C] = [n]^T
\end{align}
End of explanation
<END_TASK>