-> Les solutions proposées ne sont pas forcément les meilleures ! Elles peuvent même contenir des coquilles... C'est pourquoi je vous invite à m'envoyer un commentaire pour toutes suggestions, critiques ou autres.
De même, votre propre correction et vos erreurs sont les bienvenues ! (quelque soit la version Python utilisée ou le langage)


♣ Exercice M1 :
 L'exercice consiste à créer une fonction diagdom qui a pour paramètre une matrice C carrée et qui renvoie True si la matrice est à diagonale dominante, ou False dans le cas contraire. (ici False et True sont des booléens, pas une chaîne de caractères)


- une solution fonctionnant sous Python 3.4
Code copiable :
[Afficher]
def diagdom(C):
    n = C.shape[0]
    for i in range(n):
        sum = 0
        for j in range(n):
            if j != i:
                sum += abs(C[i][j])
        if abs(C[i][i]) < sum:
            return(False)
    return(True)
diagdomM1py34







L1. On commence la définition de la fonction diagdom de paramètre C.
L2. On récupère le nombre de lignes (ou de colonnes) de C à l'aide de la méthode shape qui renvoie le tuple suivant : (nombre de lignes, nombre de colonnes) dont on ne récupère que le premier terme.

Boucle For : L3. On parcourt les lignes caractérisées par leurs numéros i allant de 1 à n.
          L4. On initialise sum à 0 : il s'agira du terme de droite de l'inégalité (i fixé).
         
Boucle For : L5. On parcourt les colonnes caractérisées par leurs numéros allant de 1 à n.
                => Au final on parcourt les termes de la ligne i
                L6. S'il ne s'agit pas d'un terme de la diagonale, i.e. si j n'est pas égal à i (numéro de ligne différent du numéro de colonne),
                      L7. On rajoute à sum la valeur absolue de ce terme.
          L8. Ici, on conclut à propos de la vérification de l'inégalité pour une valeur de i. Si sum est supérieur à la valeur absolue du terme se positionnant à la fois sur la ligne i et sur la diagonale :
               L9. Alors l'inégalité n'est pas vérifiée pour ce i : la matrice C n'est donc pas à diagonale dominante. On renvoie False.

L10. Si on est arrivé ici, c'est qu'on n'a jamais renvoyé False et qu'on a vérifié l'inégalité pour tout i. Donc la matrice est à diagonale dominante. On renvoie True.




♣ Exercice M2 :
L'exercice consiste à créer une fonction exp non récursive qui a pour paramètres une matrice A carrée et un entier n et qui renvoie l'exponentielle de A à l'ordre n.
ATTENTION : La notation k est devenue n pour plus de simplicité.
Code copiable :
[Afficher]
import numpy as np

def exp(A,n):
    coef = 1
    matrice = np.eye(A.shape[0])
    sum = coef*matrice
    for k in range(1,n+1):
        coef = coef/k
        matrice=np.dot(matrice,A)
        sum += coef*matrice
    return(sum)
expM2py34

























♣ Exercice M4 :
L'exercice consiste à créer une fonction mult qui a pour paramètres deux matrices A et B et qui renvoie le produit matriciel AB (sans utiliser la fonction dot(A,B) qui renvoie déjà AB).

- une solution fonctionnant sous Python 3.4 :
Code copiable :
[Afficher]
import numpy as np

def mult(A,B):
        n,p = A.shape
        q = B.shape[1]
        C = np.zeros((n,q))
        for i in range(n):
            for j in range(q):
                c = 0
                for k in range(p):
                    c += A[i][k]*B[k][j]
                C[i,j] = c
        return(C)
multM4py34










L1. On importe numpy car cette bibliothèque nous servira à créer la matrice résultant du produit de A par B.

