Problème de la tarte au 1/3
11/03/23
***Pour revenir à la page d’accueil** ICI
On désire coupé le tiers d'une tarte circulaire de façon originale, en un seul trait rectiligne de couteau selon AB.
Cette surface correspond à un SEGMENT de cercle, d'angle au centre: a.
On cherche donc à calculer la valeur de OC, sachant que l'aire du segment vaut R²/2( a – sin a), a exprimé en radian.

R²/2( a – sin a) = PI*R²/3
a - sin a = 2*PI/3 equation non polynomiale, on va rechercher une solution par approximations avec la méthode de Newton. (voir l'Annexe 1)
Cette méthode est efficace, ne réclamamnt que 4 itérations à partir d'un angle initial de 180°.
En Annexe 2, on utilise la méthode par dichotomie.
Noter que l'angle a (de l'ordre de 150°) ne dépend pas de R, il est valable pour toutes les tartes circulaires!
Une fois trouvé l'angle a , on calcule OC par
OC = R*cos a/2
**************************************************Resultats sur le moniteur d'un PC Newton*******************************
19:53:05.592 -> Rayon de la tarte en cm = 17.20
19:53:05.592 -> Surface 1/3 de la tarte en cm² = 309.802947
19:53:05.638 -> Angle au centre initial en degrès = 180.0
19:53:05.732 -> ***********************************
19:53:06.665 ->
19:53:06.665 ->
19:53:06.665 ->
19:53:06.665 -> Itération 1
19:53:06.665 -> Angle au centre ai degrés = 180.000000
19:53:06.758 -> OC en cm = -0.000001
19:53:06.758 -> Surface 1 / 3 de tarte en cm² = 309.802947
19:53:06.804 -> Surface du segment en cm² = 464.704437
19:53:06.851 -> Soit une différence en cm² de -154.901489
19:53:06.898 ->
19:53:06.898 ->
19:53:06.898 ->
19:53:06.898 -> Itération 2
19:53:06.898 -> Angle au centre ai degrés = 150.000000
19:53:06.992 -> OC en cm = 4.451688
19:53:06.992 -> Surface 1 / 3 de tarte en cm² = 309.802947
19:53:07.037 -> Surface du segment en cm² = 313.293670
19:53:07.084 -> Soit une différence en cm² de -3.490723
19:53:07.131 ->
19:53:07.131 ->
19:53:07.131 ->
19:53:07.131 -> Itération 3
19:53:07.131 -> Angle au centre ai degrés = 149.275405
19:53:07.224 -> OC en cm = 4.556653
19:53:07.224 -> Surface 1 / 3 de tarte en cm² = 309.802947
19:53:07.270 -> Surface du segment en cm² = 309.808929
19:53:07.316 -> Soit une différence en cm² de -0.005981
19:53:07.362 ->
19:53:07.362 ->
19:53:07.362 ->
19:53:07.362 -> Itération 4
19:53:07.362 -> Angle au centre ai degrés = 149.274169
19:53:07.454 -> OC en cm = 4.556832
19:53:07.454 -> Surface 1 / 3 de tarte en cm² = 309.802947
19:53:07.501 -> Surface du segment en cm² = 309.802947
19:53:07.549 -> Soit une différence en cm² de 0.000000
19:53:07.596 ->
19:53:07.596 ->
********************************************LOGICIEL Newton******************************
//Tarte_Newton_260223
//A quelle distance OC du centre O couper un segment de tarte égal au tiers de la tarte?
//Tarte de rayon R, aire PI*R**2 .
//Exemple: R=17.2cm, OC =4.556832 cm à 0.000001 près obtenu en 4 itérations
//Angle au centre a = 149.27° constant queque soit le rayon de la tarte
//https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Newton
//Méthode de Newton pour trouver le zero de la fonction f(a)
//aip1 = ai -f(ai)/f'(ai) Notation: aip1 = ai +1
//************Valeurs ajustables***************
float R = 17.2; //Rayon en cm
float ai_init = 180;//angle initial en degrès , visiblement trop grand
float epsilon = 0.00001;// Precision voulue en radian
//***********************************
int cnts = 0; //Nombre d'iterations
float ai = 0; //Angle a(i)
float ai_rad = ai * PI / 180.;
float aip1 = 0; //Angle a(i + 1)
float aip1_rad = aip1 * PI / 180.;
float PI2s3 = 2 * PI / 3.;
float OC = 0; //Distance en cm
void setup() {
Serial.begin(9600);
Serial.print("Rayon de la tarte en cm = ");
Serial.println(R);
Serial.print("Surface 1/3 de la tarte en cm² = ");
Serial.println(PI * R * R / 3, 6);
Serial.print("Angle au centre initial en degrès = ");
Serial.println(ai_init, 1);
Serial.print("Precision en radian ");
Serial.println(epsilon, 6);
Serial.println("***********************************");
delay(1000);
Serial.println(); Serial.println(); Serial.println();
}
void loop()
{
ai_rad = ai_init * PI / 180;//On démarre avec cette estimation
cnts = 0;
//Méthode de Newton pour trouver le zero de la fonction f(a)
//aip1 = ai -f(ai)/f'(ai) //aip1 = ai +1
//f(ai) = ai - sin(ai) -PI2s3 et sa dérivée
//f'(ai) = 1 - cos(ai) avec ai et aip1 en radian
while (1)
{ aip1_rad = ai_rad - (ai_rad - sin(ai_rad) - PI2s3) / (1 - cos(ai_rad));
cnts++;
Serial.print("Itération ");
Serial.println(cnts);
Serial.print("Angle au centre ai degrés = ");
Serial.println(ai_rad / (PI / 180), 6);
Serial.print("OC en cm = ");
OC = R * cos(ai_rad / 2.);
Serial.println(OC, 6);
Serial.print("Surface 1 / 3 de tarte en cm² = ");
Serial.println(PI * R * R / 3, 6);
Serial.print("Surface du segment en cm² = ");
Serial.println((R * R / 2) * ( ai_rad - sin(ai_rad)), 6);
Serial.print("Soit une différence en cm² de ");
Serial.println((PI * R * R / 3) - (R * R / 2) * ( ai_rad - sin(ai_rad) ), 6);
Serial.println(); Serial.println(); Serial.println();
if ((ai_rad - aip1_rad) < epsilon)break; //Resultat ok, on sort
ai_rad = aip1_rad; //une itération de plus
}
while (1); //Attente ici
}
**************************************ANNEXE 1 *******************************
Méthode de Newton

