時間を占有する学校のウォームアップ運動 - ページ 4

 
ポリゴンの面積は誰も解いていないのですね?
 
Maxim Kuznetsov:

トレーディングとは直接関係ないが、興味深い。週末の脳とキーボードのためのウォームアップ :-)子供と算数をしていて、プログラミングを教えようとした時に出てきたんです。

ご存知のように、三角形の面積は3辺の長さで計算できます。多角形の場合は、残念ながらそうではありませんが、辺の長さが与えられていれば、その辺を持つ図形の__最大面積__を求めることができます。

多角形の最大面積と辺に隣接する角度を解析的に計算する方法と、MTオプティマイザはそのようなトリックが可能なのか?

しかし、これはソフトウェアで解決するには、むしろ不思議な問題であり、最適化には役立つかもしれない:どのパラメータを修正し、どの範囲まで考慮すべきかを把握する。

---

は、オプティマイザのブルートフォース(アルゴリズムやブルートフォースの内容・方法にもよりますが)で求めた面積と、解析解を比較すればいいだけです。

Couldn't get past it :))
あまり難しい問題ではなさそうです。特に近似法で解いた場合。
確かに数式で簡単に計算できるのですが、積分や微分をわざわざするのは面倒なんです。
また、六角形の計算速度(半割法)は4マイクロ秒(この間に光が1.2km進む)、この多角形が内接する円の半径の計算精度は小数点以下10桁までである。これは非常に過剰な精度です。


#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:

Couldn't get past it :))
あまり難しい問題ではなさそうですね。特に近似値で解くと。
数式で簡単に計算できるのだろうが、積分や微分をわざわざするのは面倒だ。
また、六角形の計算速度(半割法)は4マイクロ秒(この間に光が1.2km進む)、この多角形が内接する円の半径の計算精度は小数点以下10桁までである。これは非常に過剰な精度です。


1) 最大面積の mnc の頂点は必ず同じ円上に存在するという事実の証明が困難である (Cramer の定理)。どう証明すればいいのか、どこで証明書を読めばいいのかわからない。

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