L3. On commence la définition de fonction en donnant un nom à la fonction et à ses deux paramètres.
        L4. On récupère le nombre de lignes n et de colonnes p de A à l'aide de la méthode shape qui renvoie le tuple (n,p).
        L5. On récupère le nombre de colonnes q de B.
        L6. On initialise la matrice résultant du produit de A par B à une matrice nulle à l'aide de la méthode zeros.
         ==> C est de taille n x q car elle résulte du produit d'une matrice de taille n x p et d'une matrice de taille p x q.
        Boucle For : L7. On caractérise les lignes de C par un numéro i. Pour tout i :
               Boucle ForL8. On caractérise les colonnes de C par un numéro j. Pour tout j :
                        L9. On initialise le terme i,j de c à 0.
                        Boucle For : L10. Pour tout k (nombre caractérisant le numéro de la colonne dans laquelle on se place dans A, et la ligne dans laquelle on se place dans B)
                                L11. On rajoute à c le terme i,k de A fois le terme k,j de B.


                        Fin Boucle For (sur k) L12. On place c en i,j dans C.
       Fin Boucle For (x2) L13. On renvoie la matrice C.


♣ Exercice M6 :
L'exercice consiste à créer une fonction pdtvecto qui a pour paramètres deux vecteurs X et Y à 3 coordonnées, et qui renvoie le produit vectoriel de X avec Y.

Code copiable :
[Afficher]

import numpy as np

def pdtvecto(X,Y):
    Z0 = X[1,0]*Y[2,0] - X[2,0]*Y[1,0]
    Z1 = X[2,0]*Y[0,0] - X[0,0]*Y[2,0]
    Z2 = X[0,0]*Y[1,0] - X[1,0]*Y[0,0]
    return( np.array([[Z0,Z1,Z2]]) )
   
A = np.array([[0],[1],[2]])
B = np.array([[3],[5],[6]])
print( pdtvecto(A,B))
M6py34
Attention Cette correction considère des vecteurs de type array( [ [a],[b],[c] ] ) de taille (3,1).
Attention aux indices !






♣ Exercice M7 :
Un chevalier et un martien vont au supermarché trois fois dans la semaine. Leurs nourrices voudraient savoir s'ils font attention aux prix.
A l'aide de la fonction np.linalg.solve, retrouve le prix de ce qu'ils ont acheté en connaissance de ce tableau (cf. énoncé).

Code copiable :
[Afficher]
import numpy as np

A = np.array([[1,3,2],[2,1,1],[5,2,3]])
B = np.array([[15],[19],[48]])

print(np.linalg.solve(A,B))

M7py34_vraiOn a une équation matricielle AX = B
avec A la matrice des nombres d'objets achetés à chaque fois, X leur prix individuel et B les dépenses totales.

np.linalg.solve(A,B) nous renvoie X, correspondant au vecteur colonne composé de 8,1 et 2.
Un sabre vaut donc 8€, un paquet de chips en vaut 1, et un paquet de craies en vaut 2.


♣ Exercice M8 :
Le tableau de l'énoncé donne la hauteur de pins blancs en fonction de leurs diamètres. Réécrivez ce tableau dans un objet numpy.array et affichez :
-    La hauteur moyenne,
-    Le diamètre moyen,
-    Le diamètre de l’arbre le plus grand.

Code copiable :
[Afficher]
import numpy as np

T = np.array([[127,119,135,132,130,130,110,75,110,124],
              [21.2,20.2,24.6,23,27.2,19.6,17.3,10,19.7,22.3]])

print("la hauteur moyenne est ", np.mean(T[0,:]))
print("le diamètre moyen est ", np.mean(T[1,:]))

i = np.argmax(T[0,:])
print("le diamètre de l'arbre le plus haut est ", T[1,i])
M8py34__vrai_vrai







L1. On importe numpy renommé np.

L3. On réécrit le tableau en un array, en gardant la même structure : la première ligne correspond encore à la hauteur et la seconde correspond encore au diamètre.
L6. On affiche à l'aide de la fonction print. La moyenne est faite à l'aide de la fonction mean.
Pour la hauteur moyenne on ne récupère que la première ligne, avec toutes les colonnes : T[0, :]
L7. Pour le diamètre moyen on ne récupère que la seconde ligne, avec toutes les colonnes : T[1, :]

L9. Pour le diamètre de l'arbre le plus haut, on commence par récupérer i qui est l'indice de la colonne où la hauteur est maximale, à l'aide de argmax(T[0, :]) avec T[0, :] car on ne s'intéresse qu'aux valeurs de hauteur.
L10. On affiche le diamètre se situant à l'indice i, donc T[1,i].