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