import scipy.optimize as resol
import numpy as np
import numpy.linalg as alg
precision_arrondis = 2

A=1/9*np.array([[13,-16,-6],[-11,-1,3],[-13,-20,24]])
print(np.round(alg.eig(A)[0], decimals=precision_arrondis))
B=1/25*np.array([[40,8,16],[40,-2,-4],[5,6,12]])
print(np.round(alg.eig(B)[0], decimals=precision_arrondis))

def f(x):
    X=np.array(x)
    X=X.reshape((3,3))
    Y=A.dot(X)-X.dot(B)
    return Y.reshape(9)

def eij(i, n):
    """Retourne le vecteur [0, 0, ..., 0, 1, 0, ...] avec un 1 en i-ème position."""
    return np.array([1 if i == j else 0 for j in range(n)])

def mat_f():
    """Retourne la matrice de f dans la base des (eij)."""

    return np.concatenate(l, axis=0).T

# Liste des images des vecteurs de la base (e_ij)
l = [np.array([f(eij(j, 9))]) for j in range(9)]
# Construction de la matrice de f dans la base des (e_ij)
m = np.concatenate(l, axis=0).T


print(f"Déterminant de m : {np.round(alg.det(m), decimals=precision_arrondis)}")
lambdas, vs = alg.eig(m)
print(f"Déterminant de vs : {np.round(alg.det(vs), decimals=precision_arrondis)}")
print(f"Valeurs propres de la matrice m : ", np.round(lambdas, decimals=precision_arrondis))
# Lecture de la colonne associée à la valeur propre 0
print(f"Colonne associée à la vp 0 : ", np.round(vs[:, 1], decimals=precision_arrondis))
print("Même colonne, comme une matrice : \n", np.round(vs[:, 1].reshape((3, 3)), decimals=precision_arrondis))
# print(np.round(m @ vs[:, 1], decimals=precision_arrondis))

X0=np.zeros(9)
X0[2]=1
sol=resol.root(f,X0)
Ya=(sol.x).reshape((3, 3))
print(np.round(Ya, decimals=precision_arrondis))

X0=np.ones(9)
sol=resol.root(f,X0)
Yb=(sol.x).reshape((3, 3))
print(np.round(Yb*Ya[0][0]/Yb[0][0], decimals=precision_arrondis))
