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

 
J'en déduis que personne n'a résolu la question de l'aire du polygone ?
 
Maxim Kuznetsov:

Pas directement lié au commerce, mais intéressant. Échauffement pour le cerveau et le clavier du week-end :-) Il est apparu lorsque je faisais des maths avec mes enfants et que j'essayais de leur apprendre la programmation.

Comme vous le savez, l'aire d'un triangle peut être calculée par les longueurs de ses trois côtés. Pour un polygone, hélas, ce n'est pas le cas, mais si les longueurs des côtés sont données, on peut trouver l' __aire maximale__ de la figure avec ces côtés.

Une question : comment la surface maximale d'un polygone et les angles adjacents à ses côtés peuvent-ils être calculés analytiquement et l'optimiseur MT est-il capable de telles astuces ?

bien qu'il s'agisse plutôt d'un problème curieux pour une solution logicielle, mais qui peut aider à l'optimisation : déterminer quels paramètres fixer et dans quelles limites considérer.

---

il suffit de comparer la zone trouvée par la force brute de l'optimiseur (et cela dépendra de l'algorithme et de ce/de la manière dont il est forcé brutalement) et la solution analytique, qui est la seule.

Je n'ai pas pu le surmonter :))
Il semble que ce ne soit pas un problème très difficile. Surtout si elle est résolue par une méthode d'approximation.
Bien sûr, il peut être calculé simplement par formule, mais je ne veux pas m'embêter avec les intégrales et les dérivées.
En outre, la vitesse de calcul (méthode de la demi-division) d'un hexagone prend 4 microsecondes (la lumière parcourt 1,2 km dans ce laps de temps) avec une précision de calcul du rayon du cercle dans lequel ce polygone est inscrit, jusqu'à la dixième décimale. Cette précision est très excessive.


#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#define  EPS 0.0000000001  // необходимая точность нахождения R

ulong t1;

void OnStart()
{
   double arr[]= {1,2,3,4,5,6};
   t1=GetMicrosecondCount();
   int size = ArraySize(arr);
   double max=arr[ArrayMaximum(arr)];
   double sum=0;
   for(int i=0; i<size; i++) sum+=arr[i];
   if (max>sum/2) {
      Print("Не существует многоугольника с таким набором сторон");
      return;
   }
   double R_max=sum/4;
   double R_min=max/2;
   double R=0;
   double delta=1;
   while(fabs(delta)>EPS) {
      double a=0;
      R=(R_max+R_min)/2;
      for(int i=0; i<size; i++) a+=2*asin(arr[i]/(2*R));
      delta = a-2*M_PI;
      if (delta>0) R_min=R;
      else R_max=R;
   }
   t1=GetMicrosecondCount()-t1;
   DrawFigure(arr,R);
   Sleep(20000);
}
//+------------------------------------------------------------------+
void DrawFigure(double &arr[],double r)
{
   Canvas.Erase();
   int size = ArraySize(arr);
   int x0=_Width/2;
   int y0=_Height/2;
   double k=(y0-10.0)/r;
   Canvas.Circle(x0,y0,Round(r*k),0xFF0000FF);
   double a=0;
   double S=0;
   for(int i=0; i<size; i++) {
      double b=2*asin(arr[i]/(2*r));
      Canvas.FillTriangle(x0,y0,Round(x0+cos(a)*r*k),Round(y0+sin(a)*r*k),Round(x0+cos(a+b)*r*k),Round(y0+sin(a+b)*r*k),Canvas.Grad(double(i)/(size-1)));
      S+=r*r*sin(b)/2;
      a+=b;
   }
   Canvas.CurentFont("Arial",40,50);
   _CommXY(100,100,"Время расчета = "+string(t1)+" микросекунд");
   _Comment("Радиус окружности = " + DoubleToString(r));
   _Comment("Макс площадь фигуры = " + DoubleToString(S,5));
   Canvas.Update();
}
//+------------------------------------------------------------------+
Dossiers :
Zadacha.mq5  5 kb
iCanvas.mqh  47 kb
 
double arr[]= {1, 2, 3, 4, 5, 6, 4.1, 8.5, 4.1, 3.4, 7, 4.7, 3.2};

13 Angle.

 
Nikolai Semko:

Je n'ai pas réussi à le dépasser :))
Il ne semble pas que ce soit un problème très difficile. Surtout si vous le résolvez par approximation.
Je suis sûr qu'il peut être calculé simplement par formule, mais je ne veux pas m'embêter avec les intégrales et les dérivées.
En outre, la vitesse de calcul (méthode de la demi-division) d'un hexagone prend 4 microsecondes (la lumière parcourt 1,2 km dans ce laps de temps) avec une précision de calcul du rayon du cercle dans lequel ce polygone est inscrit, jusqu'à la dixième décimale. Cette précision est très excessive.


1) La difficulté de prouver le fait que les sommets de l'aire maximale mn 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 maximale ou pour le rayon d'un cercle.

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

 
Programmatiquement, même un écolier peut le résoudre. L'intérêt sportif est de dériver la formule.
 
Aleksey Nikolayev:

...

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

...

J'essaie... (Je ne peux pas encore obtenir une fleur de pierre))

 
Nikolai Semko:

13-corner.

vous pouvez également utiliser la formule de Heron.

void DrawFigure(double &arr[],double r) {
  Canvas.Erase();
  int size = ArraySize(arr);
  int x0=_Width/2;
  int y0=_Height/2;
  double k=(y0-10.0)/r;
  Canvas.Circle(x0,y0,Round(r*k),0xFF0000FF);
  double a=0;
  double S=0;
  for(int i=0; i<size; i++) {
    //double b=2*asin(arr[i]/(2*r));   
    //Canvas.FillTriangle(x0,y0,Round(x0+cos(a)*r*k),Round(y0+sin(a)*r*k),Round(x0+cos(a+b)*r*k),Round(y0+sin(a+b)*r*k),Canvas.Grad(double(i)/(size-1)));
    //S+=r*r*sin(b)/2;
    //a+=b;
    
    double p = (2*r + arr[i])/2;//полупериметр треугольника   
    S += MathSqrt(p*MathPow(p-r,2)*(p-arr[i])); //формула Герона  
    
  }
  Canvas.CurentFont("Arial",40,50);
  _CommXY(100,100,"Время расчета = "+string(t1)+" микросекунд");
  _Comment("Радиус окружности = " + DoubleToString(r));
  _Comment("Макс площадь фигуры = " + DoubleToString(S,5));
  Canvas.Update();
}

vous avez besoin

Canvas.Grad
 
Площадь многоугольника
Площадь многоугольника
  • matematikalegko.ru
Площадь многоугольника Площадь многоугольника. Друзья! К вашему вниманию пару задачек с многоугольником и вписанной в него окружностью. Существует формула, которой связывается радиус указанной окружности и периметр с площадью такого многоугольника. Вот она: Как выводится эта формула? Просто! Имеем многоугольник и вписанную окружность...
 
Площадь
  • algolist.ru
Утверждение: площадь многоугольника - замкнутой ломаной без самопересечений, заданной своими вершинами в порядке обхода, вычисляется по формуле: Пусть требуется определить площадь полигона A 1 , A 2 , A 3 , A 4 , A 5 с координатами вершин x 1 ,y 1 ; x 2 ,y 2 ; x 3 ,y 3 ; x 4 ,y 4 ; x 5 ,y 5 . Площадь полигона S можно представить трапециями, у...
 
Iurii Tokman:

besoin de

Canvas.Grad

Oups, désolé. Mise à jour du QB.

Dossiers :
iCanvas.mqh  47 kb