Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Chapitre 1
INTRODUCTION
I-1) Définition
Le calcul scientifique qui a pour ancêtre l'analyse numérique pourrait simplement être
définit aujourd'hui comme la discipline qui traite de la conception et de l'analyse d'algorithmes et de
méthodes numériques pour la résolution de problèmes mathématiques issus des sciences et de
l'ingénierie. Il se distingue de la programmation informatique du fait qu'il s'intéresse aux problèmes
mathématiques non discrets, (notamment la manipulation de nombres réels et non des entiers
uniquement).
L'approche numérique introduite par le calcul scientifique à la faveur de l'apparition de
l'ordinateur, constitue aujourd'hui le troisième pilier de la science aux côtés de la théorie et de
l'expérimentation. En effet, cette approche et ses corollaires que sont en amont la modélisation et
en aval la simulation par ordinateur, permettent aujourd'hui d'explorer des problèmes du monde réel
que l'approche classique n'ose même pas aborder. Ex : simulations nucléaire, astrophysique,
validation de conjectures ou la démonstration « automatique » de théorèmes (quatre couleurs).... .
Ainsi, la stratégie généralement utilisée en calcul scientifique consiste à remplacer grâce à un
modèle mathématique, un problème difficile par un autre qui soit plus simple et dont les solutions
sont identiques ou proches de celles de premier problème. Ces modèles utilisent très souvent des
systèmes d'équations aux dérivées partielles (EDP) non-linéaires dont on ne connait pas de solutions
analytiques en général. Il faut alors résoudre le problème numériquement en transformant les
équations continues en un problème discret sur un certain domaine de calcul (le maillage). De
manière générale, l'on cherchera presque toujours à passer de l'infini au fini, du différentiel à
l'algébrique, du non linéaire au linéaire etc.
En résumé, la procédure de l’approche numérique pour la résolution d’un problème
complexe passe par les étapes suivantes:
Recherche d'un modèle mathématique représentant le problème. Mise en équation.
Elaboration d'un maillage. Discrétisation des équations mathématiques.
Résolution des équations discrètes (souvent systèmes linéaires à résoudre).
Transcription informatique et programmation des relations discrètes.
Simulation numérique et exploitation des résultats.
Chapitre 2
Le calcul scientifique est avant tout une question d'approximation. Par conséquent, il impose
une contrainte majeure qui est celle de l'erreur qui caractérise toute approximation. Ainsi, l'analyse
de l'erreur occupe une place de choix dans le calcul scientifique. Des erreurs de calcul infimes
peuvent conduire à des conséquences dramatiques comme l'explosion de la fusée Ariane 5 le 4 juin
1996 (10 ans de travail et 7 milliard de $ en fumée) à cause du passage d'une précision de 64 bits à
une précision de 16 bits. De tels exemples existent aussi dans le monde financier et militaire.
Avant le calcul proprement dit : la modélisation, les mesures empiriques et les calculs
précédents constituent déjà des approximations non négligeables.
Pendant le calcul : la troncature ou discrétisation des quantités et les arrondis sont aussi
des sources d'approximation.
À ceci s'ajoute le fait que les incertitudes des données d'entrée peuvent être amplifiées par le
problème à résoudre, de même que les perturbations lors du calcul peuvent être amplifiées par
l'algorithme lui-même. L'exactitude du résultat finale reflète tous ces facteurs.
les erreurs liées à l’imprécision des mesures physiques ou au résultat d’un calcul approché ;
Ce chapitre met l’accent sur les erreurs liées à la machine, notamment celles qui se rapportent à
l’encodage des données et aux méthodes ou encore aux algorithmes utilisés.
Exemple :
Si X = 2.224 et X* = 2.223 alors l’erreur absolue | E | = | X – X* | = 2.224 – 2.223 =
0.001.
∗
2. Er = | | est l’erreur relative.
Xr ≠ 0. Xr est une valeur de référence pour X. En général, on prend Xr = X.
Exemple :
∗ | ∗|
Si X = 2.224 et X* = 2.223 alors, si on prend Xr = X, l’erreur relative Er = | |= | |
.
= .
= 4.496 x 10-4.
Cependant, si X est la valeur d’une fonction F(t) avec a ≤ t ≤ b, on choisira parfois une valeur de
référence globale pour toutes les valeurs de t.
Exemple :
√
sup sin (𝑡)
Si X = sin(t) avec 0 ≤ t ≤ , on pourra prendre Xr = =
0 ≤ 𝑡 ≤
En général, on ne connait pas le signe de l’erreur de sorte que l’on considère les erreurs absolues et
les erreurs relatives absolues.
Les opérations élémentaires propagent des erreurs. Dans la pratique, on considère que :
1) L’erreur absolue sur une somme est la somme des erreurs absolues.
2) L’erreur relative sur un produit ou un quotient est la somme des erreurs relatives.
On peut estimer l’effet d’une erreur E sur l’argument x d’une fonction f(x) au moyen de la dérivée
de f(x). En effet, f(x + E) ≈ f(x) + E f’(x).
Exemple :
Calculer la valeur de (11111111)2 , la valeur fournie par une petite calculatrice à cinq chiffres
est 1, 2345x1014. Mais la réponse exacte est 123456787654321.
La machine a donc tronqué le résultat à 5 chiffres et l’erreur absolue est de 6,7876 * 109.
L’erreur relative est de l’ordre de 0.005% soit 5,498x10-5.
Cet exemple montre qu’il faut établir clairement l’objectif visé.
Cet objectif est double ;
1) Nous voulons un bon ordre de grandeur (ici 1014) et avoir le maximum de décimales exactes,
2) Ce maximum ne peut excéder la longueur des mots permis par la machine et dépend donc de la
machine.
a) Troncature
Exemple : En base 10, x = 1/15 = 0.066666666......
Dans le cas d’une représentation tronquée nous aurons, pour s = 5, fl(x) = 0.66666 * 10−1.
Remarquez comment a été modifié l’exposant afin de respecter la règle qui veut que le premier
chiffre de la mantisse après la virgule ne soit pas nul. Dans ce cas, l’erreur absolue X − fl(X) est de 6
× 10−7. L’erreur relative est de l’ordre de 10−5. De manière générale, dans une représentation
tronquée à s chiffres, l’erreur relative maximale est de l’ordre de 10−s.
b) Arrondis
Dans une représentation arrondie, lorsque la première décimale négligée est supérieure à 5,
on ajoute 1 à la dernière décimale conservée.
Exemple d’arrondi: x = 1 /15 = 0 .066666666 .
Nous écrirons fl(x) = 0.66667 × 10−1
L’erreur absolue serait alors 3.333 × 10−7et l’erreur relative serait 5 × 10−6
En général, l’erreur relative dans une représentation arrondie à s chiffres est de 5 × 10−(s+1) soit
la moitié de celle d’une représentation tronquée.
Exemple :
L’´equation 1 + x = 1 a x = 0 comme unique solution. Mais dans un système à 10 chiffres
significatifs, elle aura une infinité de solutions (il suffit de prendre | x | ‹ 5 × 10−11)
La distributivité de la multiplication par rapport à l’addition.
Exemple :
Considérons l’opération 122 × (333 + 695) = (122 × 333) + (122 × 695) = 125416
Si nous effectuons ces deux calculs en arithmétique à 3 chiffres (s = 3) et arrondi, nous obtenons :
122 × (333 + 695) = fl (122) × fl (1028) = (0.122 ×103) × (0.103 × 104) = fl (0.0125660×107) =
0.126 × 106 = 126000
(122 × 333) + (122 × 695) = fl(fl (0.040626×106) + fl (0.084790×106)) = fl(0.406 × 10 5+0.848 ×
105) = fl (1.254×105) = 0.125 × 106 = 125000.
Donc la distributivité de la multiplication par rapport à l’addition n’est pas respectée en
arithmétique flottante.
𝑥 𝑥 𝑥
𝑒 =1+ + + +⋯ , −∞ < 𝑥 < ∞
1! 2! 3!
Il est évident que dans la pratique il est impossible d’effectuer la sommation d’une infinité de
termes. On arrêtera donc lorsque le terme général !
devient inférieur à 10−t (on a t digits). Pour x
négatif on sait que le reste de la série est inférieur au premier terme négligé donc à 10−t (puisque la
série est alternée).
Les calculs suivant sont fait sur ordinateur pour t = 14.
On voit que pour x ≤ −20 les résultats obtenus sont dépourvus de sens. L’explication de ce
phénomène est la suivante : pour x = −30 les termes de la série vont en croissant jusqu’à !
=
Des formules équivalentes peuvent donner des résultats différents ; on peut améliorer le résultat en
utilisant une formule mathématique équivalente nécessitant des opérations différentes.
Exemple :
Considérons les nombres √7001 et √7000
En arithmétique flottante à 8 chiffres, on a :
√7001 = 0 .83671979 × 102
√7000 = 0 .83666003 × 102 donc :
√7001 - √7000 = fl((0 .83671979 − 0 .83666003 ) × 102) = 0 .59760000 × 10−2
On peut obtenir un résultat plus précis en utilisant l’identité suivante :
Le fait que certains nombres ne soient pas représentés de façon exacte dans un ordinateur
entraîne que l’introduction même des données d’un problème en machine modifie quelque peu le
problème initial ; Il se peut que cette petite variation des données entraîne une variation importante
des résultats. C’est la notion de conditionnement d’un problème. On dit qu’un problème est bien (ou
mal) conditionné, si une petite variation des données entraîne une petite (une grande) variation sur
les résultats. Cette notion de conditionnement est liée au problème mathématique lui même et est
indépendante de la méthode utilisée pour le résoudre.
Une autre notion importante en pratique est celle de stabilité numérique. Un problème peut
être bien conditionné, mais la méthode utilisée pour le résoudre sujette à une propagation
importante des erreurs numériques. Si les erreurs introduites dans les étapes intermédiaires ont un
effet négligeable sur le résultat final, on dira que le calcul ou l’algorithme est numériquement
stable. Ou encore si elle n’est pas sujette à une propagation importante des erreurs numériques de
discrétisation et d'arrondi. Sinon, on dira que l’algorithme est numériquement instable.
plusieurs valeurs de n. Pour ce faire, nous allons exprimer In récursivement, i.e. nous allons
exprimer In en fonction de n et In−1.
1
, ∫ 𝑥 𝑑𝑥 = = par récurrence sur n ?
0
Mais l’algorithme est numériquement instable car toute erreur dans le calcul de I0 va se
propager. En effet si on note par I0* la valeur approchée de I0 et si I0*= I0 + ε alors :
Exercice 1 : Étudier la distributivité de la multiplication sur l'addition en effectuant l'opération suivante en arith
arithmétique
à 3 chiffres avec arrondi, et en comparant le résultat avec la réponse exacte:
122 x (333 + 695)
Chapitre 3
Octave est un logiciel gratuit de calcul numérique à 90% identique au logiciel propriétaire
MATLAB, développé par John W. Eaton et des bénévoles de la communauté du logiciel libre. Il
s'agit de la plateforme qui sera utilisé pour la partie pratique de ce cours. Octave n’est pas un
logiciel de calcul symbolique comme MAPLE : il ne fait généralement pas de calcul exact, mais
permet de faire très rapidement des calculs numériques approchés et dispose de nombreuses
fonctionnalités graphiques.
Le point d’entrée pour la prise en main de tout logiciel est le menu d’aide. Pour accéder à
l’aide sur Octace, on peut utiliser le menu « Aide » puis cliquer sur le sous-menu
« Documentation ». On peut également saisir la commande help :
−− > help sin
Cette aide est essentiellement en anglais. Les manuels contiennent des exemples
d’utilisation que l’on peut exécuter dans Octave en utilisant le copier/coller entre la fenêtre d’aide et
la fenêtre Octave.
pi = 3.141592653589793
En fait, les réels sont codés dans Octave sur 64 bits : un bit pour le signe, 11 bits pour
l’exposant et 52 bits pour la mantisse, ce qui permet de coder des réels entre environ 2.10e−308 et
2.10e308 avec une précision de l’ordre de 2.10e−16. Cette valeur est celle de la variable prédéfinie
eps :
-->eps
eps = 2.220D-16
Le nombre de mots en mémoire (un mo t= un réel en double précision) peut être très grand
(de l’ordre de 5000000 par défaut). Si l’espace alloué n’est pas suffisant, on peut l’augmenter en
utilisant l’une des commandes single, uint8, int64, etc.
La commande who liste les variables utilisées. Un éditeur de variables, accessible par le
menu, permet également de visualiser et de modifier ces variables.
Chaque variable a un type. Les principaux types qui nous intéresseront sont :
– les constantes (matrices réelles ou complexes) ;
– les booléens (vrai : true ou faux : false) ;
– les chaînes de caractères (’x’ ou "x", qui représentent le même objet).
Il en existe d’autres (complexe, fonctions, . . .). On obtient le type d’une variable x en tapant
class(x).
Les types des variables ne doivent pas être déclarés et ils peuvent changer à tout instant : on
peut toujours affecter à une variable déjà existante une valeur d’un autre type.
Dans Octave, tout (ou presque) est matrice : un réel est simplement une matrice 1×1. Les
matrices peuvent avoir des coefficients réels, complexes, booléens, chaînes de caractères, . . .. Les
coefficients d’une matrice doivent cependant tous être de même type.
Il faut, chaque fois qu’on le peut, utiliser les opérations matricielles prédéfinies. Le gain de
temps, par rapport à l’utilisation de boucles, peut être considérable :
-->tic -->tic
-->for j=1:100 -->C=rand(100,100);
-->for i=1:100 -->toc
-->B(i,j)=rand(1,1); Elapsed time is 38.2589 seconds.
-->end
-->end
-->toc
Elapsed time is 43.148 seconds.
a) Vecteurs et matrices
En petite dimension, la façon la plus simple de définir une matrice n × m est d’en écrire
entre crochets les éléments séparés par des virgules, les lignes étant séparées par des points-virgules
:
Ainsi, la commande diag(diag(A)) renvoie la matrice diagonale dont la diagonale est celle de A.
Il existe deux façons de définir une suite de points régulièrement espacés : la commande
linspace(a,b,k+1) renvoie un vecteur ligne de k + 1 points régulièrements espacés (par défaut k + 1
= 100), le premier étant égal à a et le dernier à b ; la commande a:h:b renvoie sous forme de
vecteur ligne la progression arithmétique de premier terme a et de raison h, le dernier terme étant le
plus grand élément de cette progression ≤ b (si h > 0). Les commandes linspace(0,1,11) et 0:0.1:1
sont donc équivalentes. Par défaut, h est égal à 1 : les commandes a:1:b et a:b sont équivalentes.
--> 0 : pi
ans =
0 1 2 3
La raison h peut également être négative :
--> 10:-1:pi
ans =
10 9 8 7 6 5 4
b) Extraction
Pour accéder à l’élément ai,j d’une matrice A, on tape A(i,j). Plus généralement, si A est une
matrice n × m et v = (v1 , v2 , . . . , vk ), w = (w1 , . . . , wp ) deux vecteurs d’indices (non
nécessairement distincts) vérifiant :
a) 1 ≤ vi ≤ n pour tout i ∈ {1, . . . , k}
b) 1 ≤ wi ≤ m pour tout i ∈ {1, . . . , p}
alors B=A(v,w) est la sous-matrice de A formée des éléments ai,j pour i parcourant v1 , . . . , vk et j
parcourant w1 , . . . , wp .
-->A = [1:6]’*[2:7]
A=
2 3 4 5 6 7
4 6 8 10 12 14
6 9 12 15 18 21
8 12 16 20 24 28
10 15 20 25 30 35
12 18 24 30 36 42
-->v=1:2:6
v=
1 3 5
-->A(2*ones(1,3),:)
ans =
4 6 8 10 12 14
4 6 8 10 12 14
4 6 8 10 12 14
Le symbole : représente le vecteur de tous les indices lignes ou colonnes. Si A est une
matrice, A(:) est le vecteur colonne obtenu en concaténant toutes les colonnes de A. Pour un vecteur
(ligne ou colonne), on peut se contenter de n’indiquer qu’un indice :
-->v=5:-1:1;v([3:$])
ans =
3. 2. 1.
La variable end représente le dernier indice (de ligne ou de colonne). La commande size(A)
renvoie la taille de la matrice A sous forme d’un vecteur ligne à deux éléments. La longueur d’un
vecteur v (ligne ou colonne) est obtenue par la commande length(v).
La commande matrix permet de remodeler une matrice :
-->matrix(1:6,2,3)
ans =
1. 3. 5.
4. 6.
e) Opérations matricielles
Les opérations ont en général deux versions : l’une correspond à l’opération usuelle sur les
matrices, l’autre à l’opération effectuée élément par élément. Ainsi, les opérations .∗, .^, ./ sont
les versions élément par élément alors que les opérations *, ^, / représentent les opérations usuelles
sur les matrices (produit, puissance, division) lorsque ces opérations ont un sens. Une fonction
usuelle f (sin, cos, exp, abs, int, floor. . .) appliquée à la matrice A = (ai,j ) donne la matrice (f (ai,j
)). Par exemple, si A = (ai,j ), exp(A) = (exp(ai,j )). Par contre, si A est une matrice carrée,
l’exponentielle matricielle s’obtient par la commande expm(A). On trouve de même les fonctions
cosm, sinm, etc .
Exemple :
-->x=rand(2,2) -->U=bool2s(x>0.1)
x= U=
! 0.2113249 0.0002211 ! ! 1. O !
! 0.7560439 0.3303271 ! ! 1. 1. !
Les commandes min et max retournent respectivement le plus petit et le plus grand élément
de A si elles sont employées avec un seul argument A (matrice ou vecteur) ; si elles sont employées
avec plusieurs arguments A1 , . . . , An (matrices ou vecteurs de même taille), elles s’interprètent
coefficient par coefficient ; on peut également obtenir les plus petits (ou plus grands) éléments de
chaque ligne (ou colonne) :
-->x=rand(2,3)
x=
0.7783129 0.1121355 0.1531217
0.2119030 0.6856896 0.6970851
-->min(x)
ans =
0.1121355
-->min(x,’c’)
ans =
0.1121355
0.2119030
-->y=rand(x)
y=
0.8415518 0.4094825 0.1138360
0.4062025 0.8784126 0.1998338
-->min(x,y)
ans =
0.7783129 0.1121355 0.1138360
0.2119030 0.6856896 0.1998338
L’addition d’un scalaire à une matrice s’interprète comme l’addition à chaque coefficient. De même
la multiplication, la division par un scalaire, l’élévation à une puissance :
-->2^(0:6)
ans =
1. 2. 4. 8. 16. 32. 64.
-->eye(2,3)-1
ans =
0. - 1. - 1.
- 1. 0. - 1.
Notez cependant que A^2 renvoie le vecteur des carrés de A si A est un vecteur, mais le carré
matriciel de A si A est une matrice carrée (et un message d’erreur si A est une matrice
rectangulaire).
Attention : la commande 1./ ne donne pas le résultat escompté :
-->1./(1:3)
ans =
0.0714286
0.1428571
0.2142857
En effet Octave l’interprète comme (1.)/ et non comme 1 ./ et résout un système linéaire au
sens des moindres carrés.
Le rang d’une matrice A, le déterminant et le spectre d’une matrice carrée A, l’inverse d’une
matrice carrée inversible A, sont donnés respectivement par les commandes rank(A), det(A),
spec(A), inv(A) (ou A^(-1)). La diagonalisation (quand elle est possible) s’obtient par la commande
bdiag(A).
De nombreuses autres fonctions ou décompositions matricielles sont implémentées (voir la
rubrique d’aide Algèbre linéaire).
La commande find
La fonction find permet de trouver, et donc d’extraire etc..., les éléments d’un vecteur (ou
d’une matrice) vérifiant une propriété donnée.
-->a=rand(2,3)
a=
0.2113249 0.0002211 0.6653811
0.7560439 0.3303271 0.6283918
-->find(a<0.5)
ans =
1. 3. 4.
-->x=a(find(a<0.5))
x=
0.2113249
0.0002211
0.3303271
On peut remplacer la commande a(find(a<0.5)) par la commande a(a<0.5) :
-->a(a<0.5)=0
a=
0. 0. 0.6653811
0.7560439 0. 0.6283918
De même si b est une matrice booléenne de la même taille que a, a(b) équivaut à a(find(b)).
Le Tri
La fonction sort permet de trier les éléments d’un vecteur ou d’une matrice, soit dans leur
ensemble, soit ligne par ligne ou colonne par colonne ; l’ordre peut être croissant ou décroissant
(pour les divers arguments de cette commande, voir la rubrique d’aide). Par exemple, pour trier
chaque colonne de la matrice A par ordre croissant, on utilise sort(A,’r’,’i’) (’r’ pour ’row’ : on trie
sur les lignes) :
---->A=rand(3,2) -->sort(A,’c’,’i’)
A= ans =
! 0.4368588 0.4051954 ! ! 0.4051954 0.4368588 !
! 0.2693125 0.9184708 ! ! 0.2693125 0.9184708 !
! 0.6325745 0.0437334 ! ! 0.0437334 0.6325745 !
Les possibilités graphiques de Octave sont importantes. Nous n'introduisons ici que les cas
usuels des courbes planes, des courbes paramétrées et des surfaces à trois dimensions.
e) 1- Courbes planes et nuages de points
La commande de base pour tracer des courbes planes est plot. Cette commande prend en
arguments les vecteurs des abscisses et des ordonnées d’une suite de points et représente la ligne
brisée joignant ces points. De nombreux arguments facultatifs permettent de régler l’affichage
(couleur, échelle, axes . . .), d’ajouter un titre (xtitle) ou des légendes (legends). Si le nombre de
points est suffisant, on peut ainsi représenter le graphe d’une fonction :
Exemples :
On définit d’abord un vecteur de 100 valeurs régulièrement espacées entre −π et π :
--> x=linspace(-2*pi,2*pi,200);
On trace la courbe de la fonction sinus avec la commande suivante :
--> plot(x, sin(x), axesflag=5, style=5)
La couleur du graphique est définie par la commande "style = *" où * star est un nombre.
Par défaut Octave représente un cercle comme une ellipse comme dans cet exemple :
--> t=linspace(0,2*pi);plot(cos(t),sin(t))
Si on veut représenter plusieurs courbes sur le même graphique, on utilise la fonction hold.
III-5) Programmation
III-5-2) Fonctions
Pour définir une fonction, on utilise la syntaxe :
function y=nomdefonction(x)
Où y est la valeur retournée par la fonction, nomdefonction le nom de la fonction que l’on
veut définir et x l’argument d’entrée. La définition de la fonction se termine par le mot-clé
endfunction :
-->function y=sq(x)
-->y=x.^2
-->endfunction;
-->sq(1:4)
ans =
1. 4. 9. 16.
Une fonction peut avoir plusieurs arguments tant en entrée qu’en sortie. Par exemple la
fonction prédéfinie max peut renvoyer à la fois le maximum des coefficients d’un vecteur (ou d’une
matrice) de scalaires et le premier indice où ce maximum est atteint. Si on appelle cette fonction
seule, elle ne renvoie que le maximum :
-->x=floor(3*rand(1,10))
x=
2. 2. 1. 1. 1. 2. 2. 1. 1. 2.
-->max(x)
ans =
2.
Si on veut obtenir aussi l’indice, on appelle la fonction en explicitant deux valeurs en sortie :
-->[y,k]=max(x)
k=
1.
y=
2.
La même remarque vaut pour la fonction de tri gsort qui permet de récupérer le rang de chacun
des éléments d’un vecteur :
-->x=rand(1,7)
x=
0.26395 0.41481 0.28064 0.12800 0.77831 0.21190 0.11213
-->[y,ind]=gsort(x,’g’,’i’)
ind =
7. 4. 6. 1. 3. 2. 5.
y=
0.11213 0.12800 0.21190 0.26395 0.28064 0.41481 0.77831
De manière générale, si une fonction retourne plusieurs valeurs, il faut lui demander
explicitement de retourner ces valeurs en les nommant sous forme d’un vecteur si on veut toutes les
obtenir ; sinon seul le premier argument de sortie (en général le plus important) est retourné.
Une fonction peut être récursive (s’appeler elle-même au cours de son exécution). Ainsi
pour calculer la factorielle d’un entier naturel, on pourrait définir la fonction :
function x=fact(n)
if n<=1 then x=1;else x=n*fact(n-1);end;
endfunction;
Une fonction peut très bien ne pas renvoyer de valeur, mais effectuer une action (par
exemple dessiner une figure ou afficher un message). La fonction affichercarre(x) définie par :
-->function affichercarre(x)
-->disp(x^2);
-->endfunction;
-->affichercarre(5)
25.
affiche à l’écran le carré de son argument, mais ne renvoie aucune valeur.
Les résultats des calculs intermédiaires effectués lors de l’exécution d’une fonction ne
s’affichent jamais à l’écran, si bien qu’il est indifférent de terminer les instructions à l’intérieur
d’une fonction par un point-virgule ou un passage à la ligne. La commande disp permet d’afficher la
valeur d’une variable ; on peut y ajouter un texte sous forme de chaîne de caractères, comme
disp(’Valeur de x: ’+string(x)).
Une fonction peut accéder en lecture à toutes les variables déjà définies, mais ne peut pas
modifier en cours d’exécution une variable existante, sauf si celle-ci a été déclarée globale. Par
exemple la fonction double() définie par :
function double()
a=2*a;
endfunction;
ne modifie pas la variable a dans le script suivant :
-->a=2;double();a
a=
2.
Pour qu’elle modifie a, il faudrait déclarer cette variable globale :
-->global a;
-->function double()
-->global a;
-->a=2*a;
-->endfunction;
-->a=3;double();a
a=
6.
Le plus simple est naturellement de définir la fonction autrement :
-->function y=double(x)
-->y=2*x;
-->endfunction;
-->a=3;a=double(a)
a=
6.
et d’éviter ainsi l’utilisation de variables globales.
== égal à
< inférieur à
> supérieur à
<= inférieur ou égal à
>= supérieur ou égal à
∼= ou <> différent de
∼ négation
& ou and et logique
| ou or ou logique (non exclusif)
Ces opérateurs s’appliquent coefficient par coefficient sur des matrices de même taille :
-->a=rand(2,3),b=rand(a),b<a,or(b<a)
a=
0.2113249 0.0002211 0.6653811
a) La boucle for itère sur les composantes d’un vecteur ligne. Elle s’écrit :
for variable=indices, instruction(s), end (ne pas oublier le end).
-->v=zeros(1,4);for i=1:2:5, v(i)=i^2;end;v
v=
1. 0. 9. 0. 25.
b) La boucle while permet de répéter une instruction tant qu’une condition est vraie. Sa syntaxe est
:
while condition, instruction(s); end
Ne pas oublier le end et se méfier des boucles sans fin du type :
-->while 1
-->i=i+1;
-->end
(Octave transforme la constante non nulle 1 en le booléen %t). On peut dans ce cas arrêter
l’exécution du programme au moyen de la commande stop du menu control de la barre de menu.
La commande break interrompt l’exécution d’une boucle :
-->for k=1:100, if k^2>50 then break;end;end;k
k=
8.
y=
2.
III-6) Exercices
Exercice 1 :
Écrire un programme Octave qui permet de calculer le PGDC de deux entiers a et b à l'aide de la
méthode d'Euclide.
Exercice 2 :
Écrire un programme Octave qui permet le calcul du nième terme de la suite de Fibonacci
Exercice 3 :
a) Créer les matrices suivantes en utilisant un minimum de commandes de création de matrice
(eye, ones, et diag).
b) Écrire une commande optimisée composée de commandes élémentaires (eye, ones, et diag)
permettant de créer les matrices A en fonction d'une variable n telle que on ait pour n = 2, 3, 4 les
résultats ci-dessous.
Pour n = 2 : Pour n = 3 : Pour n = 4 :
0 0 0 2 0 0 0 0 3 0 0 0 0 0 4
3 0 0 3 3 0 0 0 4 3 0 0 0 0 5
A= 0 3 0 4 A= 0 3 0 0 5 A= 0 3 0 0 0 6
1 1 1 1 0 0 3 0 6 0 0 3 0 0 7
1 1 1 1 1 0 0 0 3 0 8
1 1 1 1 1 1 Chapitre
4.
Introduction
La solution de plusieurs problèmes peut être définit comme la limite d’une suite de
nombres ou de vecteurs. C’est le cas des problèmes admettant une modélisation
mathématique donnant lieu à des équations ou système d’équation non linéaires. Le
problème se pose de la façon suivante :
Soit f une fonction numérique d’une variable réelle (nous simplifions au cas f est à
valeurs réelles, nous verrons en la fin du cours comment on peut généraliser la
méthode de résolution au cas des fonctions à valeurs dans Rn, n>1). Il est question de
déterminer les solutions de l’équation :
f(x) = 0
Cette résolution d’un point de vue numérique s’appuie sur des méthodes itératives qui
permettent de déterminer un nombre fini, suffisamment grand, d’éléments d’une suite,
de telle sorte que le dernier élément calculé soit une valeur approchée de la solution
cherchée. Ainsi, pour une suite récurrente x0, x1,…xn qui admet une limite α, on
calcule les valeurs successives de xn jusqu’à une valeur suffisamment grande de n,
déterminée par un critère d’arrêt qui peut être basé sur l’erreur absolue (|xn-xn-1 ≤) ou
sur l’erreur relative (|xn-xn-1 ≤|xn|) où a été fixé à l’avance..
Les principales méthodes que nous allons explorer dans ce cours sont les suivantes :
a) Principe
Cette méthode se fonde sur le théorème des valeurs intermédiaires. Pour f continue,
nous cherchons x0 tel que f(x0) = 0. On suppose qu’on a localisé un intervalle [a,b] tel
que f change de signe. On pose c = (a+b)/2 :
- Si f(a)*f(c) = 0, alors c = x0 ;
- Si f(a)*f(c) <0 alors on remplace b par c ;
- Sinon on remplace a par c.
Autrement dit, en fonction du signe de f(c), on sait dans quel demi-intervalle trouve
nécessairement la racine. On réitère donc l’opération sur le nouvelle intervalle jusqu’à
obtenir un intervalle de longueur inférieure à la précision souhaitée, par exemple (b-
a)/2n pour n itérations.
b) Algorithme / programme
Algorithme :
c) Avantages
d) Inconvénient
La convergence de la méthode de bissection est linéaire, donc assez lente. De
plus, on ne tient compte que du signe de f(c) ce qui signifie qu’on perd beaucoup
d’information. Par ailleurs, s’il y a plusieurs racines on n’en obtient qu’une et on ne
sait pas laquelle. Il faut trouver a et b tels que f(a) et f(b) sont de signe différents et
f doit être continue.
e) Exemple
Vérifier qu’on trouve une solution à 10-10 près de l’équation xex-1=0 en 34 itérations,
et que cette solution vaut x = 0.5671432904.
Que se passe-t-il si f est discontinue ? Exemple :
a) Principe
Il est question de rechercher une fonction telle que f(x) =0 soit équivalent à (x) =
x. Notons qu’il peut y avoir une infinité de possibilités car par exemple, quelque soit la
fonction g s’annulant en même temps que f, on a (x) = x ± g(x). Toutefois, ce ne sont
pas toutes les possibilités qui convergent ou qui sont rapide pour la résolution du
problème.
Rappels :
Soit (xn)n une suite récurrente définie par xn+1 = (xn), un point fixe de cette suite
est un nombre p tel que p = (p). On démontre que si est continue et que (xn)n
converge, alors sa limite est un point fixe.
Soit (xn)n une suite récurrente admettant p pour limite lorsque n tend vers l’infini.
On pose en = xn – p (l’écart entre l’itération d’ordre n et la solution) ; Rappelons qu’on
dit que la formule converge de façon monotone à partir du rang n0, lorsque |en|
décroît et tend vers 0. Si D est le plus grand intervalle contenant p tel que pour tout x0
dans D, la formule converge de façon monotone à partir de 0, on dit alors que D est la
zone de convergence de la formule.
Supposons qu’on a ’(p) = ’’(p) =…=(k-1)(p)=0 et (k)(p) ≠ 0, alors la formule
itérative est dite d’ordre k. Dans ce cas le développement de Taylor-Young au
voisinage de p à l’ordre k permet d’avoir :
b) Algorithme / programme
Le but ici est de trouver une solution de g(x) = x. Pour se faire, nous prendrons en
entrée une approximation initiale p0, la précision désirée et le nombre maximal
c) Avantages
La méthode peut être très rapide et ne nécessite qu’une valeur initiale. Elle ne
nécessite pas de comparaisons de signes.
d) Inconvénient
Il n’est pas toujours possible de choisir avec certitude la valeur initiale x0 dans la
zone de convergence. Ainsi, même si la suite converge, il faudra passer par une phase
de recherche dans laquelle l’erreur ne diminue pas progressivement ; il pourrait
même y avoir divergence. Par ailleurs, la méthode n’est pas toujours simple à mettre
en œuvre (critères de continuité et de dérivabilité). Enfin, en cas de racine multiple, la
méthode ne convergent pas toujours vers la plus proche de x0.
e) Exemple
Résoudre numériquement x2-2 = 0, avec les fonctions 1(x) = 2/x, 2(x) = 2x – 2/x ;
3(x) = (1/3)(2x+2/x) et 4(x) = (1/2)(x+2/x). Que constatez-vous ?
a) Principe
Cette méthode est un cas particulier de la méthode du point fixe où pour f(x) = 0 et
sous certaines conditions, on prend (x) = x – f(x)/f’(x). Ainsi, on suppose que f est
continue et dérivable. On se donne x0 et on définit la suite récurrente de manière à ce
que xn+1 = xn – f(xn)/f ’(xn). D’un point de vue géométrique, xn+1 représente l’abscisse de
l’intersection avec l’axe des x de la tangente à la courbe au point (xn, f(xn)).
En calculant ’(x) et ’’(x) à partir de (x) = x – f(x)/f’(x), on peut discuter la
convergence de la méthode :
- Si f ’(p) et f ‘’(p) ≠ 0 la méthode est de second ordre et donc converge
b) Algorithme / programme
c) Avantages
d) Inconvénient
e) Exemple
a) Principe
(f ’(xn)) par l’expression (f (xn) - f (xn-1)) / (xn - xn-1). En effet, la tangente est remplacée
par la sécante dans la conception géométrique de la méthode de Newton-Raphson.
D’où la récurrence :
𝑥 − 𝑥
𝑥 = 𝑥 + 𝑓(𝑥 )
𝑓(𝑥 ) − 𝑓(𝑥 )
b) Algorithme / programme
c) Avantages
Ici, pas besoin que la fonction f soit dérivable. La méthode est plus rapide que celle
de la bissection.
d) Inconvénient
Il faut deux valeurs initiales. Le méthode est plus lente en général par rapport à
celle de Newton-Raphson.
2.5 Généralisation à Rn
A partir d’un couple de valeurs approchées (x1, y1) d’une solution du système, on
peut déterminer deux accroissements h et k à donner à x1 et y1 de manière à ce que :
Où l’on a posé :
Le calcul est alors relancé jusqu’à ce que h et k deviennent inférieurs à une valeur
que l’on se donne (selon la précision voulue pour le calcul).
Ainsi, l’algorithme correspondant est :
Avec :
Ou encore :
l'initialisation précédente.
d. Appliquer cinq itérations de la méthode de dichotomie à la fonction g sur
l'intervalle [−1, 1] et utiliser le point obtenu comme initialisation de la méthode de
Newton pour la recherche d'un zéro de g.
e. Écrire une fonction qui implémente la méthode de la sécante à partir du
fichier newton.m.
--------------------------------------------------------------Dichotomie.m---------------------------------------
function [zero,iter,res,inc]=dichotomie(func,a,b,tol,nmax)
fa=feval(a,func,);
fb=feval(b,func);
if fa*fb>0 then
error('Le signe de la fonction doit differer en chaque extremite de l''intervalle.');
elseif fa==0
zero=a;
res=0;
iter=0;
return
elseif fb==0
zero=b;
res=0;
iter=0;
return
end
iter=0 ;
fin=1;
inc=(a+b)*0.5;
err=(b-a)*0.5;
while (err>=tol&iter<=nmax)
iter=iter+1;
fin+1;
x=inc(fin);
% COMPLETER
inc(fin+1)=(a+b)*0.5;
inc(fin-1)=abs(inc(fin)-x);
end
if iter>nmax then
fprintf('Le nombre maximum d''iterations a ete atteint sans convergence avec la
tolerance desiree.\n');
end
zero=inc(fin);
inc(fin)=[];
res=feval(zero,func);
endfunction
-------------------------------------------------Newton.m--------------------------------------------------------
function [zero,iter,res,inc]=newton(func,dfunc,x0,tol,nmax)
x=x0;
iter=0;
diff=tol+1;
while (abs(diff)>=tol&iter<=nmax)
iter=iter+1;
% COMPLETER
end
if iter>nmax then
fprintf(['Le nombre maximum d''iterations a ete atteint sans convergence avec la…
tolerance desiree.\n']);
end
zero=x;
res=feval(x,func);
endfunction