Um exercício de aquecimento escolar para ocupar seu tempo - página 4

 
Presumo que ninguém tenha resolvido a área do polígono?
 
Maxim Kuznetsov:

Não diretamente relacionado ao comércio, mas interessante. Aquecimento para o cérebro e teclado no fim de semana :-) Surgiu quando eu estava fazendo matemática com meus filhos e tentando ensiná-los programação.

Como você sabe, a área de um triângulo pode ser calculada pelo comprimento de seus três lados. Para um polígono, infelizmente, não é assim, mas se você der comprimentos de lados, você pode encontrar a __área máxima__ da figura com esses lados.

Note uma pergunta: como ele (área máxima de um polígono e ângulos adjacentes a seus lados) pode ser computado analiticamente e o otimizador de MT é capaz de tais truques ?

embora este seja apenas um problema curioso para a solução de software, mas pode ajudar na otimização: descubra quais parâmetros corrigir e dentro de quais limites considerar.

---

basta comparar a área encontrada pela força bruta do otimizador (e dependerá do algoritmo e do que/como ele é bruto) e a solução analítica, que é a única.

Não foi possível superar isto :))
Parece não ser um problema muito difícil. Especialmente se resolvido pelo método de aproximação.
Claro que pode ser calculado simplesmente por fórmula, mas não quero me preocupar com integrais e derivados.
Além da velocidade de cálculo (método de meia divisão) de um hexágono leva 4 microssegundos (a luz percorre 1,2 km neste tempo) com precisão de cálculo do raio do círculo no qual este polígono está inscrito, até a décima casa decimal. Isto é uma precisão muito excessiva.


#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();
}
//+------------------------------------------------------------------+
Arquivos anexados:
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 Ângulo.

 
Nikolai Semko:

Não foi possível superar isto :))
Não parece ser um problema muito difícil. Especialmente se você o resolve por aproximação.
Tenho certeza de que pode ser calculado simplesmente por fórmula, mas não quero me preocupar com integrais e derivados.
Além da velocidade de cálculo (método de meia divisão) de um hexágono leva 4 microssegundos (a luz percorre 1,2 km neste tempo) com precisão de cálculo do raio do círculo no qual este polígono está inscrito, até a décima casa decimal. Isto é uma precisão muito excessiva.


1) A dificuldade em provar que os vértices da área máxima mn devem estar no mesmo círculo (teorema de Cramer). Eu não sei como provar ou onde ler a prova.

2) Eu não acredito realmente na existência de fórmula analítica para a área máxima ou raio de um círculo.

3) A soma dos elementos da matriz pode ser calculada por MathSum()

 
Programmaticamente, até mesmo um estudante pode resolvê-lo. O interesse esportivo está em derivar a fórmula.
 
Aleksey Nikolayev:

...

2) Eu não acredito realmente na existência de uma fórmula analítica para a área máxima ou para o raio de um círculo.

...

Tentando... (ainda não consigo obter uma flor de pedra))

 
Nikolai Semko:

13-corner.

você também pode usar a fórmula 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();
}

você precisa

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:

necessidade

Canvas.Grad

Oops, desculpe. Atualização do QB.

Arquivos anexados:
iCanvas.mqh  47 kb