워밍업과 시간이 걸리는 학교 문제 - 페이지 4

 
아무도 다각형 영역을 해결하지 못했다는 것을 이해합니까?
 
Maxim Kuznetsov :

거래와는 관련이 없지만 흥미롭습니다. 주말에 두뇌와 키보드를 위한 워밍업 :-) 그것은 내가 아이들과 수학을 하고 프로그래밍을 가르치려고 할 때 떠올랐다.

아시다시피 삼각형의 면적은 세 변의 길이로 계산할 수 있습니다. 폴리곤의 경우 불행히도 그렇지 않습니다. 그러나 변의 길이가 주어지면 그러한 변을 가진 그림의 __최대 면적__을 찾을 수 있습니다.

문제는 다음과 같습니다 (다각형의 최대 면적과 측면에 인접한 각도)는 어떻게 분석적으로 계산되며 MT 옵티마이저는 이러한 트릭을 수행할 수 있습니까?

이것은 소프트웨어 솔루션의 흥미로운 작업이지만 최적화에 도움이 될 수 있습니다. 수정할 매개변수와 고려해야 할 제한 범위를 파악합니다.

---

우리는 단순히 옵티마이저 검색에 의해 발견된 영역(알고리즘 및 정렬 방식에 따라 다름)과 유일한 분석 솔루션을 비교합니다.

지나칠 수 없었어요 :)
네, 별로 어려운 작업은 아닙니다. 특히 근사값으로 결정하는 경우.
확실히 공식을 사용하여 간단히 계산할 수 있지만 적분 및 미분을 엉망으로 만들고 싶지 않습니다.
또한, 육면체의 계산속도(반분할법)는 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 :

지나칠 수 없었어요 :)
네, 별로 어려운 작업은 아닙니다. 특히 근사값으로 결정하는 경우.
확실히 공식을 사용하여 간단히 계산할 수 있지만 적분 및 미분을 엉망으로 만들고 싶지 않습니다.
또한, 육면체의 계산속도(반분할법)는 4마이크로초(이 시간 동안 빛은 1.2km 이동)가 걸리며, 이 다각형이 내접하는 원의 반지름을 소수점 이하 10자리까지 정확하게 계산할 수 있다. 장소. 이것은 매우 정밀합니다.


1) 최대 면적을 갖는 집합의 꼭짓점이 같은 원 위에 있어야 한다는 사실을 증명하기 어렵다(Cramer의 정리). 나는 그것을 증명하는 방법이나 문서를 읽을 곳을 모릅니다.

2) 나는 최대 면적이나 원의 반지름에 대한 분석 공식의 존재를 정말로 믿지 않습니다.

3) MathSum() 함수를 사용하여 배열 요소의 합을 계산할 수 있습니다.

 
프로그래밍 방식으로 학생이 결정할 것입니다. 스포츠의 관심은 공식을 추론하는 것입니다.
 
Aleksey Nikolayev :

...

2) 나는 최대 면적이나 원의 반지름에 대한 분석 공식의 존재를 정말로 믿지 않습니다.

...

노력중입니다...돌꽃은 아직 안나오네요))

 
Nikolai Semko :

13곤.

헤론의 공식을 사용할 수도 있습니다.

 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

오, 실례합니다. KB에서 업데이트되었습니다.

파일:
iCanvas.mqh  47 kb