# -*- coding: utf-8 -*-
"""
Created on Sat Mar 22 11:30:29 2014

@author: dconduche
"""

"""TP Gauss"""

import numpy as np

"""Les exercices de la partie 1 doivent plutôt être traités dans l'interpreteur.
(flèche du haut pour remonter dans l'historique)"""

"""Exercice 1"""

A=np.array([[3,0,-2],[1,0,4],[0,1,3.]]) #Le '.' est là pour avoir un type float
print('Question 1')
print('A = ')
print(A)
print('bloc {0,1} x {1,2} : ')
print(A[0:2,1:3])
 #On s'arrête à i-1, comme dans range(n), et les extrêmités peuvent être exclues :
print('\n')
print(str(A[:2,1:])+' (syntaxe [:2,1:])')

print('A>2 : ')
print(A>2)
print('A[A>2] : ')
print(A[A>2])
print(type(A[A>2])) #non demandé : testez ce qui vous fait envie, essayez de répondre par des tests aux questions que vous vous posez.

print('\n Question 2')
print('taille : '+str(np.size(A)))
print('forme : '+str(np.shape(A)))
print('colonne du milieu :')
B=A[:,1]
print('B = '+str(B))
print('taille : '+str(np.size(B)))
print('forme : '+str(np.shape(B)))
   #La forme est un tuple, toujours. Ici c'est un 1-uplet. 
   #Comme la notation (3) serait indistinguable d'un trois entre parenthèse (formule au résultat de type int), 
   #python utilise la *notation* (3,).


print('\n Question 3')
B=np.zeros((4,6))
B[0:3,0:3]=A #ou A[:3,:3]
B[1:4,3:6]=A #ou A[1:,3:]
print(B)


print('\n Question 4')
Abis=A
Abibis=A[:]
Acop=np.copy(A)
def Affiche(): #affiche les variables globale A, Abis, Abibis et Acop. Dupliquer du code, c'est MAL
    print('A     =A     =A[:]     =np.copy(A)')
    print(A)
    print(Abis)
    print(Abibis)
    print(Acop)
    print('---------------------')
Affiche()
A[1,2]=99
Affiche()
   #seul np.copy(A) ne change pas : le comportement n'est pas complètement celui des listes




"""Exercice 2"""
print('\n\n\n')
A=np.array([[2,2,-3],[-2,-1,-3],[6,4,4]])
Y=np.array([-14,21,4])

print('Question 1')
print('2A =')
print(2*A)
print('A² =')
print(np.dot(A,A))
print('I_3 =')
print(np.eye(3))
print('A+2I_3')
print(A+2*np.eye(3))
def ResolutionSys(A,Y):
    X=np.dot(np.linalg.inv(A),Y)
    print('Solution du système')
    print(X)
    print('Vérification : AX, puis Y')
    print(np.dot(A,X))
    print(Y)
    print('AX-Y :')
    print(np.dot(A,X)-Y)
ResolutionSys(A,Y)
   #Houston, we've got a problem. Ah non, ce sont des float : tout est malheureusement normal...



"""Exercice 3"""
print('\n\n\n')
A=np.array([[1.,1./4,1],[1.,1./3,2],[0,1,12]])
Y=np.array([0,0,1])
print(A)
ResolutionSys(A,Y)
print('Une résolution à la main nous montre, ici, qu\'il n\'y a (mathématiquement) pas de solution !')



"""Exercice 4"""
print('\n\n\n')
a=10**15
A=np.array([[1.,1+a,1],[1,1+a,2],[0,a,1]])
Y=np.array([1,0,0])
print(A)
ResolutionSys(A,Y)
print('solution théorique : (1+1/a,1/a,-1)')






