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.
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]]