Calcul Scientifique Important
Calcul Scientifique Important
Calcul Scientifique Important
L2 Parcours Spécial
TP 1 - Calcul Scientifique
In [1]:
%pylab inline
# %pylab inline est un équivalent de l'importation* de numpy et de matplotlib.py
plot
#%matplotlib inline
#from matplotlib.pyplot import *
#from numpy import *
#from scipy import *
Exercice 1 - Interpolation
1) On considère les abscisses et . Parmi les polynômes suivants, lequel est
le polynôme d'interpolation aux points (justifiez votre réponse) ?
Correction : On remarque que est de degré trop grand : le polynome recherché est de degré inférieur ou
égal à 3 (puisqu'il y a 4 points). Le polynome p_2 ne vaut pas 0 en 0. On vérifie que le polynome p3 convient
: il a bien un degré inférieur ou égal à 3 et .
2) Représentez sur une même figure les points d'interpolation, ainsi que les polynômes , et
respectivement en noir, vert et rouge, sur l'intervalle .
In [2]:
Xint=array([-2,0,1,2])
Yint=array([4,0,0,4])
x=linspace(-2.5,2.5,100)
p1=x**4-2.0/3*x**3-3*x**2+8.0/3*x
p2=4.0/3*x**2-4.0/3
p3=1.0/3*x**3+x**2-4.0/3*x
plot(x,p1,'black',x,p2,'g',x,p3,'r')
legend(['p1','p2','p3'])
plot(Xint,Yint,'o')
#on voit bien que p3 est le seul polynome dont le graphe passe par les 3 points
Out[2]:
[<matplotlib.lines.Line2D at 0x10daa8910>]
Exercice 2 - Calcul de polynômes d'interpolation
1) Calculez les polynômes d'interpolation aux points suivants :
ce qui nous donne . Méthode 2 : par la base de Lagrange : On sait d'après le cours que
le polynome s'écrit simplement dans la base de Lagrange et l'on
calcule les polynômes . On obtient :
d) et
Correction : Ici c'est plus simple puisqu'on voit à l'oeil que convient.
e) et
Correction : Ici c'est encore plus simple puisqu'on constate que convient.
2) Représentez graphiquement les polynômes des points a) et b), accompagnés des points d'interpolation
correspondants.
In [3]:
Xa=array([-1,2,3])
Ya=array([4,4,8])
Xd=array([-1,0,1])
Yd=array([1,0,1])
Xe=array([-3,-1,2,10])
Ye=Xe
x=linspace(-4,4,100)
P=2-x+x**2
Q=x**2
R=x
subplot(1,3,1)
plot(x,P,Xa,Ya,'o')
title('question a')
subplot(1,3,2)
plot(x,Q,Xd,Yd,'o')
title('question d')
subplot(1,3,3)
plot(x,R,Xe,Ye,'o')
title('question e')
Out[3]:
<matplotlib.text.Text at 0x10e065910>
Exercice 3 - Base de Lagrange
Soit (n+1) réels distincts deux à deux. Pour , on note
2) En déduire que la famille de polynôme forme une base de . Correction : voir cours
3) Écrire une fonction PolLagrange(Xint,x,k) qui calcule les valeurs prises par le -ième polynôme de
la base de Lagrange associé aux abscisses , en un point .
x=linspace(-2,4,100)
Xint=array([-1, 2, 3])
l0=PolLagrange(Xint,x,0)
l1=PolLagrange(Xint,x,1)
l2=PolLagrange(Xint,x,2)
Y0=array([1,0,0])
Y1=array([0,1,0])
Y2=array([0,0,1])
plot(x,l0,x,l1,x,l2)
legend(['$L_0$','$L_1$','$L_2$'])
plot(Xint,Y0,'o',Xint,Y1,'o',Xint,Y2,'o')
Out[4]:
[<matplotlib.lines.Line2D at 0x10e33d5d0>,
<matplotlib.lines.Line2D at 0x10e353d10>,
<matplotlib.lines.Line2D at 0x10e35f290>]
In [5]:
def ApproxLagrange(Xint,Yint,x):
P=0
for k in range(0,len(Xint)):
P=P+Yint[k]*PolLagrange(Xint,x,k)
return P
Xint=array([-1,2,3])
Yint=array([4,4,8])
x=linspace(-2,4,100)
y=ApproxLagrange(Xint,Yint,x)
z=2-x+x**2
subplot(1,2,1)
plot(x,y,'b',Xint,Yint,'o',x,z,'r') #on voit bien que les deux polynomes sont le
s memes !
#Si on veut passer une fonction en argument pour calculer le polynome de Lagrang
e d'une fonction :
def ApproxLagrangef(Xint,f,x):
P=0
for k in range(0,len(Xint)):
P=P+f(Xint[k])*PolLagrange(Xint,x,k)
return P
Xint=array([-pi,0,pi/2])
x=linspace(-2*pi, 2*pi, 100)
y=ApproxLagrangef(Xint,cos,x)
subplot(1,2,2)
plot(x,y,Xint,cos(Xint),'o')
Out[5]:
[<matplotlib.lines.Line2D at 0x10e580750>,
<matplotlib.lines.Line2D at 0x10e95d690>]
Exercice 4 - Méthode de Simpson pour le calcul approché d'intégrales
Soit une fonction continue . On cherche à approcher l'intégrale par la
formule d'intégration numérique suivante:
1) Ecrire le système que doit vérifier pour que la méthode soit exacte pour les polynômes de
degré inférieur ou égal à 2.
Correction : La méthode est exacte pour les polynômes de degré inférieur ou égal à si et seulement si elle
est exacte pour les polynômes et , soit :
Correction : On sait déjà qu'elle est au moins de degré d'exactitude puisqu'elle a été construite poru être
exacte pour les polynômes de degré inférieur ou égal à . Mais elle peut etre de degré d'exactitude plus
grand, il faut tester sur , puis etc jusqu'à trouver un degré pour lequel .
Ici, on calcule Par contre on trouve par le calcul que .
4) Déduire de cette étude une valeur approchée de . Que peut-on faire pour avoir une approximation
aussi fine de que l'on souhaite ?
2) De même qu'à la question 1), écrire une fonction TrapComp(a,b,f,N), qui retourne une approximation
numérique de l'intégrale de la fonction f sur [a,b], en utilisant la méthode d'intégration de trapèze à
gauche composite sur une subdivision uniforme de pas h.
Correction : On rappelle la formule vue en cours pour les méthode des rectangles à gauche et des trapèzes
composites : si désigne une subdivision uniforme de pas de (c'est-à-dire que
), alors
3) Utiliser ces fonctions pour calculer une approximation de l'intégrale de la fonction sur
par les méthodes composites des rectangles et trapèzes, avec h = 0.1, puis h = 0.01 et enfin h =
0.001. Quelle erreur obtient-on dans chaque cas ? Cela est-il en accord avec les résultats théorique vus en
cours ?
In [6]:
def RectComp(a,b,f,h):
return(h*sum(f(arange(a,b,h))))
def TrapComp(a,b,f,h):
return(h/2*sum(f(arange(a,b,h)))+h/2*sum(f(arange(a+h,b+h,h))))
print(TrapComp(0,2,cos,0.1)-sin(2))
print(TrapComp(0,2,cos,0.01)-sin(2))
print(TrapComp(0,2,cos,0.001)-sin(2))
#Resultats théoriques pour la méthode des rectangles composite : erreur de l'ord
re de h^2
0.0700494676503
0.00707315669155
0.000707997643487
-0.000757874177074
-7.57749118596e-06
-7.57747867786e-08
Exercice 6 - Une nouvelle méthode d'intégration numérique
Soient , , et
On définit, pour une fonction continue sur , la méthode d'intégration numérique de la façon
suivante :
a) Montrer que est exacte pour les polynômes de degré inférieur ou égal à 1 sur si et seulement si
et .
Correction : Par définition, la méthode est exacte pour les polynômes de degré inférieur ou égal à 1 si et
seulement si elle est exacte pour et , c'est-à-dire:
b) Pour quelles valeurs de , , et , est-elle exacte pour des polynômes de degré inférieur ou égal
à 3 ? Quel est alors le degré d'exactitude de la méthode ?
Correction : Pour que soit exacte pour les polynômes de degré inférieur ou égal à 3, il faut et il suffit
qu'elle soit exacte
c) Déduire des questions précédentes une méthode d'intégration de degré d'exactitude 3 sur un segment
quelconque.
Correction : On utilise le changement de variable expliqué en cours pour passer de notre méthode sur
à une méthode sur quelconque. On obtient
avec et
def MethIntExo6(a,b,f):
#On se contente de recopier la formule précédante
t1 = -((b-a)/2)*(sqrt(3)/3) + ((b+a)/2)
t2 = ((b-a)/2)*(sqrt(3)/3) + ((b+a)/2)
Jf = ((b-a)/2)*(f(t1) + f(t2))
return Jf
def MethCompExo6(a,b,f,h):
A=arange(a,b+h,h) #subdivision uniforme de [a,b] de pas h : a0...an
n=len(A)-1
J=0
for k in range(0,n):
J=J+MethIntExo6(A[k],A[k+1],f)
return J
In [ ]: