Gegeven de reƫle, vierkante en symmetrische matrix $$A$$, ($$N$$ rijen en $$N$$ kolommen). Het algoritme van Jacobi maakt het mogelijk (onder bepaalde, milde voorwaarden) de eigenwaarden en eigenvectoren van een dergelijke matrix te vinden, door toepassing van een reeks rotaties in $$N$$ dimensies. Elk van die rotaties, gekenmerkt door een rotatiematrix $$G_k$$ transformeert de matrix naar een nieuwe matrix $$G_k A G_k^T$$, met dezelfde eigenwaarden als de originele matrix. Deze getransformeerde matrix ligt dichter bij een diagonaalmatrix dan de niet-getransformeerde matrix. We passen deze procedure een vast aantal keer toe (dit is een argument van de te programmeren functie). De opeenvolgende rotatiematrices zijn dan $$G_0$$, $$G_1$$, ... De eigenwaarden zijn de diagonaalelementen van de matrix die je uiteindelijk bekomt, en de bijhorende eigenvectoren zijn de kolommen van de matrix $$G_0^T G_1^T G_2^T ... $$.

Schrijf de functie jacobi() met als argumenten de matrix $$A$$ (een NumPy-tabel met $$N$$ rijen en $$N$$ kolommen) en het aantal gewenste rotaties $$rot$$ met $$rot > 0$$ en geheel. Ga hierbij als volgt tewerk:

Het resultaat van de functie is een tuple, namelijk:

LET OP : het is NIET toegelaten om in deze oefening gebruik te maken van lijsten. De oplossing mag enkel gebruik maken van NumPy-rijen of tabellen.

Merk op dat je resultaat, ten behoeve van de evaluatie in Dodona, afgebroken wordt op 6 decimalen (de functie format_t() uit het verbeterscript zorgt hiervoor). Je resultaat wordt ook omgezet naar een lijst, maar let erop dat het resultaat van je functie WEL DEGELIJK een NumPy-tabel MOET zijn.

Voorbeeld

a = np.array([[1, 2, 3], [2, 0, -4], [3, -4, 5]])
b = jacobi(a, 5)
print(b[0]) #[-2.17620338  1.50802363  6.66817975]
print(b[1]) 
#[[ 0.8490197   0.52836119  0.        ]
# [-0.51026123  0.81993501 -0.25949963]
# [-0.13710953  0.2203203   0.96574321]]