You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.7 KiB
128 lines
4.7 KiB
import numpy as np
|
|
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
|
|
|
|
def stop_ici():
|
|
input()
|
|
exit()
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
|
|
|
|
def TODO():
|
|
print("à vous!")
|
|
stop_ici()
|
|
|
|
|
|
#################################################################################################
|
|
###
|
|
### EXERCICE 1 : Résolution de systèmes linéaires avec Numpy
|
|
###
|
|
#################################################################################################
|
|
|
|
|
|
print("Bonjour et bonne année ! Pour ce TP vous aurez également besoin d'une feuille et d'un stylo.")
|
|
print("Merci à vous aussi !!! Ah, il va donc falloir que je le sorte de mon sac ?!?!? Vous vous rendez ompte de cet effort productif !!!")
|
|
|
|
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
print("-"*80)
|
|
|
|
print("Veuillez s'il-vous-plaît compléter et signer le texte suivant.")
|
|
|
|
declaration = '''
|
|
Je déclare par la présente disposer d'une feuille et d'un stylo, et décharger mon enseignant de math de toute incompréhension relative à l'absence de l'un ou l'autre de ces deux objets.
|
|
|
|
Fait à Aubière le XX/XX [dater] en un exemplaire, et signé par l'étudiant.e
|
|
XXX [signature]
|
|
'''
|
|
|
|
print(declaration)
|
|
|
|
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
print("Merci, j'en prends bonne note :)")
|
|
print("-"*80)
|
|
|
|
|
|
# Numpy permet de résoudre des systèmes linéaires, par exemple en calculant des MATRICES INVERSES.
|
|
|
|
A = np.array( [ [1,-4,2] , [3,3,6] , [-2,-1,0] ] )
|
|
M = np.linalg.inv(A) # nota : "linalg" signifie "algèbre linéaire" (le vrai nom de la théorie des matrices)
|
|
print("A=\n",A)
|
|
print("M=\n",M)
|
|
|
|
# Vérification :
|
|
print("A*M=\n",A.dot(M))
|
|
print("M*A=\n",M.dot(A))
|
|
|
|
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
print("-"*80)
|
|
|
|
|
|
# Des agriculteurs conditionnent leurs légumes sous la forme de quatre "paniers" destinés à différentes préparations culinaires.
|
|
# Voici les contenus de chaque panier :
|
|
|
|
# Panier : "Pot-au-feu" "Potée" "Boeuf bourguignon" "Chou farci"
|
|
# Patates (kg) 0 1 2 0
|
|
# Chou (unités) 0 0.5 0 1
|
|
# Carottes (kg) 1 1 1 0
|
|
# Oignons (kg) 0.25 0.25 0.25 0.25
|
|
|
|
# Question : Les agriculteurs ont récolté 540 kg de patates, 220 choux, 340 kg de carottes et 130 kg d'oignons. Afin d'écouler toute leur production, combien doivent-ils préparer de panier de chaque type ?
|
|
|
|
print('''(Question papier) Montrez que le problème des agriculteurs constitue un système linéaire, de la forme
|
|
A * v = b
|
|
où
|
|
A est la matrice des coefficients
|
|
b est le vecteur du second membre
|
|
v est le vecteur des inconnues
|
|
|
|
Précisez le contenu de la matrice A et du vecteur b''')
|
|
|
|
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
print("-"*80)
|
|
|
|
# On va à présent résoudre ce système avec Numpy.
|
|
|
|
print("Rentrez les paramètres du système linéaire (A et b), sous forme de np.array")
|
|
A = np.array( [ [0 , 1, 2, 0] , [0, 0.5, 0, 1] , [1, 1, 1, 0] , [0.25, 0.25, 0.25, 0.25]] )
|
|
b = np.array( [ [540] , [220] , [340] , [130]] )
|
|
print("A=\n",A)
|
|
print("b=\n",b.reshape(-1,1))
|
|
|
|
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
|
|
|
|
# --------------------------------------------------------------------------------------
|
|
print("-"*80)
|
|
|
|
print("Trouvez avec Numpy la solution du système.")
|
|
|
|
v = np.linalg.inv(A).dot(b) # .dot() est le produit matriciel
|
|
print("v=\n",v.reshape(-1,1))
|
|
|
|
# Vérification:
|
|
if not np.allclose (A.dot(v), b):
|
|
print('Erreur, v n''est la solution du système A*v=b')
|
|
|
|
# stop_ici()
|
|
|
|
print(f'''Conclusion : les agriculteurs doivent préparer:
|
|
{v[0]} paniers \"pot-au-feu\"
|
|
{v[1]} paniers \"potée\"
|
|
{v[2]} paniers \"boeuf bourguignon\"
|
|
{v[3]} paniers \"chou farci\"''')
|
|
|
|
|
|
# Voilà pour la mise en jambes !
|
|
# Pour la suite, retenez bien comment on résout un système linéaire avec Numpy.
|
|
|