Isınmak ve zaman ayırmak için okul sorunu - sayfa 4

 
Anladığım kadarıyla kimse çokgenin alanını çözemedi?
 
Maxim Kuznetsov :

Ticaretle ilgisi yok, ama ilginç. Hafta sonu beyin ve klavye ısınması :-) Çocuklarla matematik çalışırken ve programlama öğretmeye çalışırken ortaya çıktı.

Bildiğiniz gibi bir üçgenin alanı üç kenarının uzunluklarından hesaplanabilir. Çokgenler için ne yazık ki durum böyle değil, AMA kenarların uzunlukları verilirse, böyle kenarları olan bir şeklin __maksimum alanını__ bulabilirsiniz.

Soru şudur: (çokgenin maksimum alanı ve kenarlara bitişik açılar) analitik olarak nasıl hesaplanır ve MT optimizer bu tür hileler yapabilir mi?

Bu, bir yazılım çözümü için oldukça ilginç bir görev olsa da, optimizasyona yardımcı olabilir: hangi parametrelerin düzeltileceğini ve hangi sınırlar dahilinde nelerin dikkate alınacağını belirleyin.

---

biz sadece optimize edici aramaları tarafından bulunan alanı (ve algoritmaya ve neyin / nasıl sıralandığına bağlı olacaktır) ve tek olan analitik çözümü karşılaştırırız.

geçemedim :)
Evet, çok zor bir iş değil. Özellikle yaklaşık olarak karar verirseniz.
Elbette basitçe bir formül kullanılarak hesaplanabilir, ancak integraller ve türevlerle uğraşma arzusu yoktur.
Ayrıca, altı kenarlı bir çokgenin hesaplama hızı (yarım bölme yöntemi), bu çokgenin yazılı olduğu dairenin yarıçapını onuncu ondalık basamağa kadar hesaplama doğruluğu ile 4 mikrosaniye sürdü (ışık bu süre boyunca 1,2 km yol alır). yer. Bu çok aşırı hassas.


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

 
Nikolai Semko :

geçemedim :)
Evet, çok zor bir iş değil. Özellikle yaklaşık olarak karar verirseniz.
Elbette basitçe bir formül kullanılarak hesaplanabilir, ancak integraller ve türevlerle uğraşma arzusu yoktur.
Ayrıca, altı kenarlı bir çokgenin hesaplama hızı (yarım bölme yöntemi), bu çokgenin yazılı olduğu dairenin yarıçapını onuncu ondalık basamağa kadar hesaplama doğruluğu ile 4 mikrosaniye sürdü (ışık bu süre boyunca 1,2 km yol alır). yer. Bu çok aşırı hassas.


1) Alanı maksimum olan bir kümenin köşelerinin aynı çember üzerinde olması gerektiğini kanıtlamanın zorluğu (Cramer teoremi). Bunu nasıl kanıtlayacağımı veya belgeleri nerede okuyacağımı bilmiyorum.

2) Bir dairenin maksimum alanı veya yarıçapı için analitik bir formülün varlığına gerçekten inanmıyorum.

3) Dizi öğelerinin toplamı MathSum() işlevi kullanılarak hesaplanabilir.

 
Programlı ve öğrenci karar verecek. Spor ilgisi formülü çıkarmaktır.
 
Aleksey Nikolayev :

...

2) Bir dairenin maksimum alanı veya yarıçapı için analitik bir formülün varlığına gerçekten inanmıyorum.

...

Deniyorum ... taş çiçek henüz çıkmıyor))

 
Nikolai Semko :

13-gon.

Heron formülünü de kullanabilirsiniz.

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

ihtiyaç

 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 :

ihtiyaç

 Canvas.Grad

Ah, özür dilerim. KB'de güncellendi.

Dosyalar:
iCanvas.mqh  47 kb