Eine Aufwärmübung für die Schule, um Ihre Zeit zu vertreiben - Seite 4

 
Ich nehme an, dass niemand die Fläche des Polygons gelöst hat?
 
Maxim Kuznetsov:

Nicht direkt mit dem Handel verbunden, aber interessant. Aufwärmen für Gehirn und Tastatur am Wochenende :-) Das Thema kam auf, als ich mit meinen Kindern Mathe machte und versuchte, ihnen das Programmieren beizubringen.

Wie Sie wissen, kann der Flächeninhalt eines Dreiecks aus den Längen seiner drei Seiten berechnet werden. Bei einem Vieleck ist das leider nicht der Fall, aber wenn man die Längen der Seiten angibt, kann man den __maximalen Flächeninhalt__ der Figur mit diesen Seiten finden.

Eine Frage: Wie kann man die maximale Fläche eines Polygons und die Winkel an seinen Seiten analytisch berechnen und ist der MT-Optimierer zu solchen Tricks fähig?

Dies ist zwar eher ein kurioses Problem für eine Softwarelösung, kann aber bei der Optimierung helfen: herauszufinden, welche Parameter zu korrigieren sind und innerhalb welcher Grenzen sie zu berücksichtigen sind.

---

Vergleichen Sie einfach die Fläche, die durch die Brute-Force-Methode des Optimierers gefunden wurde (und das hängt vom Algorithmus und der Art der Brute-Force-Methode ab), mit der analytischen Lösung, die die einzige ist.

Ich konnte es nicht überwinden :))
Es scheint kein sehr schweres Problem zu sein. Vor allem, wenn sie mit Hilfe von Näherungsmethoden gelöst werden.
Sicherlich kann man es einfach per Formel berechnen, aber ich möchte mich nicht mit Integralen und Ableitungen herumschlagen.
Außerdem dauert die Berechnungsgeschwindigkeit (Methode der halben Teilung) eines Sechsecks 4 Mikrosekunden (Licht legt in dieser Zeit 1,2 km zurück) mit einer Genauigkeit der Berechnung des Radius des Kreises, in den dieses Polygon eingeschrieben ist, bis zur zehnten Dezimalstelle. Das ist eine sehr übertriebene Präzision.


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

 
Nikolai Semko:

Ich bin nicht daran vorbeigekommen :))
Es scheint kein sehr schwieriges Problem zu sein. Vor allem, wenn man sie durch Näherung löst.
Ich bin sicher, dass man das einfach per Formel berechnen kann, aber ich möchte mich nicht mit Integralen und Ableitungen herumschlagen.
Außerdem dauert die Berechnungsgeschwindigkeit (Methode der halben Teilung) eines Sechsecks 4 Mikrosekunden (Licht legt in dieser Zeit 1,2 km zurück) mit einer Genauigkeit der Berechnung des Radius des Kreises, in den dieses Polygon eingeschrieben ist, bis zur zehnten Dezimalstelle. Das ist eine sehr übertriebene Präzision.


1) Es ist schwierig, die Tatsache zu beweisen, dass die Eckpunkte der maximalen Fläche mnc auf demselben Kreis liegen müssen (Satz von Cramer). Ich weiß nicht, wie man das beweisen kann oder wo man den Beweis nachlesen kann.

2) Ich glaube nicht wirklich an die Existenz einer analytischen Formel für die maximale Fläche oder den maximalen Radius eines Kreises.

3) Die Summe der Array-Elemente kann mit MathSum() berechnet werden

 
Programmtechnisch kann das sogar ein Schuljunge lösen. Das sportliche Interesse liegt in der Herleitung der Formel.
 
Aleksey Nikolayev:

...

2) Ich glaube nicht wirklich an die Existenz einer analytischen Formel für die maximale Fläche oder den Radius eines Kreises.

...

Ich versuche... (Ich kann noch keine Steinblume bekommen))

 
Nikolai Semko:

13-Ecke.

können Sie auch die Formel von Heron verwenden.

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();
}

Sie benötigen

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:

brauchen

Canvas.Grad

Ups, Entschuldigung. Der QB wurde aktualisiert.

Dateien:
iCanvas.mqh  47 kb