占用你时间的学校热身运动 - 页 5

 
Aleksey Nikolayev:

1)很难证明最大面积的顶点必须位于同一个圆上的事实(克拉默定理)。我不知道如何证明它,也不知道在哪里可以读到证明。

2)我并不真的相信存在圆的最大面积或半径的分析公式。

3)数组元素 的总和可以通过MathSum()计算。

1)我认为这是一个明显的事实。而通过理解很容易证明,当给定顶点A、中线h和给定对边a的三角形的最大面积是等腰三角形的面积时,给定顶点的角度是最大的。而这种三角形的面积为h*a/2

想象一下,多边形给定边之间的所有节点都是灵活的(就像儿童在磁铁上的建筑套装一样),很明显,我们可以将边排列成这样一种方式,即所有顶点都有一个共同的等距中心(前提是大边小于其他边的总和,否则不能连接),即刻在一个圆内。而这将是最大的面积,因为它由等腰三角形的面积之和组成,其边长等于这个圆的半径。

2) 我相信

3) 我在MQL4或MQL5中没有找到这样的公式。

 
Nikolai Semko:

1)我认为这是一个明显的事实。

直观上是的,但它甚至没有延伸到一个僵硬的证明,无论如何。

2) 我相信

如果有,可以找到,只有一个方程组

Aleksey Nikolayev:

1)困难在于证明这样一个事实:面积最大的mnc的顶点必须位于同一个圆上(克拉默定理)。我不知道如何证明它,也不知道在哪里可以读到证明。

我根本没有找到这样的定理,只是提到了这个属性。

像往常一样,无用的参考资料,没有一个字是关于这个问题的。

 
Andrei Trukhanovich:


像往常一样,没有用的参考资料,没有一个字的内容。

对你来说真的没有用

 
Nikolai Semko:

1)我认为这是一个明显的事实。而通过理解很容易证明,当给定顶点A、中线h和给定对边a的三角形的最大面积是等腰三角形的面积时,给定顶点的角是最大的。而这种三角形的面积为h*a/2

想象一下,多边形给定边之间的所有节点都是灵活的(就像儿童在磁铁上的建筑套装一样),很明显,我们可以将边排列成这样一种方式,即所有顶点都有一个共同的等距中心(前提是大边小于其他边的总和,否则不能连接),即刻在一个圆内。而这将是最大的面积,因为它由等腰三角形的面积之和组成,其边长等于这个圆的半径。

2) 我相信

3) 我在MQL4或MQL5中没有发现这样的公式。

1) 也许可以用某种方式将其正式化为:当顶点位于一个圆上时,顶点的坐标对mnc面积的变化(导数)等于零。只是这是一个局部极值的条件,我们需要证明:1)它是一个最大值;2)它是全局的。

3)MathSum()

#include <Math\Stat\Math.mqh>
void OnStart()
{
  double a[] = {1.0, 2.0, 3.0}, s;
  s = MathSum(a);
  Print("s=", s);
}

s=6.0



 

你从其他多项式的根中得到一个多项式,并从所有这些baad中得到三个导数。千米公式。谁知道呢,也许最后会有一个惊喜在等着。我们必须要有一些诀窍。

 
Andrei Trukhanovich:

直观上是的,但它甚至不等于一个严格的证明。

如果有,可以找到,只有一个方程组。

我根本找不到这样的定理,只提到了这个属性。

像往常一样,无用的参考资料,没有一个字是关于这个问题的。

在网上搜索 "给定边最大面积的多边形",只发现这个结果是 "众所周知的")和像尼古拉给出的数字解决方案。

显然,你必须翻阅一些关于几何学的古书--现在他们不喜欢阐述这种东西了。

 

上述解法仅适用于圆心位于周长内的多边形。试试三角形{2,2,3.9}。

在一般情况下(用精确的双倍数进行近似),解决方案如下。

