périmètre ellipse

Périmètre d’une ellipse

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 aValeurs de bValeur approximative du périmètre
5738,2191241574
4528,4483314254
1551236,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 avaleurs de bvaleur approximative du périmètre
5737,9613673288
4528,3616677843
1551223,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 avaleurs de bvaleur approximative du périmètre
5737,9613689347
4528,361667889
1551223,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

Laisser un commentaire