Cahier - Complet - Technique Scientifiques 2019 - 01 PDF
Cahier - Complet - Technique Scientifiques 2019 - 01 PDF
Cahier - Complet - Technique Scientifiques 2019 - 01 PDF
Deuxième Année
P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 SFA
TD#01
Exercice 1 : Calcul polynomial
1. Calculez : P6(1,5) avec P6(x) = 7x6 + 4x5 + 6x4 - 3x3 + 2x - 9.
2. Ecrivez un programme en langage C permettant le calcul de la valeur prise par un polynôme en un point
α sans utiliser de tableau pour le calcul. Les coefficients de P(x) et le point α seront saisis au clavier.
TD#02
Exercice 5 : Lagrange : Méthode développée
Soit le tableau de données suivant :
Xi 0 2 4 6
F(x) = 3x2+2=Yi 2 14 50 110
Calculez par interpolation de Lagrange la valeur de y=F(α) pour α = 5.
Exercice 8 : Vu en TP…
• Ecrivez un programme en C qui calcule la valeur du polynôme d'interpolation en un point α par la
méthode de Lagrange. On prendra soin à ne pas stocker les coefficients de Lagrange dans un tableau.
Yn
↵ xj
Utilisez l'expression des coefficients de Lagrange Li = pour ce programme et non Φ(x).
x
j=0 i
xj
TD#03
Exercice 9 : Newton : Interpolation polynomiale
Soient les données suivantes : x0 = 0, h = 0,1, n = 6, les yi=f(xi) sont dans la liste suivante :
0 5,73 11,53 17,46 23,58 30,0 36,87
1. Construisez le tableau des différences
2. Calculez la variable réduite u pour α = 0,25
3. Calculez par interpolation la valeur de f(0,25)
• En supposant que l'on connaisse xn, une approximation de α, racine de la fonction ƒ(x), exprimez !hˆ ,
l'erreur estimée en fonction de xn, en utilisant le développement limité de ƒ(x) tronqué à l'ordre 1.
TD#04
Exercice 15 : Méthode de Bairstow
• En utilisant Bairstow, déterminez les racines de P(x) = x3 - 2x2 - 5x + 6. On prendra S0 = P0 = 1 et ε=10-2
TD#06
Exercice 30 : Equation différentielle simple, méthode de Taylor.
1. Calculez la valeur que prend g(x) en x = {2, 3, 4 } sachant que g(x) vérifie l'équation différentielle : y' = x
en utilisant la méthode de Taylor. On précise les C.I. : x0 = 1 et y0 = 2 et le pas d'intégration h = 1.
2. Vérifiez les valeurs trouvées en intégrant l'équation différentielle.
Contrat de Confiance TD
Exercice I
Soit le support numérique :
x 0 1 2 3
F(x) -3 -1,5 2 7,5
• Quel est le degré du polynôme d’interpolation passant par ces points ?
• Donnez l'expression de (x)
• A l'aide des méthodes de Lagrange et d'Horner déterminez les coefficients du polynôme d'interpolation.
• Calculez la somme des coefficients de Lagrange.
Exercice II
Soit P3(x) un polynôme de degré 3 s’exprimant : P3(x) = x3 - 2x2 - 5x + 6. Dans ce qui suit, tous les calculs
seront menés à l'aide de la méthode d'Horner.
• Déterminez les coefficients du polynôme quotient Q(x) résultat de la division de P3(x) par x - 2.
• Donnez la valeur du reste de la division de P3(x) par x - 2.
• Calculez la valeur de Q(x) en x=3. À l'aide de ce résultat et sans calculer directement P3(x) en x=3, donnez
la valeur de P3(x) en x=3.
Exercice III
Dans ce qui suit, tous les calculs seront menés à l'aide de la méthode d'Horner.
Soit le polynôme : P(x) = x3-13x+12.
• Calculez la valeur de P’(x) en x=1. Donnez alors l’expression du polynôme Q1(x) = P(x)/( x - 1 ) .
Donnez la valeur du reste de la division.
• Calculez l’expression de Q3(x) = P(x)/(x-3), de Q-4(x) = P(x)/(x+4). Donnez dans chaque cas la valeur du
reste de la division.
• Proposez à partir des résultats des questions précédentes, une écriture de P(x) en fonction de ses racines
sous la forme : P
! (x) = (x − α1)(x − α2 )(x − α3). Justifiez votre réponse.
Exercice IV
Soit le support numérique :
Xi -1 0 2 3
F(Xi) =Yi 11 7 5 7
• Quel est le degré du polynôme d’interpolation passant par ces points ?
• Déterminez la valeur en x=1 que prend le polynôme d’interpolation en utilisant la méthode de Lagrange.
• Que vaut la somme des coefficients de Lagrange ?
• La valeur théorique est Y=5 pour X=1. Quelle conjecture peut-on faire quant à la nature de la F(X) ?
Exercice V
On cherche à calculer la dérivée d'une fonction y = F(x) connue par ses points { {0 , -2}, {1 , -1}, {2 , 2} }.
Pour évaluer la dérivée en ces points, on se propose d'interpoler par la méthode de Lagrange la fonction F,
puis de dériver le polynôme obtenu.
• Donnez l'expression générale des coefficients de Lagrange. On donnera les deux formes vues en cours.
• Déterminez les coefficients des trois polynômes-coefficients de Lagrange
• Donnez l'expression littérale sous forme canonique décroissante du polynôme d'interpolation.
• Calculez la valeur de la dérivée aux points 0, 1 et 2 en utilisant la méthode de Horner
Exercice VI
Soit le support numérique :
X 0 1 2
Y=F(X) Y0 Y1 Y2
• Quel est le degré du polynôme d’interpolation passant par ces points ?
• Donnez l’expression littérale du polynôme d’interpolation en fonction de Y0, Y1 et Y2.
• En intégrant le polynôme obtenu entre X=0 et X=2, exprimez la valeur de l’intégrale I! = ∫ 2 F (x)d x en
0
fonction de Y0, Y1 et Y2.
Exercice VIII
Soit P5(x) un polynôme de degré 5 s’exprimant : P5(x) = x5 – x4 - 13x3 + 13x2 +36x - 36
• Calculez en utilisant le schéma de Horner la valeur P5(2).
• Déterminez le polynôme quotient Q3(x) résultant de la division de P5(x) par T(x) = x2 - 9 : P5(x) = T(x)Q3(x) +
R(x).
Pour ce faire vous rechercherez les racines évidentes de T(x) après l'avoir factorisé puis utiliserez la
méthode d'Horner pour réaliser les deux divisions.
Au vu des résultats de vos calculs vous expliquerez pourquoi cette méthode est ici possible.
Donnez l’expression du reste R(x).
• Calculez la valeur de Q(x),T(x) et R(x) en x=2.
• Retrouvez la valeur de P5(x) en x=2 à l'aide des valeurs calculées précédemment.
Exercice IX
d y (x)
On considère l'équation différentielle : ! = x − 2y
dx
• Calculez les valeurs prises par la fonction y(x) en x = {1, 2, 3} en utilisant la méthode de Runge-Kutta
d'ordre 2 vue en TD. On prendra un pas d'intégration h = 1 et les conditions initiales { x0 = 0 ; y0 = 1 }.
Exercice X
On veut calculer la surface sous la courbe connue par le tableau de points suivant.
X 0 1 4 5
Y 2 -1 2 27
• Donnez une approximation de cette surface en utilisant la méthode des trapèzes.
• Expliquez pourquoi on ne peut utiliser la méthode des trapèzes à pas constant pour calculer cette
surface.
• Utilisez la méthode de Lagrange pour rendre le calcul de cette intégrale par la méthode des trapèzes à
pas constant possible.
• Donnez alors une approximation de la surface en utilisant la méthode des trapèzes à pas constant.
• Comparez et commentez les deux résultats trouvés.
Exercice XI
On cherche à déterminer avec une précision de 1e-6 la racine de l’équation Loge(x)-1 = 0. Pour ce faire on
envisage d'utiliser la méthode de Newton. On indique que le logarithme utilisé est le logarithme base e.
• Etablissez l’expression de la relation de récurrence reliant deux approximations successives
• Calculez une valeur approchée de la racine avec 6 décimales en prenant comme point de départ : x0 : 2.
Exercice XII
Une mesure de courant en fonction du temps a donné le tableau de valeurs suivants :
t (s) 0 1 2 3
I (mA) 20 8 4 2
Afin déterminer avec précision l'instant où le courant devient égal à 6mA, vous procéderez de la manière
décrite ci-après.
• Déterminez l'ensemble des coefficients de l'expression canonique décroissante du polynôme
d'interpolation
PL(t) = I(t) en utilisant la méthode de Lagrange.
• On cherche t tel que : I(t) = 6. Dans cette équation remplacez I(t) par PL(t). Donnez l'expression de
l'équation alors obtenue.
• En utilisant les méthodes d'Horner et de Newton, déterminez la valeur qui vérifie l'équation obtenue à la
question 2. Vous donnerez une valeur approchée de la racine avec une précision meilleure que 10-2. Le
point de départ sera pris égal à 1. Les calculs seront menés avec une précision de 4 décimales.
Exercice XIII
1
On considère l'équation différentielle suivante : i′! (t ) = (1 − i (t )) . On précise : τ = 0,5, et à t = 0, i(t) = 0.
τ
• Donnez la valeur du courant i(t) à t = 0,1 ; 0,2 ; 0,3 secondes en utilisant une méthode de Runge-Kutta
d'ordre 2 vue en TD et en utilisant un pas d'intégration égal à 0,1.
Exercice XIV
Soit P3(x) un polynôme de degré 3 s’exprimant : P3(x) = x3 - 2x2 - 5x + 6
• Déterminez une racine du polynôme par la méthode de Newton en prenant comme point de départ x =
2.
• Même question en prenant comme point de départ x =1,25.
La précision des calculs sera d’au moins 4 décimales. Tous les calculs polynomiaux seront menés à l’aide de
la méthode de Horner. La solution sera donnée avec une précision meilleure que 10-2.
Exercice XV
Soit le support numérique :
Xi -1 0 1 2 3
Yi 6 1 -2 -3 -2
• Quel est le degré du polynôme d’interpolation passant par ces points ?
• Calculez la valeur que prend le polynôme d’interpolation en x=2 par la méthode de Lagrange en utilisant
la méthode du tableau vue en TD. Pour ce calcul on ne prendra pas le point {2, -3} dans le tableau de
données ci-dessus (colonne grisée).
• Déterminez les coefficients du polynôme d’interpolation PL(x) en utilisant la méthode de Lagrange.
Exercice XVI
L'algorithme d'Héron d'Alexandrie permet d'extraire la racine carrée d'un nombre par une méthode
itérative. En utilisant la méthode de Newton (racine d'une équation), établissez cette méthode itérative.
Indication : l'équation dont on cherche la racine est g(x) - A = 0 où A est le nombre dont on cherche la racine
carrée et
g(x) la fonction qui à x associe x2.
• Déterminez la racine carrée de 2 avec une précision meilleure que 10-4 en prenant comme point de départ
x0 = 1.
Exercice XVI
d g (x)
On considère l'équation différentielle suivante : ! = 6x + 2
dx
• Calculez les valeurs prises par la fonction g(x) en x = {0, 1, 2}. On prendra h = 1 et les conditions initiales
{ x0 = -1 ; y0 = -1 } en utilisant la méthode de Runge-Kutta d'ordre 2 vue en TD.
Exercice XVII
Nota Bene : tous les calculs de cet exercice se feront avec exactement 4 chiffres significatifs.
Un circuit à composant actif a une réponse en courant pouvant être approchée par l’expression suivante
i(v) = 10(1 − e x p (−4v)), on cherche à déterminer son point de fonctionnement en déterminant le point
d’intersection avec la droite de charge : i(v)
! = 10 − v
• En écrivant l’égalité des courants, donnez l’expression de l’équation à résoudre.
• Résolvez cette équation par la méthode de Newton en prenant comme point de départ v = 0,6 V. La
solution doit être donnée avec une précision de 0,01V.
Exercice XVIII
Nota Bene : tous les calculs de cet exercice se feront avec exactement 4 chiffres significatifs.
!
À l’instant t = 0, on ferme l’interrupteur k. À cet instant le courant dans le circuit est nul.
• Donnez la relation liant le courant i(t) à Vs(t) aux bornes de la résistance R.
• Donnez la tension Vs(t) aux temps 2.10-3, 4.10-3, 6.10-3 s en utilisant la méthode de Runge Kutta d'ordre 2
d i (t )
vue en TD après mise en forme de l’équation différentielle ! = …et détermination des conditions
dt
initiales.
Le pas d’intégration h sera pris égal à 2.10-3 s.
di
On donne l’équation différentielle gouvernant le circuit : E
! =L + R i (t )
dt
On donne R = 10 Ω ; L = 0,1H ; E = 10V.
Exercice XIX
Soit le support numérique suivant :
X -2 0 2 4 6
Y 0,25 1 4 16 64
• Calculez la valeur que prend le polynôme d’interpolation en α=1 par la méthode de Lagrange en utilisant
le tableau ci-dessus.
• La valeur trouvée vous semble-t-elle correcte ? Justifiez votre réponse.
• Les Y sont issus de la fonction f! (x) = 2x. Quelle méthode proposez-vous pour calculer une approximation
exacte ? Faites le calcul et comparez alors la valeur trouvée avec la valeur de la fonction ƒ(x) en x=1.
Exercice XX
• Comment calcule-t-on x! n+1 si l’on connaît x! n et que l’on recherche une valeur approchée d’α une racine
de f! (x) par la méthode de Newton ?
• Donnez des critères nécessaires à la convergence de la méthode de Newton. Sont-ils numériquement
exploitables ? Justifiez vos réponses.
Exercice XXI
• Soit le vecteur float a[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
Définissez un pointeur L de type float pointant vers le 8ème élément de a.
• Que vaut alors L[0] ?
• Que vaut alors L[4] ?
• Que vaut alors *(L-5) ?
• Donnez la syntaxe de déclaration de variables structurées en vous aidant d’un exemple complet
(déclaration de type incluse).
• Donnez la syntaxe générale de déclaration des fonctions, celle des prototypes, expliquez leur rôle.
• Précisez les endroits où il est possible de déclarer des variables, donnez leur portée dans chacun des cas.
• A quoi correspondent les paramètres d’une fonction ?
• Qu’entend-t-on par “passage par adresse ?”
Exercice XXII
• Déclarez un type de variable susceptible de contenir 53 entiers.
• Déclarez une variable du type créé précédemment.
• À la déclaration, initialisez toute les éléments de la variable créée à zéro
• En utilisant le type défini au premier point, déclarez une matrice M de 10 colonnes par 53 lignes.
• Que contient l'élément M[10][48] ?
• Définissez une chaîne de caractères S pouvant contenir 16 caractères.
• En utilisant la fonction sprintf entrez la chaîne “Il est beau Coco” (espaces compris) dans la variable S.
• Affichez la longueur de la chaîne de caractères par deux méthodes différentes.
Exercice XXIII
! 3(x) = x 3 − 4x + 2 que l’on a tracé sommairement
On se propose de déterminer les racines du polynôme P
ci-dessous. Donnez les racines avec une précision de 10-3 en utilisant la méthode de Newton. Pour chaque
racine, choisissez une valeur de départ arrondie à 0,5 près. Pour chaque racine vous justifierez le choix du
point de départ.
15
10
-5
-10
! -3 -2 -1 0 1 2 3
Exercice XXIV
! (x) = x 3 + x 2 − 14x − 24. On se propose de déterminer toutes ses racines à l'aide de la
Soit le polynôme P
méthode de Bairstow.
• Déterminez les valeurs de S et P vers lesquelles converge la méthode de Bairstow pour le polynôme P(x) si
l'on prend S0 = 1, P0 = -7. Donnez l'expression du polynôme quotient.
• Déterminez l'expression du polynôme quotient Q(x) et du reste R(x) tel que l'on ait :
! (x) = (x 2 − 2x + 8)Q(x) + R(x).
P
• À l'aide des deux premières questions et du schéma de Horner, exprimez P(x) sous la forme :
! (x) = (x − α1)(x − α2 )(x − α3). Donnez alors toutes les racines de P(x).
P
Exercice XXV
2,5
On se propose d'évaluer l’intégrale I! = ∫0 F (X )d X. F(X) est connue par ses valeurs :
X 0 0,5 1 1,5 2 2,5
Y -1 -0,9 0 4 15 38
• Peut-on calculez la valeur de l'intégrale par la méthode de Simpson ?
• Montrez qu'il est possible de calculer la valeur de l'intégrale I en combinant les méthodes des Trapèzes et
de Simpson. Donnez les 3 solutions permettant d'utiliser la méthode de Simpson sur l'étendue la plus
large possible
• Donnez les 3 approximations de l'intégrale I en utilisant chacune des 3 solutions proposées ci-dessus.
Quelle est la meilleure approximation selon vous ? Justifiez votre réponse.
Exercice XXVI
Soit P(x) = x5 - 3x4 -5x3 + 15x2 + 4x -12.
• Ce polynôme a deux racines évidentes. Trouvez-les, puis, à partir de ces racines, déterminez S et P tel que
l'on ait :
P(x) = ( x2 - Sx + P )Q1(x).
• Déterminez les coefficients de Q1(x) par la méthode de Bairstow.
• Déterminez les racines de Q1(x) par la méthode de Bairstow en prenant d'abord {S=2, P=1}, puis {S=1,
P=1}. Donnez tous les coefficients du polynôme quotient Q2(x).
• Calculez alors toutes les racines de P(x) et écrivez P(x) sous forme factorisée.
Exercice XXVII
• Soit le support numérique :
xi -4 -2 0 2 4
yi=F(xi) 6 -6 -10 -6 6
• Quel est, a priori, le degré du polynôme d’interpolation passant par ces points ?
• Calculez la valeur en x=1 que prend le polynôme d’interpolation déterminé par la méthode de Newton.
• On sait par ailleurs que F(1) = -9. Comparez cette valeur avec celle que vous avez trouvé.
Quelle conjecture pouvez-vous faire quant à la nature de la fonction F ?
Aviez-vous une autre raison pour émettre cette hypothèse ?
• En supposant les conditions requises vérifiées, calculez à l’aide du tableau des différences la valeur de la
fonction
F(x) en x = 6.
Exercice XXVIII
Soit le support numérique :
X 0 1 2 3
Y=F(X) 3 4 7 12
• Quel est le degré du polynôme d’interpolation passant par ces points ?
• F(X) est une fonction polynomiale. A l'aide du tableau des différences déterminez son degré.
• Déterminez la valeur de tous les coefficients de la forme canonique croissante du polynôme
d’interpolation exprimé en variable réduite u.
• En remplaçant la variable réduite par son expression, déterminez l'expression du polynôme
d'interpolation. On donnera la valeur de tous les coefficients de sa forme canonique décroissante.
Exercice XXIX
En utilisant la méthode de Taylor à l'ordre 2, résolvez l'équation différentielle y'=x*y.
• Donnez la relation permettant de calculer yk+1 à partir de yk , xk et h.
• En utilisant les conditions initiales x0=0, y(x0)=0 et un pas d'intégration h égal à 1, calculez la valeur de y(4).
• En utilisant les conditions initiales x0=0, y(x0)=1 et un pas d'intégration h égal à 1, calculez la valeur de y(2).
Exercice XXX
En utilisant la méthode de Taylor à l'ordre 2, résolvez l'équation différentielle y'=3x-1.
• Donnez la relation permettant de calculer yk+1 à partir de yk , xk et h.
• En utilisant les conditions initiales x0=1, y(x0)=1 et un pas d'intégration h égal à 1, calculez la valeur de y(4).
Exercice XXXI
En utilisant la méthode d'Euler corrigée, déterminez y(0,2) sachant que le fonction y vérifie l'équation
dy 2
différentielle : ! =1− x .
dx 2
• On pendra comme conditions initiales y(0)=0 et un pas d'intégration égal à 0,1. La précision de l'affinage
sera pris égal à 10-3. A chaque calcul on calculera la solution Euler, puis l'affinage.
• Justifiez le fait que l'affinage ne comportera ici qu'un seul calcul, et ce quelque soit la précision attendue.
Exercice XXII
En utilisant la méthode d'Euler corrigée, déterminez y(1) sachant que le fonction y(x) vérifie l'équation
dy
différentielle : ! = 1 − y 2.
dx
• On pendra comme conditions initiales y(0)=1 et un pas d'intégration égal à 1. La précision de l'affinage
sera pris égal à 10-3. A chaque calcul on calculera la solution Euler, puis l'affinage.
• Même question mais avec un pas d'intégration égal à 0,5.
En utilisant la méthode de Taylor à l'ordre 2, calculez y(1) en prenant les mêmes conditions qu'au point 1.
• Que pouvez-vous conjecturer quand à la solution de cette équation différentielle avec ces conditions
initiales ?
A. Méthode de Bairstow
A.i. Introduction
Cette méthode qui date des années 1970 n'est adaptée qu'à la détermination des racines de fonctions
polynomiales. Elle est lente et coûteuse en temps de calcul, mais à l'avantage de “marcher”
systématiquement ou presque. Elle permet, de plus, de déterminer toutes les racines qu'elles soient réelles ou
non.
La méthode est basée sur la division du polynôme par un trinôme : T (x) = x2 Sx + P
On écrit : P (x) = (x2 Sx + P )Qn 2 (x) + R(x)
L'idée est de rechercher, non pas les racines de P(x), mais les valeurs de S et P qui annulent R(x), le reste, qui
est un polynôme du premier degré.
En effet, si S et P annulent R(x) alors si α est racine de T(x), par suite, il est aussi racine de P(x).
Pourquoi S et P ?
T(x) = x2-Sx+P = (x-α)(x-β) est un trinôme il accepte deux racines α et β qui vérifient :
S= +⇥
! P = ⇥
A.ii. La méthode
On se donne S0 et P0 arbitraires, on calcule le reste R(x) puis on ajuste S et P en S1, P1 jusqu'à ce que l'on ait
M ax(|Sn+1 Sn |, |Pn+1 Pn |) < la précision souhaitée.
On retient alors Sn+1 et Pn+1 comme valeurs approchées de S et P.
Posons :
P (x) = a0 xn + a1 xn 1
+ a2 xn 2
+ · · · + an 1x + an
Q(x) = b0 xn 2
+ b1 xn 3
+ b2 xn 4
+ · · · + bn 3x + bn 2
!
R(x) = R0 x + R1
En identifiant P(x) à T(x)*Q(x)+R(x) et ce quelque soit x, on obtient un système d'équations qui ne peut
avoir de solution que si les termes de puissance égale sont égaux, c'est à dire que les coefficients du
polynôme sont les mêmes des deux cotés de l'égalité.
Soit en développant :
Puissance terme de P terme de T(x)Q(x) + R(x)
xn a0 b0
xn-1 a1 b1 - Sb0
xn-2 a2 b2 - Sb1 + Pb0
… … …
xn-k ak bk - Sbk-1 + Pbk-2
… … …
x2 an-2 bn-2 - Sbn-3 + Pbn-4
x an-1 R0 - Sbn-2 + Pbn-3
cste an R1 + Pbn-1
Ce qui nous intéresse est de calculer les coefficients bk il vient :
b0 = a0
b1 = a1 + Sb0
b2 = a2 + Sb1 - Pb0
…
bk = ak + Sbk-1 - Pbk-2
…
R0 = an-1 + Sbn-2 - Pbn-3
R1 = an - Pbn-1
Afin de garder la même relation de récurrence tout au long du calcul, on pose :
bn-1 = an-1 + Sbn-2 - Pbn-3
bn = an + Sbn-1 - Pbn-2
Avec cette convention, le reste R0x + R1 s'écrit : bn-1(x-S) + bn, soit R1 = bn - Sbn-1
Le reste de la division R(x) : bn-1(x-S) + bn est fonction de S et de P. On pose :
F(S,P) = bn-1 et G(S,P) = bn - Sbn-1
Si S et P sont les valeurs qui annulent R(x), alors on a simultanément :
F(S,P) = 0 et G(S,P) = 0
Afin de déterminer S et P, on utilise une méthode itérative dont le principe est le suivant :
On construit une suite Sn , Pn telle que :
lim Sn = S et lim Pn = P
n ⇥ n ⇥
Au rang n de la suite, on connaît Sn et Pn, il est donc possible d'écrire :
S = Sn + S et P = Pn + P
Où ∆S et ∆P sont respectivement l'erreur commise sur S et P au rang de la suite. On a donc :
0 = F (Sn + S, Pn + P)
0 = G(Sn + S, Pn + P)
Bien entendu ∆S et ∆P ne sont pas connus. La méthode consiste justement à essayer de les évaluer.
Exprimons F et G sous forme d'un développement limité que l'on tronque à l'ordre 1. Soit :
0 F (Sn , Pn ) + F
S S+ F
P P
0! G(Sn , Pn ) + G
S S+ G
P P
On réécrit les équations ci-dessus en les égalant à zéro. On commet, ce faisant, une erreur que l'on inclue
dans les valeurs de ∆S et ∆P. On note ces valeurs approchées : $ S et P . On peut, alors, écrire :
0 = F (Sn , Pn ) + F
S S+ F
P P
! 0 = G(Sn , Pn ) + S S+
G G
P P
Ce système d'équation peut être mis sous forme matricielle :
⇥⇤ ⌅ ⇥
F F ⇧S F (Sn , Pn )
S P = Soit : Ax = B
G G ⇧P G(Sn , Pn )
! S P
$ n+1 = Sn +
S S et Pn+1 = Pn + P
Toutefois, nous n'avons pas les valeurs numériques des dérivées partielles... Il nous faut donc calculer les
F F G G
valeurs de : S , P S, P
bk F G
➡ Calcul de S ce qui permettra d'évaluer : S, S
b0
S = a0
S =0
b1
S = a1
S +S b0
S + b0 S
S = b0 ⇥ c0
b2
S = a2
S +S b1
S + b1 S
S P b0
S b0 P
S =S b1
S + b1 = b1 + Sc0 ⇥ c1
b3
S = a3
S +S b2
S + b2 S
S P b1
S b1 P
S =S b2
S + b2 P b1
S = b2 + Sc1 P c0 ⇥ c2
..
.
bk bk
bk
S = ak
S +S S
1
+ bk S
1 S P S
2
bk P
2 S = bk 1 + Sck 2 P ck 3 ⇥ ck 1
..
.
bn an bn bn
S
1
= S
1
+S S
2
+ bn S
2 S P S
3
bn P
3 S = bn 2 + Scn 3 P cn 4 ⇥ cn 2
bn bn
!
bn
S = an
S +S S
1
+ bn S
1 S P S
2
bn P
2 S = bn 1 + Scn 2 P cn 3 ⇥ cn 1
De manière générale, on constate qu'il s'agit d'appliquer une nouvelle division par T(x) et que l'on a :
bk
= ck 1
$ S
Comme G(S,P) = bn - Sbn-1 il vient :
G bn bn 1
= S bn 1 = cn 1 Scn 2 bn 1
$ S S S
bn
Afin d'éviter ce terme bn-1, on calcule le terme S
en lui retranchant le terme bn-1 soit :
bn
= Scn 2 P cn 3 ⇥ cn 1
$ S
b1
P = a1
P +S b0
P + b0 S
P =0
b2
P = a2
P +S b1
P + b1 S
P P b0
P b0 P
P = b0 ⇥ c0
b3
P = a3
P +S b2
P + b2 S
P P b1
P b1 P
P = Sc0 b1 ⇥ c1
b4
P = a4
P +S b3
P + b3 S
P P b2
P b2 P
P = Sc1 b 2 + P b0 ⇥ c2
..
.
bk bk
bk
P = ak
P +S P
1
+ bk S
1 P P P
2
bk P
2 P = bk 2 Sck 3 + P ck 4 ⇥ ck 2
..
.
bn an bn bn
P
1
= P
1
+S P
2
+ bn S
2 P P P
3
bn P
3 P = bn 3 Scn 4 + P cn 5 ⇥ cn 3
bn bn
!
bn
P = an
P +S P
1
+ bn S
1 P P P
2
bn P
2 P = bn 2 Scn 3 + P cn 4 ⇥ cn 2
On a donc :
bk
= ck 2
! P
D'où :
F bn 1 G bn bn 1 S
= = cn 3 et = S bn 1 = cn 2 + Scn 3
! P P P P P P
Le calcul des déterminant donne :
det(A1 ) = bn 1 cn 2 bn cn 3
det(A2 ) = bn 1 cn 1 bn cn 2
det(A)
! = cn 1 cn 3 c2n 2
Ce qui permet d'exprimer :
bn 1 cn 2 bn cn 3 bn 1 cn 1 bn cn 2
S= et P =
! cn 1 cn 3 c2n 2 cn 1 cn 3 c2n 2
➡ En résumé
3. On choisit arbitrairement des valeurs pour S et P.
Méthode de Bairstow 18 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
4. On calcule les bk et les ck (attention ! il n'y a pas de cn et cn-1 est calculé sans bn-1)
5. On calcule $ S et P.
Différence : z 1 – z 2 =a−c j b – d
Conjugué : z1 =a – jb
∣z 1∣=1 = z 1∗ z1 = a b
2 2
Module :
Angle :
Diagramme d'Argand
z =a jb
b α a= cos0 b
=atan ?
b =sin 0 a
a β
Arc tangente est à image dans [ −
;
2 2 ]
L'angle α s'obtient en tenant compte des signes de a et b.
C'est ce que fait la fonction atan2 dont le prototype est :
double atan2(double y, double x);
j
Logarithme : z =a jb =e log z =log j
2. Exercice 1
★ Ecrivez une fonction qui calcule la valeur de la fonction !F (t) = 230 2si n(ωt) en un point t.
✦ Déterminez les paramètres d'entrée de la fonction.
✦ Donnez le type de variable retournée.
✦ Choisissez un nom de fonction, et écrivez-là ainsi que son prototype.
✦ À l'aide de la fonction écrite, calculez les valeurs prises par un signal de fréquence 50 Hz
durant une période sur 100 points. (Calculs dans la fonction main() )
★ Modifiez la fonction pour qu'elle retourne tous les points dans une variable dimensionnée.
Déterminez les paramètres de cette fonction ainsi que son type.
★ Créez un type de variable dimensionnée que vous appellerez datas. Modifiez la fonction précédente
pour qu'elle utilise en paramètre une variable de type datas.
3. Exercice 2
✦ Créez un type de variable appelé vect pouvant contenir dim éléments réels. dim est une
constante définie en directive de compilation.
✦ Ecrivez une fonction appelée saisie, qui saisisse les coordonnées d'un vecteur de dimension
dim. dim est-il un paramètre de la fonction ?
✦ Ecrivez une fonction appelée produit qui calcule le produit scalaire de deux vecteurs.
Déterminez quelles sont les paramètres nécessaires à cette fonction.
★ À l'aide de ces deux fonctions, saisissez deux vecteurs X et Y, puis calculez le produit scalaire de ces
deux vecteurs et affichez le résultat.
✦ Créez un type de variable appelé mat, permettant de stocker les éléments d'une matrice
composée d'une collection de dim vect.
Texte du TP 1 21 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
✦ Ecrivez une fonction appelée extrait, qui extrait d'une matrice M la colonne k et la stocke dans
un vecteur V. Déterminez les paramètres de la fonction.
✦ Ecrivez une fonction affiche qui affiche sous forme matricielle une matrice à l'écran. Déterminez
les paramètres nécessaires à cette fonction.
★ À l'aide des fonctions produit et extrait, calculez le produit matriciel de deux matrices A et B dans la
fonction main. La saisie des deux matrices se fera à l'aide de la fonction saisie dans la fonction main.
★ Testez votre programme sur des matrices de rang 3 et des vecteurs de dimension 3.
tV est un vecteur à gauche ou vecteur ligne, V2 est un vecteur à droite ou vecteur colonne. On note les
1
vecteurs ligne tV
Une matrice est un collection de vecteurs : M = [[V1 ] . . . [Vn ]]
2 3 2 3
1 2 3 1
Ainsi la matrice M = 4 5 6 7 5 est en fait le regroupement des trois vecteurs : V1 = 4 5 5,
9 4 3 9
3 2 2 3 22 32 32 33
2 3 1 2 3
V2 = 4 6 5, V3 = 4 7 5,soit M = 44 5 5 4 6 5 4 7 55
4 3 9 4 3
Mais la matrice M peut aussi être vue comme composée de vecteurs Ligne :
2 ⇥ ⇤ 3 2 t 3
⇥ 1 2 3 ⇤ U1
M =4 ⇥ 5 6 7 ⇤ 5 = 4 t U2 5
t
! 9 4 3 U3
Le produit matriciel est donc le produit des vecteurs ligne de la matrice à gauche par les vecteurs colonnes
de la matrice à droite :
3 2 t
U1
M.M = 4 t U2 5 . [[V1 ] [V2 ] [V3 ]]
t
!
U3
Il s'agit donc d'un ensemble de produits scalaires et l'élément ligne i, colonne j de la matrice résultat est en
fait le produit scalaire du vecteur t Ui .Vj
Exemple de résultat :
0 1 0 1 0 1
1 2 3 2 6 7 5 10 24
A = @ 5 6 7 A;B = @ 5 2 7 A ; A ⇤ B = @ 13 42 84 A
! 9 4 3 1 0 1 41 46 38
Texte du TP 1 22 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
TP 2 : les Pointeurs
1. Rappels.
1.1. Pointeurs simples
Un pointeur est une variable qui contient des adresses. Au même titre qu'une variable de type int contient
un entier, le contenu d'un pointeur est une adresse.
On déclare un pointeur en faisant précéder son nom d'un astérisque.
type *nom;
Les variables n'ayant pas toutes la même longueur les pointeurs sont typés. Ainsi, il y a des pointeurs sur des
int, des pointeurs sur des float etc.
Avec un pointeur il est possible d'afficher, de manipuler des adresses.
printf("%X", adresse) ; // affiche une adresse sous forme hexadécimale (base 16)
Il est possible d'ajouter des adresses. Si X est une adresse correspondant à une variable int, alors X+1 est
l'adresse du prochain int possible.
2. Exercice 1
Tout ce qui suit doit être écrit dans la fonction main.
★ Créez deux variables de type float a, b, ainsi que deux pointeurs p1 et p2. Faites pointer p1 vers a,
p2 vers b.
A partir de maintenant vous n'accéderez plus aux variables a et b qu'à travers les pointeurs.
★ Entrez, à l'aide d'instructions scanf un contenu dans a et b.
★ Calculez b = b*a
★ Affichez le contenu de a et de b
★ Comparaison : si a est plus grand que b affichez "A est plus grand" ; "B est plus grand ou égal" sinon.
Texte du TP 2 23 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
L'utilisation de pointeurs tel que vu dans cet exercice est possible. Toutefois, convenez-en, cela ne sert
à rien, autant utiliser a et b ! Cet exercice n'a d'autre but que de vous faire manipuler les syntaxes
pointeur.
3. Exercice 2
★ Ecrivez une fonction qui saisisse deux float à l'aide de pointeurs, le prototype sera
void saisie( float *a, float *b);
★ Ecrivez une fonction calcule le produit de deux float, et retourne le résultat à l'aide d'un pointeur. Le
prototype sera d'abord :
void calcul1 (float *a, float *b); // résultat dans b
puis
void calcul2 ( float a, float b, float *c); // résultat dans c
★ A l'aide des trois fonctions écrites ci dessus, depuis la fonction main, saisissez deux nombres réels,
puis calculez et affichez leur produit. Vous n'utiliserez que deux variables dans main. D'abord avec la
fonction calcul1, puis calcul 2.
4. Exercice 3
★ Dans la fonction main, déclarez une variable dimensionnée appelée X pouvant contenir 50 float.
★ Ecrivez une fonction appelée saisie. Elle demandera le nombre de points que l'utilisateur veut saisir,
puis procédera à la saisie des points. L'interface de la fonction sera
void saisie( float x[50], int *n);
✦ Saisissez les valeurs suivantes : { 5, 9, 4, -2 } à l'aide de saisie, puis affichez-les depuis la fonction
main.
★ Même question avec cette fois l'interface suivante pour la fonction saisie :
void saisie( float *x, int *n);
★ Créez un type de variable pouvant contenir 50 float appelé datas.
✦ Remplacez dans la fonction main, la déclaration de X par datas X; Lancez le programme sans
modifier la fonction saisie. Conclusion ?
✦ Modifiez le programme précédent pour que l'on saisisse 4 valeurs à partir de l'élément 9 (donc
dans X[9], X[10], X[11], X[12]). Affichez les 15 premiers éléments de x. Conclusion ?
★ Complétez le programme précédent en écrivant une fonction qui affiche à l'écran, les n dernières
valeurs en ordre inverse d'une variable dimensionnée ainsi que leur position, la fonction aura
l'interface suivante :
void affiche( float *P, int n);
Indication : Si l'on appelle la fonction ainsi : affiche( &X[10], 3), cela provoquera l'affichage suivant :
0 X[10] // comprendre par X[10] la valeur de cette variable.
-1 X[9] // idem etc.
-2 X[8]
-3 X[7]
★ A l'aide de ces fonctions, saisissez les 5 valeurs suivantes à partir de la position 7 de X : { 8, -2, 4, 0, 3 }.
Affichez alors ces valeurs dans l'ordre inverse de leur saisie à l'aide de la fonction affiche.
Texte du TP 2 24 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
TP 3 : les Structures
1. Structures
Une structure est le regroupement de plusieurs variables pouvant être de types différents sous un même
nom, ces variables sont appelées champs.
Pour utiliser une variable structurée, il est préférable de créer un type. La syntaxe est :
typedef struct { type champ_1 ; type champ_2; … ; type champ_n ; } nom_du_type ;
Pour utiliser le type défini on crée des variables ou des pointeurs.
nom_du_type var1, var2, *var3;
L'accès aux différents champs des variables structurées se fait en indiquant précisant le champ à l'aide d'un
point.
var1.champ_1 ou var1.champ_2 etc.
S'il s'agit d'un pointeur vers une structure, on accède aux champs à l'aide de l'opérateur -> ou en utilisant
des parenthèses :
var3->champ_1 ou (*var3).champ_2
Il est possible d'affecter des structures entre elles, pour une fonction de retourner une structure.
var1 = var2; var2 = *var3; // affectation de structures
var1.champ_1=var2.champ_1; var2.champ_2 = var3->champ_2; // affectation de champs
nom_du_type MaFonction( ... ) ; // prototype d'une fonction retournant une structure
2. Exercice
L'objet est de définir les fonctions permettant de réaliser des calculs en complexe : addition, soustraction,
multiplication, conjugué, module, division, angle, logarithme.
★ Saisie / affichage de nombres complexes. Dans chaque cas vous déterminerez le type des fonctions
écrites ainsi que leurs paramètres d'entrée.
✦ Créez un type de variable structurée comportant deux champs re pour la partie réelle, im pour
la partie imaginaire.
✦ Ecrivez une fonction qui affiche un nombre complexe transmis en paramètre à l'écran sous la
forme a + ib. Les nombres seront affichés avec 4 décimales au minimum.
✦ Ecrivez une fonction qui réalise la saisie d'un nombre complexe et le retourne. La fonction devra
demander la partie réelle, puis la partie imaginaire successivement. Cette fonction a-t-elle
besoin d'un paramètre en entrée ?
✦ Testez votre programme en saisissant puis affichant un nombre complexe.
★ Ecrivez dans cet ordre les fonctions réalisant les opérations suivantes. Vous pouvez utiliser les
fonctions précédemment écrites. Respectez le nom de chacune des fonctions qui vous est proposé.
Déterminez pour chaque fonction le nombre de paramètres et le type de valeur retournée.
✦ Addition : C_add
✦ Soustraction : C_Sous
✦ Multiplication : C_mul
✦ Conjugué : C_conj
✦ Module : C_mod
✦ Division : C_div
✦ Angle : C_angle (regardez l'aide en ligne -fonction man- sur la fonction atan2)
✦ Logarithme Népérien : C_log
Testez vos fonctions avec des exemple connus (cf ci-après)
★ Modifiez la fonction saisie pour qu'elle soit de type void. (A TRAITER IMPERATIVEMENT)
3. Exemples de résultats
Entrez la partie reelle : 2
Entrez la partie imaginaire : 3
Entrez la partie reelle : -1
Entrez la partie imaginaire : 1
Texte du TP 3 25 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
Addition :
1.0000 + i 4.0000
Soustraction :
3.0000 + i 2.0000
Multiplication :
-5.0000 + i -1.0000
Conjugue :
2.0000 + i -3.0000
Module :
3.6056
Division :
0.5000 + i -2.5000
Angle :
0.9828
Logarithme :
1.2825 + i 0.9828
Texte du TP 3 26 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
TP 4 : Lecture de fichiers
1. Rappels de langage
Le programmeur n'accède pas directement aux fichiers, il demande au Système d'Exploitation de s'occuper
de toute la gestion technique : pilotage des disques durs etc.
Pour ce faire, il suffit de créer un pointeur de type FILE * (en majuscules !), puis de demander au SE de
créer un lien via ce pointeur. C'est le rôle de la fonction fopen. La lecture s'effectue à l'aide des fonctions
fscanf et fprintf.
Lorsqu'on écrit un fichier, le plus simple est de mettre l'écriture dans une boucle for, en effet on connaît
forcément le nombre d'éléments à écrire.
Par contre lors de la lecture, ce n'est pas le cas. Il faut alors être capable de savoir si l'on a atteint la fin du
fichier. La fonction feof donne cette information. Elle s'utilise le plus souvent avec une boucle de type "tant
que" : tant que ( la fin du fichier n'est pas atteinte )
Enfin, une fois la lecture ou l'écriture finie, il faut fermer le fichier à l'aide de l'instruction fclose.
La syntaxe exacte des fonctions sus-citées est :
fopen( "chemin d'accès au fichier","mode"); // retourne une adresse de type FILE *
Le type d'accès est soit "r" pour la lecture, soit "w" pour l'écriture. Le chemin d'accès utilise des "/" même
sous l'environnement Windows.
fprintf( variable_de_type_FILE, "chaine de format", liste de variables ) ;
fscanf( variable_de_type_FILE, "chaine de format", liste d'adresses de variables ) ;
feof( variable_de_type_FILE ) ;
fclose( variable_de_type_FILE) ;
2. Exercice
Dans ce qui suit, toutes les fonctions à écrire seront de type void.
Vous trouverez sur le bureau de votre poste de travail un fichier intitulé TP4.txt, si le fichier n'est pas
présent, demandez-le à l'enseignant.
Ce fichier est constitué de deux colonnes X et Y (dans cet ordre) de n réels séparées par un espace.
★ Lisez le contenu du fichier TP4.txt dans votre programme en faisant un écho (affichage) à l'écran.
✦ Ne connaissant pas la longueur du fichier, vous créerez un type de variable pouvant contenir
1000 float appelé datas.
✦ Ecrivez une fonction qui lise le fichier TP4.txt, et détermine le nombre de points lus.
Déterminez les paramètres d'entrée et de sortie de la fonction qui s'appellera lecture.
✦ A l'aide de cette fonction, lisez le contenu du fichier, puis dans la fonction main, affichez toutes
les valeurs lues.
Le signal lu est bruité, afin de diminuer ce bruit, on procédera de la façon suivante : chaque fois qu'un des Y
est supérieur à trois fois la moyenne du vecteur Y, on fixe la valeur de cet élément à zéro.
★ Filtrez le signal lu.
✦ Ecrivez une fonction appelée ecriture qui crée un fichier de type texte appelé filtre.txt et
y écrive deux colonnes de valeurs, séparées par une tabulation, transmises en paramètres à la
fonction. Déterminez les paramètres d'entrée et de sortie de la fonction.
✦ Créez une fonction qui calcule la valeur moyenne d'un vecteur. Cette fonction sera appelée
moyenne vous déterminerez les paramètres d'entrée et de sortie.
✦ Calculez, dans la fonction principale la valeur moyenne des ordonnées lues (vecteur Y), puis
appliquez l'algorithme décrit ci-dessus.
✦ Sauvegardez dans un fichier portant le nom filtre.txt les données ainsi traitées. Le fichier
contiendra les vecteurs X et Y séparés par un espace.
★ Lancez le logiciel Octave, puis dans la fenêtre qui s'ouvre tapez les commandes suivantes :
cd Desktop
M = load -ascii filtre.txt ;
Texte du TP 4 27 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
x = M( : , 1 ) ;
y = M( : , 2 ) ;
plot(x,y)
Une fenêtre graphique devrait s'ouvrir contenant la courbe des points que vous avez filtré.
★ On peut améliorer le filtrage en modifiant la procédure utilisée en utilisant un filtrage en deux étapes.
On procède comme précédemment, si Yi est supérieur à trois fois la valeur moyenne de Y, alors on
impose Yi à zéro, en même temps, dans un vecteur auxiliaire Z, préalablement initialisé à zéro, on
impose Zi à un. Dans une deuxième phase, si Zi vaut 1 alors on remplace Yi par la moyenne des
deux points environnants.
Signal non filtré Signal filtré (mise à zéro) Signal Filtré (deux passes)
2
250
200
1.5
150
100
0.5
50
0 0
!
0 2 4 6 8 10 0 2 4 6 8 10
! !
Texte du TP 4 28 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
TP 5 : Dérivées de polynôme
1.Méthode de Horner :
Référez-vous au cours pour plus de détails sur la méthode d'Hörner.
Il est possible de calculer la valeur d'un polynôme et de sa dérivée à l'aide de la méthode suivante dite
méthode de Horner.
Coefs de Pn (x) Calcul de Pn (a) Calcul de Pn0 (a)
a0 b0 = a0 c0 = b0
a1 b1 = b0 a + a1 c1 = c0 ⇤ a + b1
.. .. ..
. . .
ai bi = bi 1 a + ai ci = ci 1 ⇤ a + bi
.. .. ..
. . .
Pn0 (a)
an 1 bn 1 = bn 2 a + an 1 cn 1 = cn 2 ⇤ a + bn 1 = 1!
!
an bn = bn 1 a + an = Pn (a)
Pour calculer la dérivée en un point α donné, il suffit d'enchaîner deux schémas de Horner successifs.
2.Travail à effectuer :
Ecrire un programme qui :
➡ Effectue la saisie des coefficients d'un polynôme de degré inférieur ou égal à 9 et de son degré. La
saisie sera recommencée tant que l'utilisateur n'aura pas saisi un degré compris dans l'intervalle[1 ; 9].
➡ Saisisse la valeur d'un point de départ x0 ainsi qu'un pas h pour calculer la valeur du polynôme et de
sa dérivée sur 26 points régulièrement espacés depuis le point de départ x0.
➡ Cherche dans les valeurs calculées une racine du polynôme et affiche la valeur de la dérivée en ce
point. Dans le cas où il n'y aurait pas de racine le programme affichera le message : "pas de racine
trouvée".
Pour ce faire, vous écrirez les fonctions et définitions de type suivantes. Les commentaires C expliquent le
rôle de chaque variable.
typedef float vect[10];
typedef float pts[26];
void Horner( float *pa , int pn , float pal, float *pP, float *pb);
/* pa pointe vers le vecteur des coefs de P_n(x)
* pn est le degre de P_n(x)
* pal le point de calcul
* pP pointe vers une variable qui contiendra P_n(al)
* pb pointe vers un vecteur qui contiendra les b_i
*/
3.Plan de travail
★ Calcul des valeurs prises par le polynôme :
✦ Ecrivez la fonction saisie. Testez-la en affichant dans la fonction main les coefficients d'un
polynôme saisi. Vérifiez que vous ne pouvez entrer un degré > 9, ni < 1.
✦ Ecrivez la fonction Horner. Testez-la avec le polynôme suivant en α = 2 : Pn(x) = x2 + x -3
Vous devez trouver :
Coefs de P2(x) calcul de P2(2)
1 b0 = 1
1 b1 = 1*2+1 = 3
-3 b2 = 3*2 -3 = 3 = P2(2)
Texte du TP 5 29 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
✦ Ecrivez le code nécessaire pour réaliser la saisie de x0 le point de départ et de h le pas. Ces
saisies se feront dans la fonction main.
✦ À partir de x0 et en utilisant le pas h, calculez 26 points équidistants. À l'aide de la fonction
Horner, calculez les valeurs prises par le polynôme saisi avec la fonction saisie et calculez la
valeur de la dérivée en ces points. Vous afficherez le résultat des calculs sous la forme de
colonnes contenant les valeurs correspondant aux intitulés suivants :
n° du point : xi Pn(xi) P'n(xi)
Exemple avec P3(x) = x3 + x2 - 10x + 8, point de départ x0 = -1 pas : h = 0,1
0 : -1.000 18.000 -9.000
1 : -0.900 17.081 -9.370
2 : -0.800 16.128 -9.680
3 : -0.700 15.147 -9.930
…
★ Dans la fonction main écrivez le code nécessaire pour trouver les points dont la valeur absolue1 de
l'ordonnée est inférieure à 10-5. Affichez alors le message suivant :
"Racine au point <indice du point> soit x= <abscisse correspondante>
et P'(x) = <valeur de la dérivée>"
Exemple d'exécution du programme avec le même polynôme que ci-dessus :
1 La fonction pour calculer la valeur absolue d'un float est fabs. Son prototype est dans math.h
Texte du TP 5 30 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
2. Travail à effectuer
Vous écrirez une fonction qui, à partir des pivots Px et Py, calculera la valeur du polynôme d'interpolation en
un point α en utilisant la méthode de Lagrange. Cette fonction aura le prototype suivant :
float lag(vect Px, vect Py, int pn, float palfa );
vect est un type de variable que vous créerez pouvant contenir 10 float.
★ Mise au point du programme
✦ Ecrivez la fonction lag
✦ Testez-la 2 avec l'exemple vu en Travaux Dirigés, vous devez trouver -11,205.
★ Vérification que le polynôme d'interpolation passe par les pivots
✦ Modifiez la fonction horner écrite lors du TP précédent pour qu'elle retourne un float
contenant la valeur calculée du polynôme. Collez-là dans votre programme.
✦ Dans la fonction main, générez un vecteur PivX, dans une variable de type vect contenant cinq
valeurs régulièrement espacées entre -2 et 2
✦ Calculez en utilisant la méthode d'Horner les valeurs PivY prises par le polynôme P3 donné ci-
après. on donne : !P (x) = 5x 3 − 8x 2 + 2x + 3
✦ Calculez et affichez la valeur prise par le polynôme d'interpolation d'une part et d'autre part le
polynôme P(x) calculé avec la méthode d'Horner sur 20 points régulièrement espacés dans
l'intervalle [-2 ; 2]. Affichez les valeurs sous forme de deux colonnes.
✦ Que constatez-vous ? Pouviez-vous prédire ce résultat ?
Point 1 : -39.785 -39.785
Interpolation du TD : -11.205391 -27.530 -27.530
...
Point 2 : 3.128 3.128
P(x) Interpolation 2.991 2.991
-73.000 -73.000 2.566 2.566
-54.848 -54.848 2.130 2.130
1.966 1.966
2.352 2.352
3.569 3.569
5.895 5.895
9.613 9.613
15.000 15.000
2 Il n'est pas demandé de saisie ici, les variables dimensionnées seront initialisées lors de leur déclaration.
1.i. Dichotomie.
Cette approche utilise un algorithme dérivé de celui de la dichotomie.
L'idée est de déplacer une fenêtre de largeur α : [ xk - α ; xk + α ] en diminuant la largeur α cette fenêtre
lorsque le maximum se trouve dans cette fenêtre en suivant l'algorithme de la dichotomie. Le plus simple est
une illustration pour comprendre cet algorithme.
18
17 x2
x1
16
15
x0
14
2*
13
12
2 4 6 8 10 12
!
Fig. 1 : méthode de dichotomie, phase d'approche de la zone du sommet entre deux phases de dichotomie
L'algorithme est le suivant. On calcule F (xk ↵), F (xk ) et F (xk + ↵).
Si la plus grande des trois valeur est F (xk ↵) on calcule xk+1 = xk .
Si la plus grande des trois valeurs est F (xk + ↵) on calcule xk+1 = xk +
Si la plus grande des trois valeurs est F (xk ) on divise ↵ par 2.
On recommence le processus tant que > 2⇥ , la précision souhaitée.
Cette méthode est simple à programmer, c'est celle que vous réaliserez en premier.
Mini-Projet 32 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
15
10
-5
-10
2 4 6 8 10 12
!
Fig. 2 : Points expérimentaux et polynôme d'interpolation. Noter la zone d'interpolation. La dérivée est
calculée à partir du polynôme d'interpolation. Noter qu'elle a deux racines dont une, hors de la zone
d'interpolation, est à rejeter.
Pour déterminer les valeurs prises par la dérivée du polynôme d'interpolation, nous faisons le choix d'utiliser
la méthode d'Horner, il nous faut donc l'expression littérale du polynôme d'interpolation. Dans ce cas
n
∏
l'expression du polynôme d'interpolation à utiliser fait appel à Φ(x)
! = (x − xk ).
k=0
Il faut donc être capable de calculer (x), la méthode de Leverrier-Newton permet ce calcul. Cette
méthode est décrite plus loin.
Φ(x)
Une fois que (x) est connu, il faut calculer les coefficients de Lagrange : Lk (x) =
(x − xk )Φ′(xk )
Les Lk(x) sont le résultat de la division de (x) par (x-xk), ce que l'on peut réaliser à l'aide d'un schéma de
0
Horner, puis par (xk ), que l'on peut calculer à l'aide d'un second schéma de Horner.
Pn
Une fois les Lk(x) calculés on peut calculer P (x) = k=1 Lk (x)Yk
La racine de F'(x), donc de P(x) sera déterminée par la méthode de Newton.
En résumé pour cette seconde méthode, nous aurons besoin de savoir :
• Déterminer l'expression du polynôme d'interpolation par la méthode de Lagrange, ce qui impose de
savoir :
• calculer (x) à l'aide de la méthode de Leverrier-Newton (cf ci-dessous)
• savoir calculer les Lk(x).
• Calculer la dérivée de ce polynôme d'interpolation : méthode d'Horner.
• Déterminer la racine de la dérivée de ce polynôme : méthode de Newton.
Pour chacun de ces points le plus simple est d'écrire une fonction dédiée.
Mini-Projet 33 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
2. Rappels
f (x n )
Or α est racine de f(x), donc f(α) = f(xn+h) = 0. Il vient en négligeant O(h)2 : h ≈ −
f ′(x n )
Ou, en intégrant l'erreur commise dans h, que l'on note alors !h, il vient :!h ̂ = −
b f (x n )
. On calcule alors non
f ′(x n )
f (x n )
pas la valeur d'α, mais une nouvelle valeur de xn que l'on notre xn+1 : x n+1 = x n − qui est une
f ′(x n )
meilleure approximation d'α.
Notez bien qu'un polynôme de degré n, a n+1 coefficients et n racines numérotées, ici, de 0 à n-1.
n−1
xj
∑ k
La méthode consiste à calculer un vecteur contenant la somme des puissances des racines : S! j =
k=0
A partir de ce vecteur, on calcule les coefficients du polynôme sous sa forme canonique en appliquant
l'algorithme suivant :
a0 = 1
a 0 S1 + 1.a1 = 0
a S + a1S1 + 2.a 2 = 0
! 0 2
a 0 S3 + a1S2 + a 2 S1 + 3.a3 = 0
⋮
a 0 Sn + a1Sn−1 + … + a n−1S1 + n . a n = 0
Mini-Projet 35 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
Vous recopierez cette fonction telle quelle dans votre programme pour déterminer le polynôme Φ(x)
!
3. Travail à effectuer
➡ Remarque générale : toutes les variables dimensionnées seront crées à l'aide de pointeurs et en
utilisant la gestion dynamique de la mémoire. Le fichier de données contient 10 points.
➡ Attention ! : La méthode de Leverrier amène à calculer la somme des abscisses jusqu'à la puissance 10
(il y a 10 points). Par conséquent, il n'est pas possible d'utiliser des variables en simple précision (float).
C'est pourquoi toutes les fonctions utiliseront des variables de type double précision.
Dans ce cas, le type de champs à utiliser dans les saisies (scanf, fscanf) et les sorties (printf, fprintf) est %lf
(la lettre 'L' et non le chiffre 1) et non %f.
Mini-Projet 37 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
✦ Testez la fonction avec les points suivants : x0=1, x1=2, x2=3, Vous devez obtenir le polynôme de
degré 3 (avec 4 coefficients donc) : P(x) = x3 - 6x2 + 11x - 6.
★ Ecrivez une fonction permettant le calcul du reste et des coefficients du polynôme quotient de P(x)/(x-
α). Le prototype de cette fonction sera le suivant :
double horner( double *a, double *b, int n, double alfa );
/* a : coefs du polynôme, b : coefs du polynome quotient, n : degre de a
* alpha, point de calcul
*/
★ Ecrivez une fonction servant à déterminer l'expression littérale du polynôme d'interpolation. Cette
fonction utilisera la fonction horner pour calculer chaque coefficient de Lagrange.
void detpoly( double *X, double *Y, int n, double *a)
/* X est un pointeur vers les abscisses et Y vers les ordonnées des points
* pour lesquels on cherche à déterminer l'expression du polynôme d'interpolation
* n est le nombre de points, et a un pointeur vers une zone mémoire suffisante pour
* contenir les coefficients d'un polynôme de degré n-1.
*/
★ Dans la fonction principale, calculez la valeur des coefficients du polynôme dérivé. On rappelle que
l'on a (ak xn )0 = n ⇤ ak xn 1.
★ Ecrivez une fonction qui, en utilisant la méthode de Newton et la méthode d'Horner, détermine une
racine d'un polynôme à partir d'un point de départ x0. Le prototype de cette fonction sera :
double Newton( double *a, int n, double x0 );
/* a = coefs du polynôme, n degre du polynôme, x0 : point de départ de la méthode
* La précision des calculs sera de 1e-6 en précision relative et non absolue.
*/
★ En utilisant le polynôme dérivé, et la fonction Newton, déterminez une valeur approché de l'abscisse
du sommet.
➡ Exemple de calcul :
Mini-Projet 38 P. Castelan
Université Paul Sabatier Techniques Scientifiques Numériques L2 EEA/Méca/GC
Sujet 1
Vous trouverez, un fichier de type texte (exo1.txt) constitué de 4 colonnes comportant chacune le même
nombre d’éléments.
1. La première, des données diverses détaillées ci-dessous.
2. La deuxième, des abscisses de point.
3. La troisième, les ordonnées d’une fonction, f(x), relative aux abscisses de la colonne 2.
4. La quatrième, les ordonnées d’une autre fonction, g(x), relative aux abscisses de la colonne 2.
5. La première colonne comporte dans l’ordre :
Alpha_1.
Alpha_2.
L’indice du dernier élément de chaque colonne, ce qui vous permettra de confirmer le nombre de
points lus.
Valeur théorique de f(Alpha_1).
Valeur théorique de f(Alpha_2).
Valeur théorique de g(Alpha_1).
Valeur théorique de g(Alpha_2).
Ces quatre dernières données serviront à calculer l’erreur relative commise par le polynôme d'interpolation.
• Définissez le type points : typedef float points[Nmax], Nmax est entier et vaut 10.
• Ecrivez un programme comportant obligatoirement 2 fonctions dont les prototypes seront :
void lire(points data, points x, points y1, points y2, int *n);
La fonction lire() permet de lire les données du fichier exo1.txt et de les stocker
respectivement dans les variables data, x, y1 et y2. Le nombre d’éléments par
colonne est retourné via le pointeur *n.
Sujet 2
Le but du programme est de déterminer la racine d'une fonction F connue par ses points par la méthode de
la dichotomie.
• Définissez un type « vect » de 20 éléments réels.
• Ecrivez une fonction « lire » qui a le prototype suivant :
void lire (vect x, vect y, int *n)
Les vecteurs x et y contiennent respectivement le abscisses et les ordonnées de la
fonction F (y = F(x)). Ces données sont contenues dans le fichier « exo2.txt » sous
forme de deux colonnes séparées par un « ; ». Les points sont échantillonnés
régulièrement. La fonction doit retourner le nombre de points à l'aide du pointeur
n.
• Ecrivez une fonction « lag» qui a le prototype suivant :
float lag (vect x, vect y, int n, float al)
Sujet 3
Le but du programme est de calculer la puissance moyenne dissipée dans un dipôle Z sur une période d’un
signal alternatif sinusoïdal et de déterminer le facteur de puissance.
• Définissez un type « vect » de 128 éléments réels.
• Ecrivez une fonction « lire » qui a le prototype suivant :
int lire (vect t, vect i, vect u)
Les vecteurs t, i et u contiennent respectivement le temps, le courant et la tension
aux bornes de Z. Ces données sont contenues dans le fichier « exo3.txt » sous forme
de colonnes séparées par un « ; » pour une période du signal. Les points sont
échantillonnés régulièrement. La fonction doit retourner le nombre de points.
• Dans la fonction main( ), calculez la puissance instantanée et affichez-la à l’écran avec le temps sur deux
colonnes. Note : P(t) = V(t)*I(t)…
• Ecrivez une fonction « trapeze » qui a le prototype suivant :
float trapeze (vect y, int n, float pas)
Cette fonction a pour rôle de calculer et de retourner au programme principal le
résultat de l’intégrale d’une fonction « y » échantillonnée sur « n+1 » points à
l’aide de la méthode des trapèzes.
Dans le programme principal :
• Déterminez h, le pas d’échantillonnage du signal à intégrer.
• Calculez la puissance moyenne sur 1 période du signal.
• Affichez le résultat à l'écran.
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments.
Sujet 4
Votre programme devra lire le fichier de type texte "exo4.txt". La première ligne de ce fichier contient un
nombre entier N. À partir de la deuxième ligne et sur N lignes le fichier comporte deux colonnes de
nombres réels séparées par une tabulation.
• Ecrivez une fonction lire qui aura obligatoirement le prototype suivant :
void lire( float *x, float *y, int *n);
• Lors de la lecture du fichier, la fonction devra afficher à l'écran les valeurs lues sous forme de colonnes.
• Définissez en début de programme un nouveau type de variable qui s'appellera obligatoirement vect et
qui pourra contenir 100 nombres réels.
• Dans la fonction main, procédez à la lecture du fichier "exo4.txt" à l'aide de la fonction lire, puis
déterminez l'indice à partir duquel les éléments de la seconde colonne (les "y") changent de signe.
• Affichez l'écran la valeur k de l'indice, les valeurs x(k) et y(k) correspondantes.
On cherche à déterminer α la racine de la fonction y(x) = exp(x) - 4*sin(x) par la méthode de Newton.
• Ecrivez une fonction Equa_h qui calcule la valeur de h en un x donné, h sera calculé à l'aide de la
méthode de Newton. L'interface sera obligatoirement :
float Equa_h(float x)
• Déterminez la valeur d'α avec une précision meilleure que 10-6 en implémentant dans votre programme la
méthode de Newton. Vous prendrez comme valeur de départ la valeur x(k) trouvée ci-dessus et utiliserez
obligatoirement la fonction Equa_h. Affichez cette valeur à l'écran avec un message indiquant de quoi il
s'agit.
Indication : la fonction pour calculer la valeur absolue d'un float est fabs() qui est dans math.h
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments.
Sujet 5
Votre programme devra lire le fichier de type texte nommé "exo5.txt". La première ligne de ce fichier
contient un nombre entier N. À partir de la deuxième ligne le fichier comporte ensuite N nombres réels.
• Ecrivez une fonction lire qui aura obligatoirement le prototype suivant :
void lire( float *x, int *n);
• Lors de la lecture du fichier, la fonction devra afficher à l'écran les valeurs lues sous forme de colonne.
• Définissez en début de programme un nouveau type de variable qui s'appellera obligatoirement vect et
qui pourra contenir 100 nombres réels.
• À l'aide de la fonction lire, stockez dans une variable x de type vect les points du fichier exo5.txt.
• Calculez, dans un vecteur S, la valeur prise par la fonction S(x) = sin(x) en chaque point du vecteur x. Pour
ce faire, vous écrirez une fonction appelée fonction qui retournera les valeurs de S(x) en chaque point du
vecteur x. L'interface de cette fonction sera :
void fonction(float *x, float *S, int n)
Indication : Il vous faudra inclure la bibliothèque math.h
P (x)
• Ecrivez une fonction qui calcule les coefficients du polynôme quotient Q(x) = x par la méthode
Sujet 6
Votre programme devra lire le fichier de type texte nommé "exo6.txt". La première ligne de ce fichier
contient un nombre entier N. À partir de la deuxième ligne le fichier comporte ensuite des nombres réels. N
est le numéro du dernier point du fichier dans une numérotation débutant à zéro.
• Ecrivez une fonction lire qui aura obligatoirement le prototype suivant :
void lire( float *t, int *n);
• Lors de la lecture du fichier, la fonction devra afficher à l'écran les valeurs lues sous forme de colonne.
• Définissez en début de programme un nouveau type de variable qui s'appellera obligatoirement vect et
qui pourra contenir 100 nombres réels.
• À l'aide de la fonction lire, stockez dans une variable t de type vect les points du fichier exo6.txt.
• Dans la fonction main, en utilisant la méthode de Simpson, calculez et affichez les valeurs moyennes et
efficace du signal V(t). Votre programme devra calculer la valeur h du pas et de la période T.
• Affichez à l'écran les valeurs moyennes et efficaces de V(t) au dos de la copie. Justifiez numériquement les
valeurs trouvées. Proposez une solution pour améliorer les résultats.
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments.
Sujet 7
• Déclarez un type vect pouvant contenir 20 variables de type float.
• Ecrivez une fonction lecture_poly, qui lira le fichier "exo7.txt". Ce fichier est composé d'une seule
colonne. La première ligne (1 élément) du fichier est un entier n qui est le degré d'un polynôme Pn(x). Les
autres données sont les coefficients de ce polynôme P(x). Le fichier est composé comme suit :
n
a0
!a1
⋮
an
Le prototype de la fonction lecture_poly doit être le suivant :
void lecture_poly(int *N, vect A)
Nota Bene : Vous utiliserez obligatoirement une boucle for pour la lecture du fichier.
• Ecrivez une fonction qui effectue le calcul de la valeur d'un polynôme par la méthode d'Horner. Son
interface sera :
void horner( int n, float al, vect a, vect b)
/* n est un entier qui contient le degré du polynôme
* al est un flottant qui contient la valeur du point où est calculé le polynôme
* a est un vecteur contenant les coefficients du polynôme calculé
* b est un vecteur contenant polynôme quotient. */
• Vous écrirez une fonction qui détermine une approximation de la racine de l'équation polynomiale Pn(x) =
0 par la méthode de Newton avec une précision meilleure que 10-4. La valeur de Pn(x) et de sa dérivée
seront calculés en utilisant la méthode de Horner. L'interface sera :
void newton( int n, vect a, float *x0)
/* n est un entier qui contient le degré du polynôme
* *x0 est un flottant qui contient la valeur du point de départ
* puis l'approximation de la racine, a est un vecteur contenant
* les coefficients de Pn(x). */
Nota Bene : la valeur absolue d'une expression d'un type float se calcule avec la fonction fabs() dont la
définition se trouve dans la bibliothèque math.h.
• Effectuez la lecture du polynôme et de son degré à l'aide de la fonction lecture_poly.
• Calculez, en utilisant la fonction Newton. la valeur d'une racine de P(x) en prenant comme point de départ
x0=1. Affichez cette racine.
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments.
Sujet 8
Le but du programme est de calculer la valeur moyenne Vmoy d’un signal sinusoïdal à l’aide de la méthode
des trapèzes, sur un intervalle de temps T.
• Ecrivez une fonction appelée ech qui aura le prototype suivant :
void ech (vect t, int n, float T);
Cette fonction doit échantillonner l’intervalle de temps T sur n+1 points
régulièrement espacés. Ces échantillons seront stockés dans le vecteur temps t.
• Ecrivez une fonction appelée stock qui permette d’écrire deux vecteurs de n+1 éléments sur deux
colonnes séparées par un point virgule dans un fichier qui s'appellera obligatoirement donnees.txt. Le
prototype de la fonction sera :
void stock (vect t, vect y, int n);
Afin de tester ces deux fonctions :
• Définissez une constante pi de valeur 3.1415927f.
• Définissez un type vect pouvant contenir 128 éléments réels.
• À l’aide des fonctions ech et stock vous écrirez dans le fichier donnees.txt les (n+1) valeurs de t et de
y(t) = ( 2+2sin(ωt)) régulièrement espacées sur une période d'un signal de fréquence 10Hz.
• Ecrivez une fonction appelée trapeze qui aura le prototype suivant :
void trapeze (vect y, int n, float h, float *integ) ;
Cette fonction a pour rôle de calculer et de retourner au programme principal le
résultat de l’intégrale d’une fonction échantillonnée à pas constant sur n+1 points
à l’aide de la méthode des trapèzes. Le résultat est retourné à l'aide du pointeur
integ, n est le numéro du dernier point contenu dans le vecteur y et h est le pas.
• Calculer la valeur moyenne de [2 + 2 sin(ωt)] sur 1 période du signal. Affichez le résultat à l'écran.
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments.
1 t2
t2 − t1 ∫t
Rappels : Valeur moyenne d’un signal V(t) entre deux instants t1 et t2 : V
! moy = V (t )d t
1
Sujet 9
On considère l’ensemble de données suivant : ( [ Xmin ; Xmax ] avec un pas h unitaire )
Xi -4 -3 -2 -1 0 1 2 3 4
• Calculez à l’aide d’une fonction Horner, que vous écrirez, la valeur prise, sur ces points, par le polynôme
! 5(x) = x 5 − 3x 4 + 2x 2 − 13
P
• Calculez sur ces mêmes points la valeur de la dérivée de P5(x) en utilisant la méthode d’Horner.
• Sauvegardez ces valeurs dans un fichier texte qui comportera trois colonnes séparées par un point virgule
(";"). La première colonne contiendra les abscisses, la deuxième les valeurs de P5(x), la troisième la valeur
de la dérivée de P5(x).
• Modifiez votre programme pour qu'il utilise des variables dynamiques et non des variables
dimensionnées statiquement. La dimension des variables à créer sera calculée en demandant la saisie du
nombre de points, de Xmin et Xmax. h sera calculé.
Sujet 10
Dans ce qui suit, N est le numéro du dernier point. Les autres variables ont leur sens évident.
On se propose de calculer la surface sous la courbe connue par des points stockés dans le fichier exo10.txt.
Ce fichier de deux colonnes séparées par des tabulations contient les données suivantes.
X Y
0 2
1 -1
4 2
5 27
• Définissez une type de variable appelé vect pouvant contenir 10 entiers.
• Ecrivez une fonction lecture qui lise le contenu du fichier exo10.txt. L'interface de la fonction devra être :
void lecture ( int *N , vect X , vect Y )
En utilisant la méthode d'interpolation de Lagrange, calculez les points manquants à savoir 2 et 3 en
utilisant les points lus à la question ci-dessus.
• Vous écrirez une fonction Lagrange qui devra avoir l'interface suivante.
float lagrange (int N , vect X , vect Y, float alfa)
/* X et Y sont les pivots, alfa le point de calcul */
Vous prendrez soin de classer les valeurs par abscisse croissante lors du calcul des ordonnées.
Nota Bene : Vous n'avez pas à écrire de fonction de tri !
Indication : Que vaut le polynôme d'interpolation sur un de ses pivots ?
• Ecrivez une fonction trapèzes qui devra avoir l'interface suivante :
void trapezes(int N , vect Y , float h, float *I)
/* Y un vecteur contenant les ordonnées, h le pas,
* I sert à retourner la valeur approchée de l'intégrale */
• Calculez une approximation de la surface en utilisant la méthode des trapèzes. Affichez à l'écran la valeur
calculée.
• Modifiez votre programme pour qu'il utilise des variables dynamiques à la place des variables de type
vect. La dimension des variables à créer peut être déterminée par une première lecture du fichier servant
à déterminer le nombre d'éléments. Pensez à re-dimensionner les variables quand nécessaire.
Sujet 11
On se propose de résoudre numériquement l'équation différentielle y' = x+y = ƒ(x,y) par la méthode d'Euler
corrigée.
Vous procéderez pour ce faire comme suit.
• Définissez une fonction appelé F, de type float, ayant deux paramètres de même type x et y, qui retourne
la valeur de ƒ(x,y). Le prototype de la fonction sera : float F( float x, float y)
L'équation différentielle sera intégrée entre xmin et xmax à l'aide d'un pas d'intégration h.
• Dans la fonction main, procédez à la saisie des variables xmin, xmax, h. Calculez alors n le nombre de
points qu'il y a entre xmin et xmax si l'on parcours cet intervalle avec un pas h.
• En utilisant la fonction malloc, dimensionnez deux variables pouvant contenir n variables de type float
appelées x et y. Saisissez la condition initiale y[0]. On imposera x[0] = xmin.
• Dans la fonction main et en utilisant la méthode d'Euler non corrigée, calculez les solutions de l'équation
différentielles y'=ƒ(x,y) à l'aide des variables x, y, et de la fonction F(x,y). Toutes les solutions seront
conservées dans la variable y.
• Dans la fonction main, affichez toutes les solutions calculées sous forme de colonnes en suivant l'exemple
ci-dessous :
Solutions Euler :
X[0] : 0.000000 0.000000
X[1] : 0.100000 0.000000
X[2] : 0.200000 0.010000
X[3] : 0.300000 0.031000
• Ecrivez une fonction appelée affinage ayant le prototype suivant :
void affinage( float h, float *x0, float *y0, float *y1)
Cette fonction a comme paramètres d'entrée le pas d'intégration h, deux pointeurs sur les coordonnées des
conditions initiales {x0, y0}, un pointeur y1 sur la solution au point x1 = x0+h.
La méthode mise en œuvre dans cette fonction est l'affinage par intégration de l'équation différentielle par
la méthode des Trapèzes.
La méthode itérative sera répétée tant que la précision des calculs sera inférieure à 10-6.
• Complétez la méthode d'Euler dans la fonction main de façon à mettre en œuvre la méthode d'Euler
corrigée en utilisant la fonction affinage.
• Affichez alors dans la fonction main les solutions trouvées avec la méthode affinée.
Nota Bene : votre programme devra afficher successivement les solutions non affinées puis les solution
affinées. Pensez à utiliser le copier/coller.
x1 h
∫x
On rappelle que : y! 1 = y0 + f (x , y)d x = y0 + [F (x1, y1 − F (x 0, y0 )] ≈ y0 + [ f (x1, y1) + f (x 0, y0 )]
2
0
• Testez votre programme avec h=0,01, xmin = 0, xmax = 0,3, vous devez trouver y(0,3) ≈ 0,49862
• Sauvegardez les données calculées par la méthode d'Euler corrigée dans un fichier de type texte appelé
sortie.txt contenant deux colonnes séparées par une tabulation. La première colonne contiendra les
abscisses x[k] et la seconde les ordonnées calculées y[k].