占用你时间的学校热身运动 - 页 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)难以证明最大面积mn的顶点必须位于同一圆上的事实(克拉默定理)。我不知道如何证明它,也不知道在哪里可以读到证明。

2)我并不真正相信存在一个关于最大面积或圆的半径的分析公式。

3)数组元素 的总和可以通过MathSum()计算。

 
在程序上,即使是小学生也能解决这个问题。体育方面的兴趣在于推导出公式。
 
Aleksey Nikolayev:

...

2)我不太相信存在一个关于最大面积或圆的半径的分析公式。

...

试图...(我还不能得到一朵石花))

 
Nikolai Semko:

13号角。

你也可以使用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();
}

你需要

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

哎呀,对不起。更新了QB。

附加的文件:
iCanvas.mqh  47 kb