Un esercizio di riscaldamento scolastico per occupare il tuo tempo - pagina 4

 
Immagino che nessuno abbia risolto l'area del poligono?
 
Maxim Kuznetsov:

Non direttamente collegato al trading, ma interessante. Un riscaldamento per il cervello e la tastiera nel fine settimana :-) È venuto fuori quando facevo matematica con i miei figli e cercavo di insegnare loro la programmazione.

Come sapete, l'area di un triangolo può essere calcolata dalle lunghezze dei suoi tre lati. Per un poligono, ahimè, non è così, ma se le lunghezze dei lati sono date, si può trovare l'__area massima__ della figura con quei lati.

Nota una domanda: come (area massima di un poligono e angoli adiacenti ai suoi lati) può essere calcolata analiticamente e l'ottimizzatore MT è capace di tali trucchi?

anche se questo è piuttosto solo un problema curioso per la soluzione del software, ma può aiutare con l'ottimizzazione: capire quali parametri fissare ed entro quali limiti considerare.

---

basta confrontare l'area trovata dalla forza bruta dell'ottimizzatore (e dipenderà dall'algoritmo e da cosa/come viene forzata) e la soluzione analitica, che è l'unica.

Non ho potuto superarlo :))
Sembra che non sia un problema molto difficile. Soprattutto se risolto con il metodo dell'approssimazione.
Certo, può essere calcolato semplicemente con una formula, ma non voglio preoccuparmi di integrali e derivate.
Inoltre la velocità di calcolo (metodo della mezza divisione) di un esagono richiede 4 microsecondi (la luce percorre 1,2 km in questo tempo) con precisione di calcolo del raggio del cerchio in cui questo poligono è inscritto, fino alla decima cifra decimale. Questa è una precisione davvero eccessiva.


#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();
}
//+------------------------------------------------------------------+
File:
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 Angolo.

 
Nikolai Semko:

Non ho potuto superarlo :))
Non sembra essere un problema molto difficile. Soprattutto se lo si risolve per approssimazione.
Sono sicuro che può essere calcolato semplicemente con una formula, ma non voglio preoccuparmi di integrali e derivate.
Inoltre la velocità di calcolo (metodo della mezza divisione) di un esagono richiede 4 microsecondi (la luce percorre 1,2 km in questo tempo) con precisione di calcolo del raggio del cerchio in cui questo poligono è inscritto, fino alla decima cifra decimale. Questa è una precisione davvero eccessiva.


1) La difficoltà di dimostrare il fatto che i vertici dell'area massima mn devono trovarsi sullo stesso cerchio (teorema di Cramer). Non so come dimostrarlo o dove leggere le prove.

2) Non credo davvero nell'esistenza di una formula analitica per l'area massima o per il raggio di un cerchio.

3) La somma degli elementi dell'array può essere calcolata da MathSum()

 
Programmaticamente, anche uno scolaretto può risolverlo. L'interesse sportivo è nel derivare la formula.
 
Aleksey Nikolayev:

...

2) Non credo davvero nell'esistenza di una formula analitica per l'area massima o per il raggio di un cerchio.

...

Provando... (Non posso ancora ottenere un fiore di pietra))

 
Nikolai Semko:

13° angolo.

si può anche usare la formula di 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();
}

hai bisogno di

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:

bisogno di

Canvas.Grad

Ops, scusate. Aggiornato il QB.

File:
iCanvas.mqh  47 kb