Correction 22
Correction 22
Correction 22
[ ]: import numpy as np
import matplotlib.pyplot as plt
3. à écrire que deux chiffres après la virgule pour tous résultats numériques trouvés.
Exercice 1 (9 points)
Soient n un entier strictement supérieur à 1 et F = {( xi , yi ) ∈ R2 , i ∈ [1, ..., n]} , un ensemble de n
observations. On souhaite chercher la droite qui ajuste au mieux les observations trouvées avec la
méthode algébrique. Cette droite prend la forme suivante
P(t) = a + bt
XY − X Y
b= 2
X2 − X
et
a = Y − bX
n n n n
∑ xi ∑ yi ∑ xi yi ∑ xi2
i =1 i =1 i =1 i =1
avec X = , Y= , XY = et X2 = .
n n n n
1
Partie 1 : Codage
1. Construire une fonction somme(x,y) prenant en entrée une liste x=[ x1 , ..., xn ] et une liste
y=[y1 , ..., yn ] , et qui renvoie les valeurs de X, Y, XY et X 2 notées respectivement sous python
xbar, ybar , xybar et x2bar. (2,5 points)
[ ]: def somme(x,y):
xbar=np.sum(x)/len(x) #len(x)=len(y) ou autre..........
ybar=np.sum(y)/len(y)
prod=0
x2=0
for k in np.arange(0,len(x)):
prod+=x[k]*y[k]
x2+=x[k]**2
xybar=prod/len(x)
x2bar=x2/len(x)
return xbar,ybar,xybar,x2bar
2
[ ]: def coefficient(xbar,ybar,xybar,x2bar):
b=(xybar-xbar*ybar)/(x2bar-xbar**2)
a=ybar-b*xbar
return a,b
Partie 2 : Application
Pour étudier les problèmes de malnutrition dans un pays pauvre, on a calculé le poids moyen par
âge d’un échantillon de 2400 enfants repartis uniformément en 12 classes d’âge. On a obtenu les
données suivantes :
âge (mois) 1 2 3 4 5 6 7 8 9 10 11 12
poids (Kg) 4,3 5,1 5,7 6,3 6,8 7,1 7,2 7,2 7,2 7,2 7,5 7,8
1. Un statisticien veut calculer par sa machine la droite au sens des moindres carrés pour ces
données qui représente le poids en fonction de l’âge.
a) Déclarer les variables de la fonction somme de ce problème de malnutrition.(1 point)
[ ]: # Instructions Python
x=np.arange(1,13)
y=[4.3,5.1,5.7,6.3,6.8,7.1,7.2,7.2,7.2,7.2,7.5,7.8]
b) En utilisant la fonction somme, donner les valeurs de xbar, ybar , xybar et x2bar.(1
point)
xbar =6.5
ybar =6.61
xybar=46.19
x2bar=54.16
c) Déduire l’équation de la droite au sens des moindres carrés du poids en fonction de
l’âge.(1,5 points)
[ ]: # Instruction(s) Python
# Méthode 1
coefficient(somme(x,y)[0],somme(x,y)[1],somme(x,y)[2],somme(x,y)[3])
# Méthode 2
xbar=somme(x,y)[0]
ybar=somme(x,y)[1]
xybar=somme(x,y)[2]
x2bar=somme(x,y)[3] # ou [-1]
coefficient(xbar,ybar,xybar,x2bar)
3
2. Donner une approximation du poids lorsque l’âge d’un enfant est 17.(1 point)
poids ≃ 9.42
3. Estimer l’âge de l’enfant lorsque son poids est 10,23.(0.5 point)
age=20,.. ≃ 20.
Exercice 2 ( 11 points)
L’évolution d’une population bactérienne dans un milieu de culture est décrite par le modèle
suivant
′ x (t)
( PC ) x ( t ) = r x ( t ) (1 − ), t ≥ 0
K
x (0) = x0 ,
avec
• t désigne le temps exprimé en heures,
• x (t) est l’effectif de la population bactérienne au temps t, donné en mg,
• r est le taux de croissance de la population (r > 0), donné en mg/h,
• K est le nombre de bactéries maximal que le milieu peut supporter, donné en mg,
• x0 est l’effectif initial (x0 >0), donné en mg.
La population étudiée a les caractéristiques suivantes
L’observation de l’évolution de l’effectif x (t) à chaque instant, nous amène à résoudre numérique-
ment le problème de cauchy ( PC ) par une méthode itérative décrite par le schéma ( MN ) suivant
p = x k + h f ( t k , x k ),
h
( MN ) x k +1 = x k + f (tk , xk ) + f (tk+1 , p) , ∀k ∈ {0, 1, ..., N − 1},
2
x (0) = x0 donnée
où
• N est le nombre de sous-intervalles de la subdivision uniforme de [t0 , t0 + T ] avec t0 est
l’instant initial et T > 0,
T
• h= est le pas de la discrétisation de l’intervalle [t0 , t0 + T ],
N
• tk = t0 + k h, pour k ∈ {0, 1, ..., N }, désigne les points de la discrétisation.
• f (t, x ) est le second membre du problème ( PC ),
• xk est la solution approchée de la solution exacte évaluée au point tk ( xk ≃ x (tk )).
4
1. a) Écrire une fonction nommée schema(f,x0,t0,T,N) qui prend en paramètres une fonc-
tion f, une valeur initiale x0, l’instant initial t0, T la longueur de l’intervalle [t0,
t0 + T], et N le nombre de sous-intervalles de [t0, t0 + T]. Cette fonction doit retourner
la liste des valeurs X= [ x0 , x1 , ..., x N ]. (2,5 points)
[ ]: def schema(f,x0,t0,T,N):
h=T/N
X=[x0]
for k in np.arange(0, N):
p=X[k]+h*f(t0+k*h,X[k])
X.append(X[k]+0.5*h*(f(t0+k*h,X[k])+f(t0+(k+1)*h,p)))
return X
b) On se place sur l’intervalle [0, 72]. Pour N = 180 et x0 = 40, déclarer la fonction f (t, x )
puis donner la valeur approchée de l’effectif de la population bactérienne à l’instant
t = 72.(1,5 points)
[ ]: # Instructions Python
r=0.2
K=100
t0=0
T=72
N=180
x0=40
f=lambda t, x: r*x*(1-x/K)
X=schema(f,x0,t0,T,N)
print('L'effectif de la population bactérienne à l'instant t=72 vaut
,→',X[-1])
x0 K
xex (t) = t ≥ 0.
x0 + (K − x0 )e−rt
5
[ ]: #Instructions Python
r=0.2
K=100
x0=40
xex = lambda t,x0 :(x0*K)/(x0+(K-x0)*np.exp(-r*t)) #0.75
t=72
print("L'erreur commise est ",abs(xex(t,x0)-X[-1])) #0.75
[ ]: def limite(X,t0,T,N):
k=0
h=T/N
while (k <N) and (np.abs(X[k+1]-X[k])>10**-3):
k=k+1
return t0+k*h
6
3. a) En utilisant la fonction schema(f,x0,t0,T,N), tracer sur un même graphe, les courbes
représentant l’évolution de la population bactérienne sur l’intervalle [0, 72] avec N=180
pour différentes valeurs de conditions initiales x0∈ {60, 80, 100, 120, 140}.(1,5 points)
[ ]: # Instructions Python
t0=0
T=72
N=180
# on pourra mettre t = np.linspace(t0, t0+T, N+1) ailleurs de la boucle
,→for
plt.figure(figsize=(20, 10))
M = [60,80,100,120,140]
plt.figure(figsize=(20,10))
for x0 in M:
X= schema(f,x0,t0,T,N)
t = np.linspace(t0, t0+T, N+1)
plt.plot(t, X, '*', label='Solution approchée (x0='+str(x0)+')')
plt.legend()