IV. Corrigés des exercices▲
IV-A. Systèmes linéaires d'équations : solution▲
IV-A-1. système d'équations 1▲
On peut utiliser la fonction solve() du sous-module linalg de NumPy :
import numpy as np
def reponse():
A = np.array([[1,1,1],[1,-2,1],[2,-1,1]])
B = np.array([1,0,2])
return np.linalg.solve(A,B)>>> reponse()
array([ 1.66666667, 0.33333333, -1. ])La solution exacte est kitxmlcodeinlinelatexdvp\begin{pmatrix}\dfrac{5}{3} & \dfrac{1}{3} & -1\end{pmatrix}finkitxmlcodeinlinelatexdvp. En effet les solutions sont rationnelles (car tous les coefficients du système sont entiers), à petit dénominateur (on peut prendre pour dénominateur le déterminant de la matrice du système).
IV-A-2. Système d'équations 2▲
kitxmlcodeinlinelatexdvp\left\{ \begin{array}{r c l} x+y+z &=& a\\ x-2y+z &=& b\\ 2x-y+z &=& c \end{array} \right.finkitxmlcodeinlinelatexdvp avec kitxmlcodeinlinelatexdvp\left\{ \begin{array}{r c l} 3a+b-c &=& 3\\ a+b+c &=& 3\\ a-2b+2c &=& 1 \end{array} \right.finkitxmlcodeinlinelatexdvp
Soit A la matrice du premier système, U = (a; b; c) et X = (x; y; z). Alors, U = A.X
Soit B la matrice du second système et V = (3; 3; 1). Alors, V = B.U
Première solution : à l'aide de solve(). On trouve d'abord U pour en déduire ensuite X :
>>> A = np.array([[1,1,1],[1,-2,1],[2,-1,1]])
>>> B = np.array([[3,1,-1],[1,1,1],[1,-2,2]])
>>> V = np.array([3,3,1])
>>> U = np.linalg.solve(B,V)
>>> np.linalg.solve(A,U)
array([ 0., -0., 1.])Ainsi (0; 0; 1) est solution (remarquer les 0. et -0. apparaissant). La solution est correcte. Avec ces valeurs, on trouve a = b = c = 1 qui est bien solution du deuxième système.
Deuxième solution : à l'aide de inv(). On vérifie que A et B sont inversibles grâce à la fonction det() qui donne le déterminant (A est inversible si, et seulement si, det(A) ≠ 0). Alors, X = A−1U = A−1B−1V
>>> a = np.linalg.inv(A)
>>> b = np.linalg.inv(B)
>>> np.dot(np.dot(a,b),V)
array([ -2.22044605e-16, -1.11022302e-16, 1.00000000e+00]On ne trouve pas la valeur exacte, mais seulement une valeur approchée à 10−15 près. L'inversion des matrices a inséré des erreurs d'arrondis qui se sont propagées et amplifiées. La fonction solve() s'avère plus efficace.
IV-B. Interpolation polynomiale : solution▲
Cela revient à déterminer tous les triplets de réels (a; b; c) tels que le polynôme kitxmlcodeinlinelatexdvpP(x)=a+bx+cx^2finkitxmlcodeinlinelatexdvp prenne les valeurs 1, 4, 3 en 0, 1 et 2. C'est-à-dire les (a; b; c) solutions du système linéaire :
kitxmlcodelatexdvp\left\{ \begin{array}{r c l} a+b.0+c.0^2 &=& 1\\ a+b.1+c.1^2 &=& 4\\ a+b.2+c.2^2 &=& 3 \end{array} \right.finkitxmlcodelatexdvpSoit,
kitxmlcodelatexdvp\left\{ \begin{array}{r c l} a &=& 1\\ a+b+c &=& 4\\ a+2b+4c &=& 3 \end{array} \right.finkitxmlcodelatexdvp>>> A = np.array([[1,0,0],[1,1,1],[1,2,4]])
>>> V = np.array([1,4,3])
>>> np.linalg.solve(A,V)
array([ 1., 5., -2.])Il n'y a qu'une solution : c'est le polynôme kitxmlcodeinlinelatexdvpP(x)=1+5x-2x^2finkitxmlcodeinlinelatexdvp.
IV-C. Tracés avec pyplot : solution▲
Fonction kitxmlcodeinlinelatexdvp\tanfinkitxmlcodeinlinelatexdvp :
>>> import matplotlib.pyplot as pp
>>> import numpy as np
>>> X = np.linspace(-5,5,1000)
>>> Ytan = np.tan(X)
>>> pp.plot(X,Ytan,'b')
>>> pp.grid(True)
>>> pp.show()
Fonction kitxmlcodeinlinelatexdvp\lnfinkitxmlcodeinlinelatexdvp :
>>> X = np.linspace(0,10,1000)
>>> Yln = np.log(X)
main :1: RuntimeWarning: divide by zero encountered in log
>>> X = X[1:] # Slicing pour éviter le premier nombre, 0.
>>> Yln = np.log(X)
>>> pp.plot(X,Yln,'b')
>>> pp.grid(True)
>>> pp.show()
De même pour la fonction kitxmlcodeinlinelatexdvp\dfrac{\sin{x}}{x}finkitxmlcodeinlinelatexdvp :
>>> X = np.linspace(0,10,1000)
>>> X = X[1:] # Slicing pour éviter le premier nombre, 0.
>>> Y = [np.sin(x)/float(x) for x in X]
>>> pp.plot(X,Y)
>>> pp.grid(True)
>>> pp.show()
Tracé de la courbe paramétrée :
kitxmlcodeinlinelatexdvpx(t)=t \cdot \cos(t) , \: y(t)=t \cdot \sin(t)finkitxmlcodeinlinelatexdvp pour kitxmlcodeinlinelatexdvpt \in [0, 10]finkitxmlcodeinlinelatexdvp
>>> import numpy as np
>>> import matplotlib.pyplot as pp
>>> T = np.linspace(0,10,256)
>>> X = T * np.cos(T)
>>> Y = T * np.sin(T)
>>> pp.plot(X,Y,'b')
>>> pp.grid(True)
>>> pp.axis('equal')
>>> pp.show()
Pour une ellipse :
>>> a = 2; b = 1
>>> T = np.linspace(0,2*np.pi,1000)
>>> pp.plot(a*np.cos(T),b*np.sin(T),'b')
>>> pp.grid(True)
>>> pp.show()
IV-D. Calcul d'aire d'une ellipse : solution▲
De l'équation kitxmlcodeinlinelatexdvp\dfrac{x^2}{a^2} + \dfrac{y^2}{b^2} = 1finkitxmlcodeinlinelatexdvp découle que les parties supérieure et inférieure de l'ellipse ont pour équation kitxmlcodeinlinelatexdvpy = \pm \dfrac{b}{a} \sqrt{a^2-x^2}finkitxmlcodeinlinelatexdvp.
Ainsi l'aire de l'ellipse est :
kitxmlcodelatexdvpA = \dfrac{2b}{a} \int^a_{-a} \sqrt{a^2-x^2}\textrm{d}xfinkitxmlcodelatexdvpIV-E. Tracé du graphe de la dérivée d'une fonction : solution▲
def derive(f,x,h): # Calcul approché de la dérivée en 1 point
return (f(x+h)-f(x-h))/float(2*h)
import numpy as np
import matplotlib.pyplot as pp
def trace(f,a,b):
N = 100
X = np.linspace(a,b,N)
Yf = f(X)
Yd = np.empty(N) # tableau vide de N éléments
for i in range(N):
Yd[i] = derive(f,X[i],0.01)
pp.plot(X,Yf,'b',X,Yd,'r')
pp.grid(True)
pp.legend(('fonction','derivée'),'lower right')
pp.show()En utilisant le calcul sur les tableaux, plutôt qu'en calculant la dérivée en chaque point à l'aide d'une boucle for.
def derive(f,x,h=0.01): # Calcul approché de la dérivée
return (f(x+h)-f(x-h))/float(2*h)
import numpy as np
import matplotlib.pyplot as pp
def trace(f,a,b):
N = 100
X = np.linspace(a,b,N)
Yf = f(X)
Yd = np.empty(N)
Yd = derive(f,X) # Le 2e argument passé est un tableau
pp.plot(X,Yf,'b',X,Yd,'r')
pp.grid(True)
pp.legend(('fonction','derivée'),'lower right')
pp.show()>>> f = lambda x: x**3
>>> trace(f,-4,4)Tracé des graphes de kitxmlcodeinlinelatexdvpf\,:\,x\mapsto x^3finkitxmlcodeinlinelatexdvp et de sa dérivée kitxmlcodeinlinelatexdvpf'\,:\,x\mapsto 3x^2finkitxmlcodeinlinelatexdvp sur [−4, 4] :



