Professional Documents
Culture Documents
CS-exam2021-SP2 - Corrigé
CS-exam2021-SP2 - Corrigé
[ ]: import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
Exercice 1 : (8 points)
Dans cet exercice, on utilisera la classe Polynomial importée dans la cellule suivante :
1
f (x) =
1 + x2
par un polynôme de degré 2 en utilisant la méthode d’interpolation de Newton.
Soient trois points ( xi , yi )0≤i≤2 avec yi = f ( xi ), l’interpolation de ces points consiste à déterminer
le polynôme P ∈ R2 [ x ] dont la courbe représentative passe par ces points, autrement dit :
∀i ∈ {0, 1, 2} P ( xi ) = yi
1
On rappelle que l’expression du polynôme d’interpolation P se détermine en utilisant la méthode
de Newton comme suit :
2
P( x ) = ∑ β i ωi ( x )
i =0
[ ]:
def baseNewton(X):
w0=Polynomial([1])
w1=Polynomial([-X[0],1])
w2=Polynomial([X[0]*X[1],-(X[0]+X[1]),1])
# pour w2 on peut utiliser la multiplication de deux polynômes
w=[w0,w1,w2]
return w
2
[ ]:
def polynomeNewton(X,Beta):
p=Polynomial([0])
n=len(X)
N=baseNewton(X)
for i in np.arange(0,n):
produit=Beta[i]*N[i]
p+=produit
return p
b) Sachant que les coefficients de Newton sont égaux à β 0 = 0.2, β 1 = 0.3 et β 2 = 0.1,
déterminer l’expression du polynôme d’interpolation de Newton aux points d’abscisses
−2, −1 et 0.(2 points)
[ ]: X=[-2,-1,0]
Beta=[0.2,0.3,0.1]
p=polynomeNewton(X,Beta)
print(p) # p
P( x ) = 1 + 0.6x + 0.1x2
[ ]:
f= lambda x: 1/(1+x**2)
E=abs(p(0.5)-f(0.5))
E
1
L’erreur d’interpolation au point x = 2 vaut 0.5250
d) (1,5 points): En évaluant sur [-2,1] la fonction f et le polynôme P en 100 points, com-
pléter le script ci-dessous qui permet de tracer dans une même figure :
– La courbe de f en bleu.
– La courbe de P en rouge.
– Les points d’interpolation (−2, f (−2)), (−1, f (−1)) et (0, f (0)).
[ ]: Y=[f(-2),f(-1),f(0)]
t=np.linspace(-2,1,100)
plt.plot(t,f(t),'b',t,p(t),'r',X,Y,'*')
plt.xlabel('axe des abscisses')
plt.ylabel('axe des ordonnées')
plt.legend(('f','P','points d'interpolation'))
3
plt.title('Interpolation de Newton')
où
• n est le nombre de sous-intervalles de la subdivision uniforme de [ a, b],
b−a
• h= est le pas de la discrétisation de l’intervalle [ a, b],
n
• xk = a + kh , pour k ∈ {0, · · · , n}, désignent les points d’intégration,
• mk = a + (k + 21 )h , pour k ∈ {0, · · · , n − 1}, désignent les points milieux,
• f 0 ( a) et f 0 (b) sont les valeurs de la dérivée de la fonction f aux points x = a et x = b
respectivement.
1. Écrire une fonction nommée formulecomposite(f,df,a,b,n) prenant en entrée f une fonc-
tion de classe C1 sur l’intervalle [a,b], df la dérivée de f et n le nombre de sous-intervalles
à considérer, et qui retourne la valeur approchée Qn (f) de I (f).(2 points)
[ ]:
def formulecomposite(f,df,a,b,n):
h=(b-a)/n
Q= 14*(f(a)+f(b)) + h*(df(a)-df(b))
for k in range(1,n):
Q+= 28*f(a+k*h)
for k in range(0,n):
Q+= 32*f(a+(k+0.5)*h)
return (h/60)*Q
4
On considère dans la suite la fonction f définie sur [−1, 0] par
f ( x ) = cos(2x )e− x .
2. a) En utilisant une fonction pré-définie dans le module sympy, donner les instructions per-
Z 0
mettant de calculer la valeur numérique de I ( f ) = f ( x )dx.(1,5 points)
−1
[ ]:
x=sp.symbols('x')
f=lambda x:sp.cos(2*x)*sp.exp(-x)
#ou f= sp.Lambda(x, sp.cos(2*x)*sp.exp(-x) )
a=-1
b=0
I=sp.integrate(f(x) ,(x,a,b) ).evalf()
print(I)
Résultat :
b) En utilisant une fonction pré-définie dans le module sympy, donner les instructions qui
permettent de déterminer l’expression de la dérivée de f et de calculer f 0 (−1) et f 0 (0).
(1,5 points)
[ ]:
df=sp.Lambda(x,sp.diff(f(x),x)) # expression symbolique de f'
a=-1
b=0
print(df)
print(df(a).evalf())
print(df(b).evalf())
Résultats :
5
c) Calculer l’erreur d’intégration EQ ( f ) de la formule composite Q30 ( f ) (n = 30).(1 point)
EQ=np.abs(formulecomposite(f,df,a,b,30).evalf()-I)
print('E_Q(f)=',EQ)
[ ]:
def nombreintervalles(f,df,a,b,epsilon):
n=1
E=np.abs(formulecomposite(f,df,a,b,n).evalf()-I)
while E > epsilon:
n+=1
E=np.abs(formulecomposite(f,df,a,b,n).evalf()-I)
return n
b) Compléter le code suivant qui permet de tracer le nombre de sous intervalles n en fonc-
tion de la tolérance epsilon, en considérant epsilon ∈ {10−3 , 10−5 , 10−7 , 10−9 }.(1,5
points)
6
[ ]: NQ=[]
epsilon = (1/10)**np.arange(3,10,2)
for eps in epsilon:
NQ.append(nombreintervalles(f,df,a,b,eps))
plt.grid(True)
plt.plot(epsilon,NQ,'ro-')
plt.xlabel('epsilon ')
plt.xscale('log')
plt.ylabel('Nombre de sous intervalles')
plt.title('Nombre de sous intervalles en fonction de epsilon')
h∗ = (b − a)/n = 1/3
[ ]: def erreurquadrature(a,b,n,k):
x=sp.symbols('x')
P=lambda x: x**k
dP=sp.Lambda(x,sp.diff(P(x),x))
I1=sp.integrate( P(x) ,(x,a,b) ).evalf()
I2=formulecomposite(P,dP,a,b,n).evalf()
Erreur=np.abs(I1-I2)
return Erreur
7
b) Compléter les pointillés de la fonction nommée degréprécision(a,b,n) prenant en
entrée a et b les deux extrémités de l’intervalle [a,b] et n le nombre de sous-intervalles
de discrétisation, et qui retourne le degré de précision de Qn ( f ).(1 point)
[ ]: def degréprécision(a,b,n):
k=0
Erreur=erreurquadrature(a,b,n,k)
while Erreur ==0 :
k=k+1
Erreur=erreurquadrature(a,b,n,k)
return k-1 # c'est le degré de précision d