enum EEqual {LESS=-1,EQUALY,MORE};
//-------------------------------------------------------
struct SRes{
   double s;
   double r;
   double degDelta;
   SRes(){ZeroMemory(this);}
   SRes(double _s,double _r,double _degDelta):s(_s),r(_r),degDelta(_degDelta){}
   SRes(const SRes &other) {this=other;}
   bool operator !() {return !s;}
};
//-------------------------------------------------------
const double _2PI=2*M_PI;
//-------------------------------------------------------
EEqual Check(double &array[],int size){
   int ii=0;
   double max=0.0,
          tmp=0.0,
          sum=0.0;
   for (int i=0;i<size;++i){
      if (array[i]<=0.0) return false;
      max=MathMax(max,array[i]);
      if (max!=tmp){
         ii=i;
         tmp=max;}
      sum+=array[i];}
   EEqual ret=max<sum/2?MORE:LESS;
   if (ret==MORE){
      tmp=array[ii];
      array[ii]=array[--size];
      array[size]=tmp;}
   return ret;}
//---------------------------------------------------
SRes ComputeCenterOut(const double &array[], double deg){
   int size=ArraySize(array)-1;
   double r=array[size]/2.0/sin((deg-M_PI)/2.0);
   double sum=0.0,
          square=-r*cos(deg/2.0)*array[size]/2.0;
   for (int i=0;i<size;++i){
      double _deg=2.0*MathArcsin(array[i]/2.0/r);
      sum+=_deg;
      square+=r*cos(_deg/2.0)*array[i];}
   return SRes(square,r,deg-M_PI-sum);
}
//---------------------------------------------------
SRes ComputeCenterIn(const double &array[], double deg){
   int size=ArraySize(array)-1;
   double r=array[size]/2.0/sin(deg/2.0);
   double sum=deg,
          square=r*cos(deg/2.0)*array[size]/2.0;
   for (int i=0;i<size;++i){
      double _deg=2.0*MathArcsin(array[i]/2.0/r);
      sum+=_deg;
      square+=r*cos(_deg/2.0)*array[i]/2.0;}
   return SRes(square,r,_2PI-sum);
}
//---------------------------------------------------
SRes ComputeSquare(const double &array[],double min,double max,SRes &prev){
   double a=(min+max)/2.0;
   if (a==min||a==max) return prev;
   SRes res=a>M_PI?ComputeCenterOut(array,a):ComputeCenterIn(array,a);
   if (res.degDelta==0.0||res.s==prev.s) return res;
   if (res.degDelta>0.0) min=a;
   else max=a;
   return ComputeSquare(array,min,max,res);}
//---------------------------------------------------
SRes Square(const double &in[]){
   double tmp[];
   int size=ArrayCopy(tmp,in);
   if (Check(tmp,size)!=MORE) return SRes();
   double aMax=_2PI,
          a=aMax/size;
   return ComputeSquare(tmp,a,aMax,SRes());
}

void OnStart(void)
{
   double arr[]={2,3.9,2};
   ulong time=GetMicrosecondCount();
   SRes res=Square(arr);
   time=GetMicrosecondCount()-time;
   if (!res) Print("Многоугольника с заданными сторонами не существует");
   else PrintFormat("Time=%lli %ss\n"
                    "Square=%f\n"
                    "Radii=%f",time,"\xB5",res.s,res.r);
}
 
Vladimir Simakov:

上述解法仅适用于圆心位于周长内的多边形。试试三角形{2,2,3.9}。

...

如果问题是在给定边的尺寸下找到一个面积最大的多边形,这与三角形有什么关系?

 

哎呀。我自己只有一个变体计算正确)))))。

UPD: 纠正了。

 
Dmitry Fedoseev:

你从其他多项式的根中得到一个多项式,并从所有这些baad中得到三个导数。千米公式。谁知道呢,也许最后会有一个惊喜在等着。我们必须要有一些诀窍。

这里是所有角度的总和与半径的函数。2p的溶液区域以绿色突出显示。

也许这将会有所帮助。
,我懒得绞尽脑汁,尤其是我对塔不太擅长。

附加的文件:
Zadacha2.mq5  4 kb