***Pour revenir à la page d’accueil** ICI
L’équation à résoudre
pour calculer l’angle beta n’est pas un polynôme classique.
D’autre part,
cet angle n’étant pas petit, on ne peut se contenter de développer le sinus et
le cosinus en série disons au second ordre.
Ne reste qu’une approche par approximation à réaliser par le petit programme suivant.
En tant qu'angle au centre beta est le double de l'angle theta. Un graphique succinct permet d'estimer theta à environ 55°.
On prend donc 109° pour valeur initiale de beta.
Exécuté sur un Arduino Nano à 16 MHz, pour une précision de 0.01m², le temps de calcul est de l’ordre de 7s.
Dans la pratique, on retiendra que la longueur de la
corde/chaine doit être d'environ 16% supérieure au rayon du champ.
//Chevre_200223
//Champ de rayon R, aire PI*R**2 .Une
chèvre attachée à un piquet sur la périphérie
//doit brouter la moitié du champ.
Quelle longueur de corde utiliser?
//Avec R=100m, Corde= 115.872871m obtenu après qq milliers d'itérations
//Exemple: avec cor = 0.000001, cnts =
200, après 3600 itérations, en 7s environ
//la différence n'est que de 0.01m²
//************Ajustable***************
float cor = 0.000001; //le pas
d'itération pour affiner le résultat ex
0.00001
int cnts = 200; //Nombre d'itérations
par séquence pour cet affinement, ex 100
float R = 100; //Rayon du champs en m
//***********************************
float PIs2 = PI / 2.;
float beta = 109;//angle initial
autour de 109 degrés
float beta_rad = beta * PI / 180;
float res = 0;//res = sin(beta_rad) -
beta_rad * cos(beta_rad);ZY
float Corde = 0; //Longueur en m de la
corde
int nit = 0;//nb de séquences d'itérations
void setup() {
Serial.begin(9600);
Serial.print("Rayon du champ en m =
");
Serial.println(R);
Serial.print("Aire de la moitié du champ en m² = ");
Serial.println(PI * R * R / 2);
Serial.print("correctif pour affiner le résultat = ");
Serial.println(cor, 7);
Serial.print("Nombre d'itérations
= ");
Serial.println(cnts);
Serial.println();
Serial.println();
Serial.print("Corde en m initial =
");
Serial.println(Corde, 4);
Serial.println("***********************************");
delay(5000);
Serial.println(); Serial.println(); Serial.println();
void loop() {
int cnt = 0; //Compteur d'itérations
dans une séquence de cnts
while ( cnt < cnts) //Séquence pour affiner la précision du resultat
{
if ((res - PIs2) > 0)beta_rad = beta_rad - cor;// un coup plus court
else beta_rad = beta_rad +
cor; //un coup plus long
res = sin(beta_rad) - beta_rad * cos(beta_rad);
cnt++;
}
nit++; //Compteur de séquences
Serial.print("
Total itérations
");
Serial.println(cnts * nit);
Serial.print("On vise 0 pour
res - PI/2 = ");
Serial.println(res - PIs2 , 6);
Serial.println();
Serial.print("Corde en m =
");
Corde = 2 * R * cos(beta_rad / 2.);
Serial.println(Corde, 6);
Serial.print("Donc multiplier le rayon du champs par ");
Serial.println(Corde / R, 3);
Serial.println();
Serial.print("Aire de la moitié du champ en m² = ");
Serial.println(PI * R * R / 2);
Serial.print("Aire mangée par la chèvre en m² =
");
Serial.println(R * R * (PI - res));
Serial.print("Soit une différence en m² de
");
Serial.println(PI * R * R / 2 - R * R * (PI - res));
delay(100);
}