Résolution d`équations par méthode itérative Un corrigé 1 Un

Transcription

Résolution d`équations par méthode itérative Un corrigé 1 Un
Résolution d’équations par méthode itérative
Un corrigé
1
Un exemple
Q.1 On calcule xn avec n tel que 0.9n ≤ ε. On poursuit l’évolution tant que cette condition n’est pas
vérifiée. On gère deux variables : l’une r donnant les valeurs successives de la suite et l’autre p
donnant les puissances successives de 0.9. On teste ensuite.
from math import cos
def exemple(epsilon):
r,p=0,1
while p>epsilon:
r=cos(r)
p=p*0.9
return(r)
a=exemple(0.01)
print(a,cos(a)-a)
2
La dimension 2
Q.2 La situation est très proche de celle de la question précédente. On écrit une fonction F correspondant à celle de l’énoncé (elle prend en argument une liste de deux éléments et en renvoie
une autre). La fonction principale gère encore√deux variables : l pour les valeurs successives de
la suite et l’autre p pour les puissances de 1/ 2.
from math import sin
def F(l):
return([sin(l[0]+l[1])/2-1,cos(l[0]-l[1])/2+1/2])
def dimension2(epsilon):
l,p=[0,0],1
c=2**(-1/2)
while 2*p>epsilon:
l=F(l)
p=p*c
return(l)
l=dimension2(0.01)
print(l,F(l))
3
Systèmes linéaires
3.1
Un exemple simple
Q.3 C’est comme pour la question précédente mais en plus simple.
def F(l):
x,y=l[0],l[1]
return([(2+y)/3,-(5+x)/7])
1
Q.4 On sait combien de fois on itère et une boucle inconditionnelle s’impose.
def itereF(n):
l=[0,0]
for i in range(n):
l=F(l)
return(l)
Q.5 J’écris une fonction auxiliaire calculant la distance entre deux points de R2 . Le tracé est ensuite
classique.
from matplotlib import pyplot as plt
def dist(L,E):
return(((L[0]-E[0])**2+(L[1]-E[1])**2)**(1/2))
ln=[n for n in range(0,10)]
ly=[dist(itereF(n),[9/22,-17/22]) for n in ln]
plt.plot(ln,ly)
3.2
Quelques outils sur les matrices
Q.6 Une première fonction prend en argument une matrice A et un numéro de ligne i et renvoie
la somme des |A[i, j]| pour j 6= i. Elle utilise la fonction abs (valeur absolue). Il reste ensuite
à faire une simple recherche de maximum (la variable r correspondant à la plus grande valeur
trouvée, son initialisation à 0 étant cohérente puisque l’on cherche le maximum de quantités
positives).
import numpy as np
def somme(A,i):
s=0
for j in range(len(A)):
if j!=i:
s=s+abs(A[i,j])
return(s)
def R(A):
r=0
for i in range(len(A)):
c=somme(A,i)/abs(A[i,i])
if c>r:
2
r=c
return(r)
Q.7 Une variable s permet d’additionner les carrés des coefficients. On renvoie finalement la racine
carrée de la somme.
def norme(Y):
s=0
for i in range(len(Y)):
s=s+Y[i]**2
return(s**(1/2))
3.3
La méthode de Jacobi
Q.8 Une première fonction Ji permet de calculer ce qui est noté Y [i] dans l’énoncé. On peut alors
définir le tableau Y voulu en compréhension.
def Ji(A,B,X,i):
s=B[i]
for j in range(len(B)):
if j!=i:
s=s-A[i,j]*X[j]
return(s/A[i,i])
def J(A,B,X):
return(np.array([Ji(A,B,X,i) for i in range(len(B))]))
Q.9 On gère une variable X pour les termes successifs de la suite et une autre p pour gérer le test
d’arrêt comme dans les premières questions.
def Jacobi(A,B,epsilon):
X=J(A,B,np.array([0]*len(B)))
rA=R(A)
p=rA*norme(X)/(1-rA)
while p>epsilon:
X=J(A,B,X)
p=p*rA
return(X)
Q.10 Une fonction matA permet la création de An . On teste ensuite dans le cas n = 5 our obtenir
une solution approchée X pour laquelle on vérifie que J(X) est proche de X.
def matA(n):
A=np.zeros((n,n))
for i in range(n):
for j in range(n):
if i!=j:
A[i,j]=1/(i+j+1)
else:
A[i,i]=1+1/(i+j+1)
return(A)
B=[0,1,2,3,4]
A=matA(5)
X=Jacobi(A,B,0.001)
print(J(A,B,X)-X)
3
Q.11 La fonction matB permet la création de BnP
. On utilise la fonction
sum permettant de sommer
P
des éléments. Ici, c’est B[i] qui est égale à j A[i, j]E[j] = j A[i, j]j.
def matB(n):
A=matA(n)
B=[]
for i in range(n):
B.append(sum(A[i,j]*j for j in range(n)))
return(np.array(B))
On gère une variable X que l’on fait évoluer tant que kX − Ek n’est pas suffisamment petit.
def test(n,epsilon):
X=np.array([0]*n)
E=np.array([j for j in range(n)])
B=matB(n)
A=matA(n)
k=0
while norme(X-E)>epsilon:
k=k+1
X=J(A,B,X)
return(k)
Pour différentes valeurs de n et une précision de 0.001 (fixée), on regarde le nombre d’itérations
nécessaires.
ln=[n for n in range(2,11)]
ly=[test(n,0.001) for n in ln]
plt.plot(ln,ly)
Sans surprise, plus n est grand plus le nombre des itérations nécessaires est grand.
4