Voor een reële, vierkante $$N \times N$$ matrix $$\mathbf{A}$$ definiëren we dat de reële, vierkante $$N \times N$$ matrix $$\mathbf{C}$$ een vierkantswortel van $$\mathbf{A}$$ is indien $$\mathbf{C}^2 = \mathbf{A}$$. In deze opdracht gaan we op zoek naar een dergelijke vierkantswortel, gebruik makend van een iteratief schema, namelijk
$$ \mathbf{Y}_0 = \mathbf{A} $$
$$ \mathbf{Z}_0 = \mathbf{I_N} $$
waarin $$\mathbf{I_N}$$ de $$N \times N$$ eenheidsmatrix voorstelt.

Voor $$k \gt 0$$:
$$ \mathbf{Y}_k = \frac{1}{2}(\mathbf{Y}_{k-1} + \mathbf{Z}_{k-1}^{-1}) $$
$$ \mathbf{Z}_k = \frac{1}{2}(\mathbf{Z}_{k-1} + \mathbf{Y}_{k-1}^{-1}) $$

Indien dit schema convergeert, dan convergeert $$\mathbf{Y_k}$$ naar een vierkantswortel uit $$\mathbf{A}$$. Schrijf een functie wortel() met als argumenten

De functie levert als resultaat de matrix $$\mathbf{Y_k}$$ zoals berekend via bovenstaand schema.

TIP: maak voor deze oefening o.a. gebruik van de functies uit de module np.linalg.

Voorbeeld

A = np.array([[ 2.80149813,  0.54307116, -0.20599251, -0.23220974],
 [ 1.47565543,  3.42509363, -0.40262172, -0.72659176],
 [ 1.20599251, -0.32771536,  2.67602996,  1.07116105],
 [-1.98127341,  0.78838951,  0.42509363,  1.09737828]])
C = wortel(A, 3)
print(C)
#[[ 1.64791585  0.15904161 -0.05520955 -0.06493405]
# [ 0.38273092  1.85084907 -0.09986797 -0.2300906 ]
# [ 0.48781352 -0.15470858  1.62012923  0.40301925]
# [-0.81562569  0.32728456  0.15588511  1.02807415]]