Outils pour utilisateurs

Outils du site


tp_capteur_actionneur2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
tp_capteur_actionneur2 [2019/10/11 19:37]
bvandepo [Exercice 4: Reconnaissance d'objets en fonction de leurs masses]
tp_capteur_actionneur2 [2019/10/15 18:29] (Version actuelle)
bvandepo
Ligne 326: Ligne 326:
  
 Solution: Solution:
-<file python ​ajustedroite.py>+<file python ​ajustedroite2.py>
 #​!/​usr/​bin/​python3 #​!/​usr/​bin/​python3
 #B. Vandeportaele 2019 #B. Vandeportaele 2019
Ligne 333: Ligne 333:
 from matplotlib.animation import FuncAnimation from matplotlib.animation import FuncAnimation
 import numpy as np import numpy as np
 +import math
 import threading import threading
 import random import random
Ligne 339: Ligne 340:
 #######################################​ #######################################​
 def mean(lst): def mean(lst):
-  ​return sum(lst) / len(lst) ​+    ​return sum(lst) / len(lst)
 #######################################​ #######################################​
 def cov(x,y): def cov(x,y):
 #​https://​euler.ac-versailles.fr/​baseeuler/​lexique/​notion.jsp?​id=26 #​https://​euler.ac-versailles.fr/​baseeuler/​lexique/​notion.jsp?​id=26
-  ​sumation=0 +    ​sumation=0 
-  for i in range(len(x)):​ +    for i in range(len(x)):​ 
-    sumation+= (x[i]-mean(x))*(y[i]-mean(y)) +        sumation+= (x[i]-mean(x))*(y[i]-mean(y)) 
-  return sumation/​len(x)+    return sumation/​len(x)
 #######################################​ #######################################​
 def var(x): def var(x):
 #​https://​euler.ac-versailles.fr/​baseeuler/​lexique/​notion.jsp?​id=5 ​ #​https://​euler.ac-versailles.fr/​baseeuler/​lexique/​notion.jsp?​id=5 ​
-  ​sumation=0 +    ​sumation=0 
-  for i in range(len(x)):​ +    for i in range(len(x)):​ 
-    sumation+= (x[i]-mean(x))*(x[i]-mean(x)) +        sumation+= (x[i]-mean(x))*(x[i]-mean(x)) 
-  return sumation/​len(x)+    return sumation/​len(x)
 #######################################​ #######################################​
 def calcRes(x,​y,​a,​b):​ #calcul des résidus def calcRes(x,​y,​a,​b):​ #calcul des résidus
-  ​res=[] +    ​res=[] 
-  for i in range(len(x)):​ +    for i in range(len(x)):​ 
-    res.append(a*x[i]+b-y[i]) +        res.append(a*x[i]+b-y[i]) 
-  return res+    return res
 #######################################​ #######################################​
 def sommecarres(r):​ #calcul de la fonction de coût def sommecarres(r):​ #calcul de la fonction de coût
-  ​sumation=0 +    ​sumation=0 
-  for i in range(len(r)):​ +    for i in range(len(r)):​ 
-    sumation+=r[i]*r[i] +        sumation+=r[i]*r[i] 
-  return sumation+    return sumation 
 +#######################################​ 
 +def ajusteMoindresCarres(x,​y):​ 
 +#ajustement au sens des moindres carrés 
 +#equation y=ax+b avec  
 +    a=cov(x,​y)/​var(x) 
 +    b=mean(y)-a*mean(x) 
 +#tests par calcul des résidus 
 +    r= calcRes(x,​y,​a,​b) 
 +    print(str(r) + ' cout: '​+str(sommecarres(r))) 
 +    return a,b 
 +#######################################​ 
 +def ajusteDeuxPoints(x,​y):​ 
 +#ajustement avec juste les 2 points aux extrémités sur l'axe x 
 +#equation y=ax+b avec 
 +    y1=min(y) 
 +    x1=x[y.index(y1)] 
 +    y2=max(y) 
 +    x2=x[y.index(y2)] 
 +    a=(y2-y1)/​(x2-x1) 
 +#y=ax+b -> b=y-ax 
 +    b=y2-(a*x2) 
 +#tests par calcul des résidus 
 +    r= calcRes(x,​y,​a,​b) 
 +    print(str(r) + ' cout: '​+str(sommecarres(r))) 
 +    return a,b 
 +#######################################​ 
 +def plotLigne(a,​b,​x,​y,​ style): 
 +#pour le tracé de la droite ajustée en débordant de 10% de chaque coté sur x 
 +    xmindroite=min(x)-0.1*(max(x)-min(x)) 
 +    xmaxdroite=max(x)+0.1*(max(x)-min(x)) 
 +    ymindroite=a*xmindroite+b 
 +    ymaxdroite=a*xmaxdroite+b 
 +    hLine, = plt.plot( [xmindroite,​xmaxdroite],​ [ymindroite,​ymaxdroite],​ style) 
 +    return hLine
 #######################################​ #######################################​
  
 +liste_masse=[163,​ 338, 443, 257, 826]
 +liste_mesure_brute=[-57424.65472636816,​ -77697.84547848991, ​ -88808.19317073171 , -68516.88800792865,​ -133962.87924528302 ]
  
-y=[163,​338,​443,​257,​826] +xsigma=[32.45747604625604,34.78471105389431,32.29135279848487,33.086251593304986,32.11445544434789] 
-x=[-57424.65472636816-77697.84547848991 ​-88808.19317073171 ​-68516.88800792865-133962.87924528302 ​]+x3sigma = [i * 3 for i in xsigma]
 '''​ '''​
 scotch ​                                        ​163gr ​                              nb mesures: ​ 1005 moyenne: ​ -57424.65472636816 ​ ecartType: ​ 32.45747604625604 ​                           ​ scotch ​                                        ​163gr ​                              nb mesures: ​ 1005 moyenne: ​ -57424.65472636816 ​ ecartType: ​ 32.45747604625604 ​                           ​
Ligne 378: Ligne 415:
 scotch + etain+agrapheuse ​                     826gr                               nb mesures: ​ 1060 moyenne: ​ -133962.87924528302 ​ ecartType: ​ 32.11445544434789 scotch + etain+agrapheuse ​                     826gr                               nb mesures: ​ 1060 moyenne: ​ -133962.87924528302 ​ ecartType: ​ 32.11445544434789
 '''​ '''​
-print(x) 
-print(y) 
  
-a=cov(x,y)/var(x+print(liste_mesure_brute
-b=mean(y)-a*mean(x)+print(liste_masse)
  
-print ('a: '+ str(a) +' b: '+ str(b)) 
  
-#equation y=ax+avec +a,b= ajusteMoindresCarres(liste_masse,​liste_mesure_brute) 
 +a2,b2= ajusteDeuxPoints(liste_masse,​liste_mesure_brute)
  
-#tests par calcul ​des résidus +#exit(0) 
-rcalcRes(x,y,a,b) +fig=plt.figure("​ajuste droite B. Vandeportaele 2019"​) 
-print(str(r) + ' ​cout: '+str(sommecarres(r)))+#prévoit de la place pour l'​affichage de la légende et des axes 
 +#​plt.gcf().subplots_adjust(top=0.85,​left=0.2) 
 +#######################################​ 
 +#affichage modèle "​Données brutes en sortie du capteur"​=f("​Grandeur physique mesurée"​) 
 +ax1=plt.subplot(211) 
 +#affichage des points d'​étalonnage 
 +points= plt.plot(00, '​rx'​) 
 +points.set_data( liste_masse,​liste_mesure_brute) 
 +points.axes.relim() 
 +points.axes.autoscale_view() 
 +#affichage des barres d'​erreur à 3 sigma sur les données 
 +errorsbar = plt.errorbar(liste_masse,​ liste_mesure_brute,​ yerr=x3sigma,​ uplims=True,​ lolims=True,​ linestyle='​None',​ label='​uplims=True,​ lolims=True'​) 
 +#affichage de la droite ajustée en bleu 
 +hLine = plotLigne(a, b, liste_masse,​ liste_mesure_brute,​ '​b-'​
 +#affichage de la droite ajustée en vert 
 +hLine2 = plotLigne(a2, b2, liste_masse,​ liste_mesure_brute,​ '​g-'​) 
 +plt.xlabel('​Grandeur physique mesurée'​) 
 +plt.ylabel('​Données brutes en sortie du capteur'​) 
 +chaine='​coefficients de la droite ajustée y=a.x+b\na='+"{0:4.5f}"​.format(a)+'​\nb='+"​{0:​4.5f}"​.format(b); 
 +#plt.text(xmindroite, (ymindroite+ymaxdroite)/2.0, chaine, ​        ​rotation=0 , ​        ​horizontalalignment='​left', ​        ​verticalalignment='​top', ​        ​multialignment='​center'​) 
 +plt.legend((points,​ errorsbar, hLine, hLine2), 
 +           ​('​points',​ '3 sigma',​ '​droite ajustée sur tous les points',​ '​droite ajustée sur deux points'​),​ 
 +           ​loc='​upper center',​ bbox_to_anchor=(0.5,​ 1.40), 
 +           ​ncol=2,​ fancybox=True,​ shadow=True) 
 +#######################################​ 
 +# affichage modèle "​Grandeur physique mesurée"​=f("​Données brutes en sortie du capteur"​) 
 +ax2=plt.subplot(212) 
 +#affichage des points d'​étalonnage 
 +points2, = plt.plot(0, 0, '​rx'​) 
 +points2.set_data(liste_mesure_brute,​ liste_masse) 
 +points2.axes.relim() 
 +points2.axes.autoscale_view() 
 +#affichage des barres d'​erreur à 3 sigma sur les données 
 +errorsbar = plt.errorbar(liste_mesure_brute,​ liste_masse, ​ xerr=x3sigma,​ uplims=True,​ lolims=True,​ linestyle='​None',​ label='​uplims=True,​ lolims=True'​) 
 +#affichage de la droite ajustée en bleu 
 +ai=1/a 
 +bi=-b/a 
 +hLine3 = plotLigne(ai,​ bi, liste_mesure_brute,​ liste_masse, ​ '​b-'​) 
 +plt.xlabel('​Données brutes en sortie du capteur'​) 
 +plt.ylabel('​Grandeur physique mesurée'​) 
 +chaine='​coefficients de la droite ajustée y=a.x+b\na='​+"​{0:​4.5f}"​.format(ai)+'​\nb='​+"​{0:​4.5f}"​.format(bi);
  
- 
-#ajustement en utilisant juste les 2 points les plus éloignés 
-y1=min(y) 
-x1=x[y.index(y1)] 
- 
-y2=max(y) 
-x2=x[y.index(y2)] 
- 
- 
-a=(y2-y1)/​(x2-x1) 
-#y=ax+b -> b=y-ax 
-b=y2-(a*x2) 
-print ('a: '+ str(a) +' b: '+ str(b)) 
-#tests par calcul des résidus 
-r= calcRes(x,​y,​a,​b) 
-print(str(r) + ' cout: '​+str(sommecarres(r))) 
- 
- 
- 
-exit(0) 
-fig=plt.figure("​ajuste droite B. Vandeportaele 2019") 
-hLine, = plt.plot(0, 0, '​r+'​) 
-hLine.set_data(x,​ y) 
-hLine.axes.relim() 
-hLine.axes.autoscale_view() 
 plt.show() plt.show()
 </​file>​ </​file>​
tp_capteur_actionneur2.1570815473.txt.gz · Dernière modification: 2019/10/11 19:37 par bvandepo