Regression linéaire / graphique

Regression linéaire / graphique

Messagede diox » 17 Juin 2020, 18:17

Bonjour à tous,

Je n'ai aucune expérience en python...
Je souhaite tracer le graphe sin(i1) en fonction de sin(i2) puis faire une modélisation linéaire. (loi de Snell Descartes)

Expérimentalement, j'ai des valeurs des angles i1 et i2 en degré. Dans le programme ci-dessous, j'ai converti ces angles en radian puis déterminer leur sinus. Je veux modéliser ce graphe par une droite, j'ai donc utiliser np.polyfit.

Seule l'avant dernière ligne ne marche pas : j'aimerai superposer graphiquement la modélisation et les valeurs expériementale. Pouvez vous m'aider ?

Merci beaucoup !

from lycee import *
from matplotlib import pyplot as plt
import numpy as np
i1=np.array ([10,20,30,40,50,60])
i2=np.array ([6.6,13.2,19.5,25.4,30.7,35.3])
i1rad = [ ]
i2rad = [ ]
sini1 = [ ]
sini2 = [ ]
for i in range (0,6) :
i1rad.append(np.pi*i1[i ]/180)
i2rad.append(np.pi*i2[i ]/180)
sini1.append(np.sin(i1rad[i ]))
sini2.append(np.sin(i2rad[i ]))
plt.axis([0,0.6,0,1])
plt.title('Loi de Snell Descartes')
plt.xlabel('sin(i2)')
plt.ylabel('sin(i1)')
plt.grid('true')
plt.plot(sini2, sini1,'ro')

a,b = np.polyfit(sini2, sini1,1)
plt.plot(sini2, a*sini2+b,'b-')
plt.show ( )
diox
 
Messages: 6
Inscription: 14 Mai 2016, 18:06
Académie: Versailles
Poste: Enseignant en Lycée

Re: Regression linéaire / graphique

Messagede gts2 » 17 Juin 2020, 18:56

Bonjour,

polyfit renvoie les valeurs de a et b sous forme d'un vecteur et non sous la forme de deux éléments

ab = np.polyfit(sini2, sini1,1)
#print(ab) donne [1.49747059e+00 7.38425059e-04]

#poly1d définit une fonction p (=a*x+b)
p = np.poly1d(ab)

plt.plot(sini2, p(sini2),'b-')

Remarque : chez moi pour avoir la grille :
plt.grid('on')
gts2
 
Messages: 331
Inscription: 19 Fév 2019, 10:49
Académie: Orléans-Tours
Poste: Enseignant en Classes préparatoires

Re: Regression linéaire / graphique

Messagede mathieu.lau » 17 Juin 2020, 19:41

bonjour,

j'ai juste changé l'avant-dernière ligne :
Code: Tout sélectionner
plt.plot(sini2, a*np.array(sini2)+b,'b-')


Laurent
téléchargement.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Mon premier livre : http://www.editions-ellipses.fr/product_info.php?products_id=11310 ou en raccourci http://tinyurl.com/y77mhb3x
Le deuxième (encore plus beau) : https://tinyurl.com/y2sfa8r7
mathieu.lau
 
Messages: 984
Inscription: 23 Aoû 2012, 11:11
Académie: REIMS
Poste: Enseignant en Lycée

Re: Regression linéaire / graphique

Messagede fredok » 17 Juin 2020, 20:27

Bonjour,
Je trouve dommage d'utiliser numpy puis faire une boucle avec des append()
Le plus simple serait :
Code: Tout sélectionner
import matplotlib.pyplot as plt
import numpy as np
sin = lambda x:np.sin(x/180*np.pi) # sinus en degré

i1=np.array([10,20,30,40,50,60])
i2=np.array([6.6,13.2,19.5,25.4,30.7,35.3])
plt.title('Loi de Snell Descartes')
plt.xlabel('sin(i2)')
plt.ylabel('sin(i1)')
plt.grid()
plt.plot(sin(i2), sin(i1),'ro')
p = np.polyfit(sin(i2), sin(i1),1)
model = np.poly1d(p,variable="sin(i2)")
plt.plot(sin(i2), model(sin(i2)),'b-')
print('sin(i2) = '+str(model))
plt.show( )
fredok
 
Messages: 48
Inscription: 05 Déc 2012, 13:49
Académie: Reims
Poste: Enseignant en Lycée

Re: Regression linéaire / graphique

Messagede diox » 18 Juin 2020, 07:53

Merci beaucoup pour toutes vos réponses !
diox
 
Messages: 6
Inscription: 14 Mai 2016, 18:06
Académie: Versailles
Poste: Enseignant en Lycée


Retourner vers Informatique et Numérique

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité