# +----------------------------------------------------+
# |                  Lekce 8 - demo 2                  |
# +----------------------------------------------------+
#  Linearni algebra - numpy
#   testik aplikace QR ortogonalizace
#   testik zpetne stability

import numpy as np

N=50

np.random.seed(3)
r=np.triu(np.random.rand(N,N))          #Nahodna horni trojuhelnik. matice
q=np.linalg.qr(np.random.rand(N,N))[0]  #Nahodna ortogonalni matice
a=np.dot(q,r)                           #A=QR definitoricky

q1, r1 = np.linalg.qr(a)                #Pokus rekonstruovat faktory QR 

#Vyhodnoceni rozdilu
print('Chyba Q=',np.amax(np.abs(q-q1)),np.linalg.norm(q-q1))
print('Chyba R=',np.amax(np.abs(r-r1)),np.linalg.norm(r-r1))
print('Chyba QR',np.amax(np.abs(a-np.dot(q1,r1))),np.linalg.norm(a-np.dot(q1,r1)))

#Testik s nahodnou perturbaci faktoru
#q2=q+1e-5*np.linalg.qr(np.random.rand(N,N))[0]
#r2=r+1e-5*np.triu(np.random.rand(N,N))
#print('Pres.soucin QR',np.amax(np.abs(a-np.dot(q,r))),np.linalg.norm(a-np.dot(q,r)))
#print('Perturb.soucin QR',np.amax(np.abs(a-np.dot(q2,r2))),np.linalg.norm(a-np.dot(q2,r2)))

