Vous ferez ce TP par binôme. Vous me ferez un petit rapport (pour deux) expliquant les principales difficultés que vous avez rencontrées (que vous me rendez soit aujourd'hui, soit lundi prochain). Vous me transmettrez le fichier source contenant tous vos sous-programmes et le programme principal permettant de les tester. (soit par mail soit en le transférant par sftp). Le sujet est long, faites en le maximum.
Nous supposons qu'après de longs et savants calculs, vous avez déterminé que les solutions X à un problème physique, en fonction de 4 paramètres A, B, C et D, devaient vérifier l'équation :
Vous n'êtes intéressés que par les racines positives et inférieures à 100 (car les solutions au dessus sont trop difficilement réalisables). Le but de ce TP est de déterminer ces solutions. Vous pourrez tester vos programmes avec les 4 jeux de paramètres suivants : 3, 11, 100, 120 / 8, 10, 23, 10 / 5, 1.5, 33, 30 / 1, 10, 120, 2 (les 4 paramètres seront demandés à l'utilisateur)
Supposons
que, d'après le comportement du système étudié,
on soit assuré que l'écart entre deux racines est
obligatoirement supérieur à 1. Vous allez donc chercher
à encadrer les racines par deux entiers adjacents. Pour cela,
vous allez calculer f(x) pour toutes les valeurs possibles et vous
regarderez quand f(x) change de signe. Si la fonction change de
signe, cela signifie obligatoirement qu'elle est passée par 0.
Vous
allez désormais rechercher plus précisément
chacune des racines. Vous créerez un sous programme (ou une
fonction) pour cela. Vous utiliserez une méthode très
efficace : la dichotomie. Puisque vous savez à peu près
où est la racine (dans un intervalle de 1), il suffit de
couper cet intervalle de recherche en deux et regarder dans quelle
moitié se trouve la racine. Puis on recommence (couper
l'intervalle en deux) jusqu'à ce qu'on encadre la racine avec
une précision donnée (par exemple 10-3).
Afin
de décomposer l'étude en deux phases (recherche
préalable de toutes les racines inférieures à
100, puis analyse de ces points), il faut stocker toutes ces racines
dans un tableau (et les avoir comptées, évidement).
Faites le. Le tableau et les paramètres sont des variables du
programme principal, mais la recherche des racines se fait dans un
sous-programme.
Il
est intéressant, pour une racine donnée, de savoir quel
paramètre a le plus d'influence. Pour cela, il faudrait
dériver f par rapport à chaque paramètre, et
voir laquelle de ces 4 dérivées a la plus grande valeur
(en valeur absolue) au niveau de cette racine. Une valeur exacte
n'ayant aucun intérêt, nous allons approximer df/da par
(f(a+d)-f(a-d))/(2d) avec d suffisamment petit, par exemple 10-3
(idem évidemment pour les trois autres paramètres).
Ecrivez un sous-programme qui pour un x donné calcule et
affiche les 4 dérivées.
Autre
donnée intéressante à connaître, l'
« écart » entre deux racines
successives. Cet écart est l'intégrale de f(x) entre
ces deux racines (c'est à dire la surface entre la courbe et
l'axe des x). Pour calculer cette surface, vous utiliserez la méthode
des trapèzes : il s'agit de découper cette surface
en petit trapèzes de largeur « d »
suffisamment petit, et de faire la somme de leurs surfaces. La
surface d'un tel trapèze est f(x)+f(x+d)*(d/2). Attention, si
l'on fait trop de calculs, on obtient une erreur importante, on se
limitera donc à un découpage en 104
trapèzes. Ecrivez une fonction à qui l'on donne en
argument deux racines successives (et toutes les autres informations
nécessaires) et qui retourne l'écart calculé de
cette manière.
Pour vous aider, j'ai tracé la courbe pour les quatre exemples proposés : ici (ou en pdf). La correction est aussi disponible : source ou pdf.
sujet TP1 | sujet TP2 | sujet TP3 | sujet TP4 | retour sommaire TP | cours Fortran | P. Trau |