時間を占有する学校のウォームアップ運動 - ページ 5

 
Aleksey Nikolayev:

1) 最大面積の頂点が同じ円上になければならないという事実を証明するのは難しい(Cramerの定理)。どう証明すればいいのか、どこで証明書を読めるのかわからない。

2) 円の面積や半径が最大になる解析式が存在するとはあまり思っていない。

3)配列 要素の和は MathSum() で計算できる。

1)これは当たり前の事実だと思います。そして、与えられた頂点A、正中線h、与えられた対辺aの三角形の面積が最大となるのは、与えられた頂点の角度が最大となるとき、二等辺三角形の面積となることを理解すれば容易に証明できる。そして、そのような三角形の面積は、h*a/2である

多角形の与えられた辺の間のすべてのノードが柔軟であると想像してください(磁石の子供の工作セットのように)、すべての頂点が共通の等距離中心を持つように(大きな辺が他の辺の合計より小さく、さもなければ接続できない)、つまり円に内接するように辺を配置できることが明らかです。そして、この円の半径に等しい辺を持つ二等辺三角形の面積の和からなるので、これが最大の面積となる。

2)私は信じている

3) MQL4、MQL5ではこのような数式は見当たりません。

 
Nikolai Semko:

1)これは当たり前の事実だと思います。

直感的にはそうなのですが、どう考えても厳密な証明にまでは至らないのです。

2)私は信じている

もしあれば、それは見つけることができ、そこには方程式の系があるだけである

アレクセイ・ニコラエフ

1) 最大の面積を持つmncの頂点は必ず同じ円上に存在するという事実の証明が困難である(Cramerの定理)。どう証明すればいいのか、どこで証明書を読めばいいのかわからない。

そのような定理はまったく見つからず、この性質についての言及があるのみでした。

相変わらず、無駄な参考文献と、要点に関する言葉がない。

 
Andrei Trukhanovich:


相変わらず無駄な言及ばかりで、中身がない。

問答無用

 
Nikolai Semko:

1)これは当たり前の事実だと思います。そして、与えられた頂点A、正中線h、与えられた対辺aの三角形の面積が最大となるのは、与えられた頂点の角度が最大となるときの二等辺三角形の面積であることを理解すれば容易に証明される。そして、そのような三角形の面積は、h*a/2である

多角形の与えられた辺の間のすべてのノードが柔軟であると想像してください(磁石の子供の工作セットのように)、すべての頂点が共通の等距離中心を持つように(大きな辺が他の辺の合計より小さく、さもなければ接続できない)、つまり円に内接するように辺を配置できることが明らかです。そして、この円の半径に等しい辺を持つ二等辺三角形の面積の和からなるので、これが最大の面積となる。

2)私は信じている

3) MQL4やMQL5には、そのような数式は見当たりません。

1) おそらく、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



 

他の多項式の根から多項式を求め、このすべてのバアドオーバーから3つの導関数を取るのです。キログラムの計算式そして、もしかしたら最後にはサプライズが待っているかもしれない。何か仕掛けが必要だ。

 
Andrei Trukhanovich:

直感的にはそうですが、どう考えても厳密な証明にすらなっていません。

あったらあったで、方程式の体系しかない

そのような定理は全く見つからず、この性質についての言及があるのみでした。

相変わらず無駄な参考文献で、要点が一言も書かれていない。

最大面積の辺を持つ多角形」でググってみると、この結果は「よく知られている」ことがわかるだけです)、ニコライが示したような数値解法があります。

どうやら、幾何学に関する古代の書物を調べなければならないようです。今は、そのようなことを解説するのは好ましくないようです。

 

上記の解答は、円周の中心が外周の内側にある多角形に対してのみ有効である。三角形{2,2,3.9}を試してみる。

一般論として(precision doubleによる近似)、解答は以下のようになる。

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}を試してみる。

...

辺の寸法から最大面積の多角形を求める問題なのに、三角形と何の関係があるのでしょうか?

 

おっとっと。私自身は、正しくカウントしているバリエーションは1つだけです)))

UPD:修正しました。

 
Dmitry Fedoseev:

他の多項式の根から多項式を求め、このすべてのバアドオーバーから3つの導関数を取るのです。キログラムの計算式そして、もしかしたら最後にはサプライズが待っているかもしれない。何か仕掛けが必要だ。

以下は、半径に対する全角度の和の関数です。2pの溶解領域は緑色で表示されています。

もしかしたら、これが役に立つかもしれません。
特にタワーは苦手なので、頭を悩ませるのが億劫です。

ファイル:
Zadacha2.mq5  4 kb