Calculer le périmètre d’une ellipse n’est pas chose aisée.
On pourrait croire qu’à l’instar de son cousin le cercle, l’ellipse possède une formule mathématique pour déterminer son périmètre… Que nenni !
Nous allons considérer ici une ellipse d’équation cartésienne:$$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$$. Comme vous pouvez le constater, j’ai pris la décision de centrer l’ellipse en l’origine du repère.
Périmètre d’une ellipse: première approximation
Une formule “classique” que l’on peut voir ci et là est la suivante:$$P\approx2\pi\sqrt{\frac{a^2+b^2}{2}}$$
Valeurs de a | Valeurs de b | Valeur approximative du périmètre |
---|---|---|
5 | 7 | 38,2191241574 |
4 | 5 | 28,4483314254 |
15 | 51 | 236,184258737 |
Pour le moment, dans la mesure où nous n’avons pas d’autres méthodes, nous ne pouvons pas comparer ces valeurs avec d’autres qui pourraient être plus ou moins précises…
Périmètre d’une ellipse: formules de Ramanujan
Première formule de Ramanujan pour le périmètre d’une ellipse
Rappelons que Srinivasa Ramanujan était un mathématicien indien d’une intuition remarquable qui a établi (on ne sait pas trop comment) une multitude de formules, notamment sur le nombre \(\pi\).
Une de ses formules est une approximation du périmètre d’une ellipse:$$P\approx\pi\Big(3(a+b)−\sqrt{(3a+b)(a+3b)}\Big).$$
valeurs de a | valeurs de b | valeur approximative du périmètre |
---|---|---|
5 | 7 | 37,9613673288 |
4 | 5 | 28,3616677843 |
15 | 51 | 223,065447072 |
Deuxième formule de Ramanujan
$$P \approx \pi(a+b)\left(1+\frac{3h}{10+\sqrt{4-3h}}\right)\quad,\quad h=\frac{(a-b)^2}{(a+b)^2}.$$
Celle-ci, il fallait la trouver!
valeurs de a | valeurs de b | valeur approximative du périmètre |
---|---|---|
5 | 7 | 37,9613689347 |
4 | 5 | 28,361667889 |
15 | 51 | 223,078484953 |
Avec l’équation paramétrique de l’ellipse
Nous avons vu l’équation cartésienne de l’ellipse, mais on peut aussi dire que tout point M(x;y) de cette ellipse vérifie:$$\begin{cases}x(t) & = a\cos(t)\\y(t)&=b\sin(t)\end{cases}\quad,\quad 0\leq t\leq 2\pi.$$
Pour des raisons de symétrie par rapport aux deux axes du repère, on peut alors dire que le périmètre de l’ellipse est:$$P = 4\int_0^{\frac{\pi}{2}} \sqrt{x'(t)^2+y'(t)^2} \text{d}t.$$
Or, \(x'(t)=-a\sin(t)\) et \(y'(t)=b\cos(t)\), ce qui donne, après simplifications:$$P=4a\int_0^{\frac{\pi}{2}} \sqrt{1-e^2\sin^2(t)} \text{d}t,\quad e=\sqrt{1-\frac{b^2}{a^2}}.$$\(e\) désigne ici ce que l’on appelle l’excentricité de l’ellipse (et non le nombre d’Euler).
Le problème est que l’on ne peut pas déterminer la valeur exacte de ce genre d’intégrale…
Approximer le périmètre d’une ellipse à l’aide de Python
Mon idée ici est de considérer un point M de l’ellipse tel que \( \big(\vec{i};\vec{OM}\big)=\theta\), avec \( 0\leq \theta\leq 2\pi\).
La première chose que j’ai envie de faire est d’exprimer la longueur OM, longueur que je vais abusivement nommée le module, et que je vais noter \(r_\theta\). Je vais déjà dire que les coordonnées (x ; y) de M vérifient:$$\begin{cases}x & = r_\theta\cos\theta\\y & = r_\theta\sin\theta\end{cases}$$
Je remplace maintenant dans l’équation cartésienne de l’ellipse x et y, ce qui donne:$$b^2r^2_\theta\cos^2\theta+a^2r^2\theta\sin^2\theta=a^2b^2$$soit:$$r_\theta=\frac{ab}{\sqrt{b^2\cos^2\theta+a^2\sin^2\theta}}.$$
Je sais donc maintenant calculer le “module” d’un point définit par son angle avec l’axe des abscisses.
À présent, si je considère deux points \(M_0(x_0;y_0)\) et \(M_1(x_1;y_1)\), définis par leurs angles \(\theta\) et \(\theta+\delta\), \(\delta\) étant un nombre positif très proche de 0, je peux calculer leur distance:$$M_0M_1=\sqrt{(x_1-x_0)^2+(y_1-y_0)^2}.$$
L’idée ici est donc de partir d’un angle \(\theta=0\) et de lui ajouter \(\delta\) afin de calculer la distance \(M_0M_1\), puis de changer la valeur de \(\theta\) en \(\theta+\delta\) et de faire de même jusqu’à \(\theta=2\pi-\delta\). En ajoutant toutes les longueurs, on aura une approximation du périmètre.
Cela donne en Python:
""" Ellipse d'équation : x² y² -- + -- = 1 a² b² """ from math import pi,sin,cos,sqrt def module(a,b,angle): return a*b/sqrt( b*b*(cos(angle)**2) + a*a*(sin(angle)**2) ) def perimetre_ellipse(a,b,n=10000): theta = 0 delta = 2*pi/n p = 0 while theta < 2*pi: x_0 = module(a,b,theta) * cos(theta) y_0 = module(a,b,theta) * sin(theta) x_1 = module(a,b,theta+delta) * cos(theta+delta) y_1 = module(a,b,theta+delta) * sin(theta+delta) p += sqrt( (x_0-x_1)**2 + (y_0-y_1)**2 ) theta += delta return p
>>> perimetre_ellipse(5,7)
37.96136808634785
>>> perimetre_ellipse(4,5)
28.361667351049444
>>> perimetre_ellipse(15,51)
223.07846961614933