**************************************ANNEXE 2 *******************************
Méthode par dichotomie
On obtient sur le moniteur du PC
17:28:45.331 -> Rayon de la tarte en cm = 17.20
17:28:45.378 -> Surface 1/3 de la tarte en cm² = 309.802947
17:28:45.424 -> ***********************************
17:28:46.406 ->
17:28:46.406 ->
17:28:46.406 ->
17:28:46.406 -> 1
17:28:46.406 -> Angle a rad = 2.443461
17:28:46.452 -> Angle b rad = 2.792527
17:28:46.452 -> Angle b_rad - a rad = 0.349066
17:28:46.452 -> 2
17:28:46.499 -> Angle a rad = 2.443461
17:28:46.499 -> Angle b rad = 2.617994
17:28:46.545 -> Angle b_rad - a rad = 0.174533
17:28:46.545 -> 3
17:28:46.545 -> Angle a rad = 2.530728
17:28:46.592 -> Angle b rad = 2.617994
17:28:46.639 -> Angle b_rad - a rad = 0.087266
17:28:46.686 -> 4
17:28:46.686 -> Angle a rad = 2.574361
17:28:46.686 -> Angle b rad = 2.617994
17:28:46.733 -> Angle b_rad - a rad = 0.043633
17:28:46.779 -> 5
17:28:46.779 -> Angle a rad = 2.596178
17:28:46.779 -> Angle b rad = 2.617994
17:28:46.779 -> Angle b_rad - a rad = 0.021816
17:28:46.872 -> 6
17:28:46.872 -> Angle a rad = 2.596178
17:28:46.872 -> Angle b rad = 2.607086
17:28:46.872 -> Angle b_rad - a rad = 0.010908
17:28:46.918 -> 7
17:28:46.918 -> Angle a rad = 2.601632
17:28:46.965 -> Angle b rad = 2.607086
17:28:47.011 -> Angle b_rad - a rad = 0.005454
17:28:47.011 -> 8
17:28:47.011 -> Angle a rad = 2.604359
17:28:47.057 -> Angle b rad = 2.607086
17:28:47.103 -> Angle b_rad - a rad = 0.002727
17:28:47.150 -> 9
17:28:47.150 -> Angle a rad = 2.604359
17:28:47.150 -> Angle b rad = 2.605722
17:28:47.197 -> Angle b_rad - a rad = 0.001364
17:28:47.243 -> 10
17:28:47.243 -> Angle a rad = 2.605041
17:28:47.243 -> Angle b rad = 2.605722
17:28:47.243 -> Angle b_rad - a rad = 0.000682
17:28:47.336 -> 11
17:28:47.336 -> Angle a rad = 2.605041
17:28:47.336 -> Angle b rad = 2.605381
17:28:47.382 -> Angle b_rad - a rad = 0.000341
17:28:47.382 -> 12
17:28:47.382 -> Angle a rad = 2.605211
17:28:47.428 -> Angle b rad = 2.605381
17:28:47.475 -> Angle b_rad - a rad = 0.000170
17:28:47.475 -> 13
17:28:47.475 -> Angle a rad = 2.605296
17:28:47.521 -> Angle b rad = 2.605381
17:28:47.568 -> Angle b_rad - a rad = 0.000085
17:28:47.615 -> 14
17:28:47.615 -> Angle a rad = 2.605296
17:28:47.615 -> Angle b rad = 2.605339
17:28:47.662 -> Angle b_rad - a rad = 0.000043
17:28:47.709 -> 15
17:28:47.709 -> Angle a rad = 2.605318
17:28:47.709 -> Angle b rad = 2.605339
17:28:47.709 -> Angle b_rad - a rad = 0.000021
17:28:47.802 -> 16
17:28:47.802 -> Angle a rad = 2.605318
17:28:47.848 -> Angle b rad = 2.605328
17:28:47.848 -> Angle b_rad - a rad = 0.000010
17:28:47.848 -> 17
17:28:47.894 -> Angle a rad = 2.605323
17:28:47.894 -> Angle b rad = 2.605328
17:28:47.941 -> Angle b_rad - a rad = 0.000005
17:28:47.941 ->
17:28:47.941 ->
17:28:47.941 ->
17:28:47.941 -> ****************RESULTATS**********************
17:28:48.032 -> Itération 17
17:28:48.078 -> Angle au centre en degrés = 149.274002
17:28:48.078 -> OC en cm = 4.556856
17:28:48.125 -> Surface 1 / 3 de tarte en cm² = 309.802947
17:28:48.170 -> Surface du segment en cm² = 309.802185
17:28:48.170 -> Soit une différence en cm² de 0.000763
*******************************************LOGICIEL Dichotomie******************************
//Tarte_dichotomie_100323
//A quelle distance OC du centre O couper un segment de tarte égal au tiers de la tarte?
//Tarte de rayon R, aire PI*R**2 .
//Exemple: R=17.2cm, OC =4.556856 cm à 0.00001 près obtenu en 17 itérations
//Angle au centre a = 149.27° constant quelque soit le rayon de la tarte
//https://fr.wikipedia.org/wiki/M%C3%A9thode_de_dichotomie
//Méthode de dichotomie pour trouver le zero de la fonction f(a)en pseudo-code
// Tant que (b - a) >
ε
Noter que l'on toujours a < b
// m ← (a + b) / 2
// Si (f(a)*f(m) ≤ 0)
alors milieu m à
droite du zero, m devient b
// b ← m
//
sinon
milieu m à gauche du zero, m devient a
// a ← m
// Fin Si
//Fin Tant que//
//************Valeurs ajustables***************
float R = 17.2; //Rayon en cm
float a_init = 140;// a et b angles initiaux en degrès
float b_init = 180;//Encadrent la valeur cherchée
float epsilon = .00001;// Précision voulue en radian
//***********************************
int cnts = 0; //Nombre d'iterations
float a = 0; //Angle a
float a_rad = a * PI / 180.;
float b = 0; //Angle b
float b_rad = b * PI / 180.;
float m = 0; //Angle demi-somme (a+b)/2
float m_rad = m * PI / 180.;
float PI2s3 = 2 * PI / 3.;
float OC = 0; //Distance en cm
void setup() {
Serial.begin(9600);
Serial.print("Rayon de la tarte en cm = ");
Serial.println(R);
Serial.print("Surface 1/3 de la tarte en cm² = ");
Serial.println(PI * R * R / 3, 6);
// Serial.print("Angle au centre initial en degrès = ");
// Serial.println(a_init, 1);
Serial.println("***********************************");
delay(1000);
Serial.println(); Serial.println(); Serial.println();
}
void loop()
{
a_rad = a_init * PI / 180;//On démarre avec cette estimation
b_rad = b_init * PI / 180;
cnts = 0;
while ((b_rad - a_rad) > epsilon) // b_rad est toujours > a_rad
{
m_rad = (a_rad + b_rad) / 2; //Milieu du segment ab,voir sa position par rapport au zero
if ( (a_rad - sin(a_rad) - PI2s3) * (m_rad - sin(m_rad) - PI2s3) < 0)
{
b_rad = m_rad; //m est à droite du zero, devient b
}
else
{
a_rad = m_rad; //m est à gauche du zero, devient a
}
cnts++;
Serial.println(cnts);
Serial.print("Angle a rad = ");
Serial.println(a_rad , 6);
Serial.print("Angle b rad = ");
Serial.println(b_rad , 6);
Serial.print("Angle b_rad - a rad = ");
Serial.println((b_rad - a_rad), 6);
}
//Fin du calcul
Serial.println(); Serial.println(); Serial.println();
Serial.println("****************RESULTATS**********************");
Serial.print("Itérations ");
Serial.println(cnts);
Serial.print("Angle au centre en degrés = ");
Serial.println(a_rad / (PI / 180), 6);
Serial.print("OC en cm = ");
OC = R * cos(a_rad / 2.);
Serial.println(OC, 6);
Serial.print("Surface 1 / 3 de tarte en cm² = ");
Serial.println(PI * R * R / 3, 6);
Serial.print("Surface du segment en cm² = ");
Serial.println((R * R / 2) * ( a_rad - sin(a_rad)), 6);
Serial.print("Soit une différence en cm² de ");
Serial.println((PI * R * R / 3) - (R * R / 2) * ( a_rad - sin(a_rad) ), 6);
Serial.println(); Serial.println(); Serial.println();
while (1); //Attente ici
}
Commentaire de Ph Lienhard:
"Comme le dit Wikipedia :
"Le principal défaut de l'algorithme (dichotomie ) est que seul le signe de f est utilisé, ce qui mène à une convergence plutôt lente (convergence quasiment linéaire)."
17 itérations
"La méthode de Newton, qui utilise la valeur de f ainsi que la valeur de la pente de f, est, quand elle converge, significativement plus rapide (convergence quadratique)."
4 itérations
Vainqueur : Newton"
D'autres énigmes:.....et aussi
Chèvre
Tour de Terre
