Школьная задачка для разминки и занять время - страница 4

 
Я так понимаю, что с площадью многоугольника никто не решил?
 
Maxim Kuznetsov:

к трейдингу прямого отношения не имеет, но любопытно. Разминка для мозгов и клавиатуры в выходные :-) Всплыло когда занимался с детьми математикой и пытался учить программированию.

Как известно, площадь треугольника можно посчитать по длинам трёх сторон. Для много-угольников это увы не так, НО если даны длины сторон, то можно найти __максимальную площадь__ фигуры с такими сторонами. 

Внимание вопрос: как это (максимальную площадь многоугольника и прилегающие к сторонам углы) считать аналитически и способен ли оптимизатор MT на подобные фокусы  ? 

хотя это скорее просто любопытная задача для программного решения, но может помочь с оптимизацией: разобраться какие параметры фиксировать и в каких пределах что рассматривать. 

---

просто сравниваем площадь найденную переборами оптимизатора (а она будет зависить от алгоритма и что/как перебирается) и аналитическое решение, которое единственное.

Не смог пройти мимо :))
Да вроде не очень сложная задача. Особенно если решать методом приближения.
Наверняка можно вычислить просто с помощью формулы, но не охота сильно замарачиваться с интегралами, производными.
Тем более скорость расчета (метод половинного деления) шестистороннего многоугольника заняла 4 микросекунды (свет за это время проходит 1.2 км) с точностью расчета радиуса окружности, в который вписан этот многоугольник, до десятого знака после запятой. Это очень избыточная точность.


#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();
}
//+------------------------------------------------------------------+
Файлы:
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-угольник.

 
Nikolai Semko:

Не смог пройти мимо :))
Да вроде не очень сложная задача. Особенно если решать методом приближения.
Наверняка можно вычислить просто с помощью формулы, но не охота сильно замарачиваться с интегралами, производными.
Тем более скорость расчета (метод половинного деления) шестистороннего многоугольника заняла 4 микросекунды (свет за это время проходит 1.2 км) с точностью расчета радиуса окружности, в который вписан этот многоугольник, до десятого знака после запятой. Это очень избыточная точность.


1) Сложность в доказательстве факта, что вершины мн-ка с максимальной площадью должны лежать на одной окружности (теорема Крамера). Не знаю как это доказать или где почитать док-во.

2) Не очень верю в существование аналитической формулы для максимальной площади или для радиуса окружности.

3) Сумму элементов массива можно посчитать функцией MathSum()

 
Программно и школьник решит. Спортивный интерес в том, чтобы формулу вывести.
 
Aleksey Nikolayev:

...

2) Не очень верю в существование аналитической формулы для максимальной площади или для радиуса окружности.

...

Пытаюсь... не выходит каменный цветок пока))

 
Nikolai Semko:

13-угольник.

можно еще по формуле Герона

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();
}

нужна 

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:

нужна 

Canvas.Grad

ой, прошу прощения. Обновил в КБ.

Файлы:
iCanvas.mqh  47 kb