Un exercice d'échauffement scolaire pour occuper votre temps - page 5

 
Aleksey Nikolayev:

1) Il est difficile de prouver le fait que les sommets de l'aire maximale doivent se trouver sur le même cercle (théorème de Cramer). Je ne sais pas comment le prouver ni où lire la preuve.

2) Je ne crois pas vraiment à l'existence d'une formule analytique pour l'aire ou le rayon maximal d'un cercle.

3) La somme des éléments d'un tableau peut être calculée par MathSum()

1) Je pense que c'est un fait évident. Et il est facile de prouver en comprenant que l'aire maximale d'un triangle avec un sommet donné A, une ligne médiane h et un côté opposé donné a est l'aire d'un triangle isocèle, lorsque l'angle au sommet donné est maximal. Et l'aire d'un tel triangle est h*a/2

Imaginons que tous les nœuds entre des côtés donnés de polygones soient flexibles (comme dans un jeu de construction d'enfant sur des aimants) et il est clair que nous pouvons disposer les côtés de telle sorte que tous les sommets aient un centre commun équidistant (à condition que le plus grand côté soit plus petit que la somme des autres côtés, sinon ils ne peuvent pas être reliés), c'est-à-dire inscrits dans un cercle. Et ce sera l'aire maximale, puisqu'elle est constituée de la somme des aires des triangles isocèles, dont le côté est égal au rayon de ce cercle.

2) Je crois

3) Je n'ai pas trouvé cette formule dans MQL4 ou MQL5.

 
Nikolai Semko:

1) Je pense que c'est un fait évident.

intuitivement oui, mais ça ne va même pas jusqu'à une preuve rigide, loin de là.

2) Je crois

S'il y en avait un, on pourrait le trouver, il n'y a qu'un système d'équations.

Aleksey Nikolayev:

1) La difficulté consiste à prouver le fait que les sommets de la mnc ayant l'aire maximale doivent se trouver sur le même cercle (théorème de Cramer). Je ne sais pas comment le prouver ni où lire la preuve.

Je n'ai pas du tout trouvé un tel théorème, seulement des références à cette propriété.

comme toujours, des liens inutiles et aucun mot sur le sujet.

 
Andrei Trukhanovich:


comme d'habitude des références inutiles et pas un mot de substance.

c'est vraiment inutile pour vous

 
Nikolai Semko:

1) Je pense que c'est un fait évident. Et il est facile de prouver en comprenant que l'aire maximale d'un triangle avec un sommet donné A, une ligne médiane h et un côté opposé donné a est l'aire d'un triangle isocèle lorsque l'angle au sommet donné est maximal. Et l'aire d'un tel triangle est h*a/2

Imaginons que tous les nœuds entre des côtés donnés de polygones soient flexibles (comme dans un jeu de construction d'enfant sur des aimants) et il est clair que nous pouvons disposer les côtés de telle sorte que tous les sommets aient un centre commun équidistant (à condition que le plus grand côté soit plus petit que la somme des autres côtés, sinon ils ne peuvent pas être reliés), c'est-à-dire inscrits dans un cercle. Et ce sera l'aire maximale, puisqu'elle est constituée de la somme des aires des triangles isocèles, dont le côté est égal au rayon de ce cercle.

2) Je crois

3) Je n'ai pas trouvé cette formule dans MQL4 ou MQL5.

1) Peut-être que l'on peut d'une manière ou d'une autre la formaliser comme une égalité à zéro de la variation (dérivée) de l'aire d'un mnc par les coordonnées des sommets lorsqu'ils se trouvent sur un cercle. Seulement, il s'agit d'une condition d'extrémalité locale et nous devons prouver 1) que c'est un maximum et 2) qu'il est global.

3) MathSum()

#include <Math\Stat\Math.mqh>
void OnStart()
{
  double a[] = {1.0, 2.0, 3.0}, s;
  s = MathSum(a);
  Print("s=", s);
}

s=6.0



 

Vous obtenez un polynôme à partir des racines des autres polynômes, et de tout ce baad over prenez trois dérivées. Formules kilométriques. Et qui sait, il y a peut-être une surprise qui attend à la fin. Il va falloir trouver une sorte d'astuce.

 
Andrei Trukhanovich:

intuitivement oui, mais cela n'équivaut pas à une preuve rigide, loin de là.

s'il y en avait une, on pourrait la trouver, il n'y a qu'un système d'équations

Je n'ai pas trouvé un tel théorème, seulement des mentions de cette propriété.

comme d'habitude des références inutiles et pas un seul mot sur le sujet.

En cherchant sur Google "maximum area polygon given sides", j'ai trouvé seulement que ce résultat est "bien connu") et des solutions numériques comme celle donnée par Nikolay.

