Un ejercicio de calentamiento escolar para ocupar su tiempo - página 4

 
¿Supongo que nadie ha resuelto el área del polígono?
 
Maxim Kuznetsov:

No está directamente relacionado con el comercio, pero es interesante. Calentamiento para el cerebro y el teclado del fin de semana :-) Surgió cuando hacía matemáticas con mis hijos e intentaba enseñarles programación.

Como sabes, el área de un triángulo se puede calcular mediante las longitudes de sus tres lados. Para un polígono, por desgracia, no es así, pero si se dan las longitudes de los lados, se puede encontrar el __área máxima__ de la figura con esos lados.

Una pregunta: ¿cómo (el área máxima de un polígono y los ángulos adyacentes a sus lados) se puede calcular analíticamente y es el optimizador MT capaz de tales trucos?

aunque esto es más bien un problema curioso para la solución de software, pero puede ayudar a la optimización: averiguar qué parámetros fijar y dentro de qué límites considerar.

---

Sólo hay que comparar el área encontrada por la fuerza bruta del optimizador (y dependerá del algoritmo y de cómo sea la fuerza bruta) y la solución analítica, que es la única.

No pude superarlo :))
Parece que no es un problema muy difícil. Especialmente si se resuelve por el método de aproximación.
Seguro que se puede calcular simplemente mediante una fórmula, pero no quiero molestarme con integrales y derivadas.
Además la velocidad de cálculo (método de la media división) de un hexágono tarda 4 microsegundos (la luz recorre 1,2 km en este tiempo) con precisión de cálculo del radio del círculo en el que se inscribe este polígono, hasta la décima cifra decimal. Se trata de una precisión muy excesiva.


#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();
}
//+------------------------------------------------------------------+
Archivos adjuntos:
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:

No pude superarlo :))
No parece ser un problema muy difícil. Sobre todo si se resuelve por aproximación.
Estoy seguro de que se puede calcular simplemente mediante una fórmula, pero no quiero molestarme con integrales y derivadas.
Además la velocidad de cálculo (método de la media división) de un hexágono tarda 4 microsegundos (la luz recorre 1,2 km en este tiempo) con precisión de cálculo del radio del círculo en el que se inscribe este polígono, hasta la décima cifra decimal. Se trata de una precisión muy excesiva.


1) La dificultad de demostrar el hecho de que los vértices del área máxima mn deben estar en el mismo círculo (teorema de Cramer). No sé cómo demostrarlo ni dónde leer las pruebas.

2) No creo realmente en la existencia de una fórmula analítica para el área máxima o para el radio de un círculo.

3) La suma de los elementos del array se puede calcular con MathSum()

 
Programáticamente, hasta un escolar puede resolverlo. El interés deportivo está en derivar la fórmula.
 
Aleksey Nikolayev:

...

2) No creo realmente en la existencia de una fórmula analítica para el área máxima o para el radio de un círculo.

...

Intentando... (Todavía no puedo conseguir una flor de piedra))

 
Nikolai Semko:

Esquina 13.

también puedes usar la 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();
}

necesitas

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:

necesito

Canvas.Grad

Oops, lo siento. Actualiza el QB.

Archivos adjuntos:
iCanvas.mqh  47 kb