PROJET
PROJET
PROJET
Projet de physique
numérique
Programmation Python (PyCharm Community)
Préparé par :
-HAMZA EL ATIQY
Encadré par :
-Mostafa Elmallahi
1. Recherche des zéros d’une fonction
La recherche des zéros d'une fonction réelle à variable réelle est une occupation fort prenante en
analyse numérique et donc en physique numérique. Rappelons que l'on appelle "zéro" d'une
fonction, ou encore "racine", la(les) solution(s) de l'équation f(x) = 0.
Il y a plusieurs méthodes de Recherche des zéros d’une fonction on donner deux méthodes très
classiques avec des exemples de programmation en Python.
1.1-Méthode de dichotomie
Une dichotomie permet de trouver rapidement une valeur approchée de x telle que f (x) = 0, Le principe
est simple nous avons obtenu un intervalle de longueur moitié dans lequel l’équation (f (x) = 0) admet
une solution. On itère alors le procédé pour diviser de nouveau l’intervalle en deux.
Méthode
2. évaluer la fonction en a+ b 2
3. si f*(a + b/ 2) a le même signe que f(a), remplacer a par a+ b/ 2, sinon remplacer b par a+ b/ 2
4. aller en 2 avec le nouveau couple de valeurs (a, b) jusqu'à ce que la différence entre a et b soit inférieure
à la précision voulue.
if fc==0:
return c
if fa*fc > 0:
a=c
fa=fc
if fb * fc > 0:
b = c
fb = fc
return c
2|Page
a=1
b=5
x= dichotomie(func,a,b)
print("solution found:{}".format(x))
Un petit programme écrit en Python qui permet de calculer le zéro d'une fonction notée f(x)f(x) par la méthode
de Newton à partir de la suite suivante : xk+1= xk – f(xk)/f′(xk)
import numpy as np
import matplotlib.pyplot as plt
def ma_fonction(x):
y = x*x + 3*x - 5
return (y)
def ma_derivee(x):
y = 2*x + 3
return (y)
def NewtonsMethod( x, epsilon=0.000001):
n = 0
dif = 2 * epsilon
while dif > epsilon :
x1 = x - ma_fonction(x) / ma_derivee(x)
dif = abs(x1 - x)
x = x1
n = n+1
return (x, n)
# Programme principal
x = float(input("Quelle est la valeur de départ ? : "))
(x,n) = NewtonsMethod(x)
print('x=%f n=%d' % (x, n) )
tab_x = np.linspace(-6,6,100)
tab_y = ma_fonction(tab_x)
plt.figure()
plt.plot(tab_x,tab_y, color='red')
plt.grid()
plt.show()
3|Page
2.Calcul formels, et représentation des nombres, des vecteurs, des matrices,
dans un ordinateur
2.1 Calcul formels ou symbolique :
Le calcul formel manipule des entités mathématiques de manière exacte. Tous les objets manipulés DOIVENT
ainsi être construits/décrits de manière finie.
Résolution d’équations, factorisation, simplification d’expressions contenant des variables ; les réécrire.
Calcul symbolique dans des structures algébriques (groupes, anneaux, corps…). Plus généralement, travailler
sur des expressions de façon symbolique (plutôt que numérique).
SageMath : rassemble un certain nombre de systèmes de calcul symbolique au sein d’une interface standardisée
avec un gros noyau
SymPy : est un module Python. Son intérêt est d’être léger et de fonctionner sur tout système capable d’exécuter
Python. Il utilise NumPy pour le calcul numérique et Matplotlib pour le graphisme. On privilégiera l’utilisation des
feuilles de calcul fournies par Jupyter.
Pour pouvoir représenter les nombres négatifs, on doit changer la convention et l’on prend le complément à
deux, qui consiste `à remplacer les 1 par des 0, et inversement, puis ajouter 1 au résultat ; soit, toujours sur
un octet : 00000001 = 1 et 11111111 = −1.
si on entre :
a=3
print(type(a))
b=3.14
print(type(b))
c=int(b)
print(c)
4|Page
output :
<class 'int'>
<class 'float'>
3
On constate que Python sait que a est entier, que b ne l'est pas, et que c peut être entier bien qu'obtenu à partir
de b (qui est réel).
Ou, pour plus de lisibilité (un passage à la ligne est possible entre les éléments d’une liste) :
A = [[2., 2, -3],
[-2, -1, 1],
[4, 1, 1]]
La création d’un tableau de n lignes par m colonnes peut être réalisé avec les fonctions :
Noter que ces fonctions ne prennent qu’un seul argument. Les différentes dimensions sont spécifiées par un objet
itérable, liste ou tuple, comme dans ces exemples.
5|Page
Pour la définition de la matrice A , on utilise une conversion à partir d’une liste de lignes :
A = np.array([[2., 2, -3],
[-2, -1, 1],
[4, 1, 1]])
Un tableau unidimensionnel ne distingue pas un vecteur ligne d’un vecteur colonne. La transposée d’un
tableau unidimensionnel retourne le même vecteur.
Les tableaux bidimensionnels permettent de distinguer les vecteurs lignes des vecteurs colonnes. La transposée d’un
vecteur ligne retourne un vecteur colonne et réciproquement.
6|Page
3-Calcul des intégrales, Calcul des dérivés, Résolution équation différentielles
a.Calcul des intégrales :
Calcul approché d'intégrale d'une fonction entre les abscisses x1 et x2. utilisant les méthodes des
rectangles.
import math
import numpy as np
import matplotlib.pyplot as plt
def ma_fonction(x):
y = x*x + 3*x -5
return(y)
return(I)
x1 = float(input("Quelle est la valeur de x1 "))
x2 = float(input("Quelle est la valeur de x2 "))
dx = abs(x2-x1)/10000
I = calcul_integrale(x1, x2, dx)
tab_x = np.linspace(x1,x2,10)
tab_y = ma_fonction(tab_x)
plt.figure()
plt.plot(tab_x,tab_y, color='red', marker='o', markeredgecolor='b')
mon_titre = 'I entre %.1f et %.1f est égale à %.2f' % (x1, x2, I)
plt.title(mon_titre)
plt.show()
Pour calculer la dérivée première, deuxième ou troisième d'une fonction f(x) avec le langage
python, nous utilisons la fonction diff() de la bibliothèque sympy.
Exemple de calcul
Exemple 1 (dérivée première)
import sympy as sp
x = sp.Symbol('x')
y = x**2 + 1
sp.diff(y,x)
import sympy as sp
x = sp.Symbol('x')
y = x**2
sp.diff(y,x,x)
import sympy as sp
x = sp.Symbol('x')
y = x**2 +4x
sp.diff(y,x,3)
Commençons simplement par une équation de la forme y ′= a*y comme on peut croiser en étudiant la
radioactivité par exemple.
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
# On précise notre constante
a=-0.1
# On crée la liste des temps : 1000 points entre t=0 et t=50.
# Plus on met de points plus la résolution sera précise
temps = np.linspace(0, 50,1000)
# L'équation différentielle sous forme de fonction :
def equation(Y,temps):
return a*Y
#On résout notre équation différentielle et on récupère la liste des résultats
Y=odeint(equation, [10], temps)
8|Page
#On affiche le résultat des Y en fonction du temps
plt.plot(temps,Y)
# On montre le résultat
plt.show()
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
a=-1
temps = np.linspace(0, 50,1000)
# L'équation différentielle sous forme de fonction
def equation(Y,temps):
# On décompose notre Y en (y,dy) :
(y,dy)=Y
# On renvoie ce que vaut Y' :
return [dy,a*y]
# Pour que odeint renvoit séparément les valeurs de Y et de Y', il faut rajouter.T à la fin
Y,dY=odeint(equation, [1,0], temps).T
plt.plot(temps,Y)
plt.show()
4.1-Echantillonnages .
- Principe
Pour enregistre un signal dans un format numérique, on mesure ses valeurs sur une grille de
points [ti] avec i∈[0,N−1], c’est l’échantillonnage. On enregistre donc N valeurs. Une grande
quantité d’information est donc perdue par ce procédé. On définit aussi la fréquence
d’échantillonnage:
Dans l’exemple ci-dessous, les pastilles rouges représentent les points pour lesquelles les valeurs
du signal réel sont enregistrées. On remarque les pastilles rouges décrivent bien la forme du signal
réel, l’échantillonnage est donc réussi.
import numpy as np
import matplotlib.pyplot as plt
# Signal
T = 1.
def signal(t): return np.sin(2. * np.pi * t / T)
# Echantillonnage
D = 2. # Duree d'observation
fe = 10. # Frequence d'echantillonnage
N = int(D * fe) + 1 # Nombre de points enregistres
9|Page
te = np.linspace(0., (N-1)/fe, N) # Grille d'echantillonnage
tp = np.linspace(0., D, 1000) # Grille plus fine pour tracer l'allure du signal parfait
# Trace du signal
plt.plot(te, signal(te), 'or-', label = u"Signal echantillonne")
plt.plot(tp, signal(tp), 'b--', label = u"Signal reel")
plt.grid()
plt.xlabel("Temps $t$")
plt.ylabel("Amplitude $x(t)$")
plt.legend()
plt.show()
4.2-interpolation.
L'interpolation est un processus par lequel des « lacunes » dans un ensemble de données peuvent être
comblées à l'aide d'équations relativement simples. L'interpolation diffère de l'ajustement en ce que :
Des interpolations sont nécessaires pour atteindre exactement tous les points de données, tandis
que les ajustements peuvent ne toucher aucun des points de données,
Les interpolations sont basées sur des formules mathématiques, souvent simples, sans tenir compte
du système sous-jacent qui a produit les données.
Plusieurs méthodes d'interpolation définissent sous formes de classes il est possible d'utiliser des
interpolations linéaires ou cubiques
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
10 | P a g e
plt.savefig('InterpolationPython.png')
plt.show()
La méthode des moindres carrés permet de comparer des données expérimentales, généralement
entachées d’erreurs de mesure à un modèle mathématique censé décrire ces données.
11 | P a g e
# mesures
x = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
y = array([0, 9, 19, 29, 41, 50, 62, 69, 83, 95, 101, 109, 119, 130, 142, 149])
# calcul des coefficients a et b
coeff = CalculCoefficients(x, y)
# tracé de la courbe de regression
TraceRegressionLineaire(x, y, coeff)
print("Coefficients de regression : \a = {} \b = {}".format(coeff[0], coeff[1]))
import numpy as np
import matplotlib.pyplot as plt
# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
12 | P a g e
5.3-dérivée locale d’une courbe expérimentale
nbx = 101
x = np.linspace(0, 10, nbx)
y = np.cos(x)
plt.plot(x, y, label="f(x)")
plt.plot(xnew, yp, label="f'(x)")
plt.legend()
plt.show()
####Fonction de lissage
def lissage(Lx, Ly, p):
'''Fonction qui débruite une courbe par une moyenne glissante
sur 2P+1 points'''
13 | P a g e
Lxout = []
Lyout = []
for i in range(p, len(Lx) - p):
Lxout.append(Lx[i])
for i in range(p, len(Ly) - p):
val = 0
for k in range(2 * p):
val += Ly[i - p + k]
Lyout.append(val / 2 / p)
6-1 a*x + b = 0
solve(a*x+b=0,x);
-b/a
#est la résolution formelle de l’équation, alors que :
f = (a,b)->fsolve(a*x+b=0,x);
f = (a, b) → fsolve(a x + b = 0, x)
L’équation de Van der Waals introduit des termes correctifs dans l’équation des gaz parfait (PV= nRT) afin
de tenir compte les interactions autres que les simples chocs élastiques et le volume du gaz .
L’équation de Van der Waals s’écrit sous la forme :
# Calculation
P = N * R * T / (V * 10**5)
# Result
14 | P a g e
print ("(a)Pressure calculated using ideal gas equation = %.2f bar"%P)
a = 0.4233 #N * m**4 / mol**2
b = 3.73 * 10**-5 #m**3/mol
# (P+a/Vm^2) * (Vm - b) = RT
P1 = (R*T/(V/N - b)-a/(V/N)**2)/10**5
print ("(a)Pressure calculated using van der waals equation = %.2f bar"%P1)
L'aimantation spontanée d'une substance ferromagnétique, lorsque le champ magnétique extérieur est
nul, peut être décrit simplement par le modèle de Brillouin-Weiss.
Nous allons maintenant nous ramener au problème général de la recherche des zéros d'une expression
f(x) = 0
solve(tanh(Tc/T*M/Ms)=M/Ms,M)
# Maple ne sait pas répondre au question. Tentons donc une r´esolution numérique, en nous placant pour
simplifier dans un systéme d’unités dans lequel Ms = 1 et Tc = 1 :
f:=T->fsolve(tanh(M/T)=M,M)
plot(f,0..1)
# On obtient la solution nulle. . . C’est exactement comme lorsqu’on cherche `a résoudre un problème `a l’aid
de la m´méthode de la dichotomie ou Newton ! Reformulons alors le problème pour éliminer cette solution
nulle :
g:=T->fsolve(tanh(M/T)/M=1,M);
plot(g,0..1);
C'est mieux, mais on préfèrerait une solution positive ; imposons alors le domaine de recherche des solutions
(entre0 et 1) :
h:=T->fsolve(tanh(M/T)/M=1,M,0..1);
plot(h,0..1);
15 | P a g e
6.4-Le projectile
Le programme suivant sert à représenter la trajectoire d'un projectile lancé dans le vide, à une vitesse
initiale de 300 m/s et avec un angle initial de 45°.
from __future__ import division # on réalise un hack, pour éviter que 1/2==0
(division euclidienne) et obtenir plutôt 1/2==0.5
from sympy import symbols, S, pi, solve, sin, cos
from sympy.plotting import plot_parametric # on importe des éléments nécessaires au
programme
En modifiant légèrement le programme, on peut représenter 5 trajectoires différentes avec les mêmes
données initiales mais nous étudierons 5 angles différents dits complémentaires.
16 | P a g e
17 | P a g e