#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 12 22:26:09 2022

@author: miham
"""

import numpy as np
from numpy import linalg as LA

#--- matrika
A = np.array(((
    ( 2., -1., -1.),
    (-1.,  2.,  1.),
    (-1.,  1.,  4.),
)))

#--- zacetni priblizek
x0 = np.array([2,0,0])

print("Norma vektorja x0: ",LA.norm(x0))

x0 = x0/LA.norm(x0)
a0=LA.norm(x0)
print("Norma renormiranega vektorja x0: ",a0)

Nmax=50
eps= 1E-8

y=np.copy(x0)
for i in range(1,Nmax):
    y=np.dot(A,y)
    a = LA.norm(y);
    print("Iteracija: ",i,", lastna vrednost: ",a)
    y = y/a
    if abs(a-a0)<eps:
        break
    a0=a
    
print("\n\n Najvecja lastna vrednost je: ",a.round(3), "pripadajoci lastni vektor pa: ",y.round(3))

#--- Poiscimo sedaj naslednjo lastno vrednost:
    
A2 = A-a*np.outer(y,y);
print("Nova matrika: \n",A2)

#---- Ponovimo postopek z A2
y=np.copy(x0)
a0=LA.norm(y)
for i in range(1,Nmax):
    y=np.dot(A2,y)
    a = LA.norm(y);
    print("Iteracija: ",i,", lastna vrednost: ",a)
    y = y/a
    if abs(a-a0)<eps:
        break
    a0=a
    
print("\n\n Druga lastna vrednost je: ",a.round(3), "pripadajoci lastni vektor pa: ",y.round(3))  


#--- Poiscimo sedaj zadnjo lastno vrednost:
    
A3 = A2-a*np.outer(y,y);
print("Nova matrika: \n",A3)

#---- Ponovimo postopek z A3
y=np.copy(x0)
a0=LA.norm(y)
for i in range(1,Nmax):
    y=np.dot(A3,y)
    a = LA.norm(y);
    print("Iteracija: ",i,", lastna vrednost: ",a)
    y = y/a
    if abs(a-a0)<eps:
        break
    a0=a
    
    
    
print("\n\n Tretja lastna vrednost je: ",a.round(3), "pripadajoci lastni vektor pa: ",y.round(3))    