Apparemment, il faut passer par des livres anciens sur la géométrie - de nos jours, ils n'aiment pas s'étendre sur ce genre de choses.

 

La solution ci-dessus n'est valable que pour les polygones dont le centre de la circonférence est situé à l'intérieur du périmètre. Essayer le triangle {2,2,3.9}

En termes généraux (approximation par double précision) se résout comme suit :

enum EEqual {LESS=-1,EQUALY,MORE};
//-------------------------------------------------------
struct SRes{
   double s;
   double r;
   double degDelta;
   SRes(){ZeroMemory(this);}
   SRes(double _s,double _r,double _degDelta):s(_s),r(_r),degDelta(_degDelta){}
   SRes(const SRes &other) {this=other;}
   bool operator !() {return !s;}
};
//-------------------------------------------------------
const double _2PI=2*M_PI;
//-------------------------------------------------------
EEqual Check(double &array[],int size){
   int ii=0;
   double max=0.0,
          tmp=0.0,
          sum=0.0;
   for (int i=0;i<size;++i){
      if (array[i]<=0.0) return false;
      max=MathMax(max,array[i]);
      if (max!=tmp){
         ii=i;
         tmp=max;}
      sum+=array[i];}
   EEqual ret=max<sum/2?MORE:LESS;
   if (ret==MORE){
      tmp=array[ii];
      array[ii]=array[--size];
      array[size]=tmp;}
   return ret;}
//---------------------------------------------------
SRes ComputeCenterOut(const double &array[], double deg){
   int size=ArraySize(array)-1;
   double r=array[size]/2.0/sin((deg-M_PI)/2.0);
   double sum=0.0,
          square=-r*cos(deg/2.0)*array[size]/2.0;
   for (int i=0;i<size;++i){
      double _deg=2.0*MathArcsin(array[i]/2.0/r);
      sum+=_deg;
      square+=r*cos(_deg/2.0)*array[i];}
   return SRes(square,r,deg-M_PI-sum);
}
//---------------------------------------------------
SRes ComputeCenterIn(const double &array[], double deg){
   int size=ArraySize(array)-1;
   double r=array[size]/2.0/sin(deg/2.0);
   double sum=deg,
          square=r*cos(deg/2.0)*array[size]/2.0;
   for (int i=0;i<size;++i){
      double _deg=2.0*MathArcsin(array[i]/2.0/r);
      sum+=_deg;
      square+=r*cos(_deg/2.0)*array[i]/2.0;}
   return SRes(square,r,_2PI-sum);
}
//---------------------------------------------------
SRes ComputeSquare(const double &array[],double min,double max,SRes &prev){
   double a=(min+max)/2.0;
   if (a==min||a==max) return prev;
   SRes res=a>M_PI?ComputeCenterOut(array,a):ComputeCenterIn(array,a);
   if (res.degDelta==0.0||res.s==prev.s) return res;
   if (res.degDelta>0.0) min=a;
   else max=a;
   return ComputeSquare(array,min,max,res);}
//---------------------------------------------------
SRes Square(const double &in[]){
   double tmp[];
   int size=ArrayCopy(tmp,in);
   if (Check(tmp,size)!=MORE) return SRes();
   double aMax=_2PI,
          a=aMax/size;
   return ComputeSquare(tmp,a,aMax,SRes());
}

void OnStart(void)
{
   double arr[]={2,3.9,2};
   ulong time=GetMicrosecondCount();
   SRes res=Square(arr);
   time=GetMicrosecondCount()-time;
   if (!res) Print("Многоугольника с заданными сторонами не существует");
   else PrintFormat("Time=%lli %ss\n"
                    "Square=%f\n"
                    "Radii=%f",time,"\xB5",res.s,res.r);
}
 
Vladimir Simakov:

La solution ci-dessus n'est valable que pour les polygones dont le centre de la circonférence est situé à l'intérieur du périmètre. Essayer le triangle {2,2,3.9}

...

Quel est le rapport avec un triangle si le problème est de trouver un polygone ayant une aire maximale compte tenu des dimensions des côtés ?

 

Oups. Je n'ai moi-même qu'une seule des variantes qui compte correctement))))

UPD : Corrigé.

 
Dmitry Fedoseev:

Vous obtenez un polynôme à partir des racines des autres polynômes, et de tout ce baad over prenez trois dérivées. Formules kilométriques. Et qui sait, il y a peut-être une surprise qui attend à la fin. Il va falloir trouver une sorte d'astuce.

Voici la fonction de la somme de tous les angles en fonction du rayon. La zone de solution de 2p est mise en évidence en vert.

Peut-être que cela vous aidera.
Je suis trop paresseux pour me creuser les méninges, d'autant que je ne suis pas très doué pour la tour.

Dossiers :
Zadacha2.mq5  4 kb