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

 
Aleksey Nikolayev:

1) Es ist schwierig, die Tatsache zu beweisen, dass die Eckpunkte der maximalen Fläche 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

1) Ich denke, das ist eine offensichtliche Tatsache. Und es ist leicht zu beweisen, wenn man versteht, dass die maximale Fläche eines Dreiecks mit einer gegebenen Spitze A, einer Mittellinie h und einer gegebenen gegenüberliegenden Seite a die Fläche eines gleichschenkligen Dreiecks ist, wenn der Winkel an der gegebenen Spitze maximal ist. Und der Flächeninhalt eines solchen Dreiecks ist h*a/2

Stellen Sie sich vor, dass alle Knoten zwischen gegebenen Seiten von Polygonen flexibel sind (wie in einem Kinderbaukasten mit Magneten), und es ist klar, dass wir die Seiten so anordnen können, dass alle Scheitelpunkte einen gemeinsamen äquidistanten Mittelpunkt haben (vorausgesetzt, die größere Seite ist kleiner als die Summe der anderen Seiten, sonst können sie nicht verbunden werden), d.h. in einen Kreis eingeschrieben. Dies ist die maximale Fläche, da sie aus der Summe der Flächen gleichschenkliger Dreiecke besteht, deren Seitenlänge dem Radius des Kreises entspricht.

2) Ich glaube

3) Ich habe keine solche Formel in MQL4 oder MQL5 gefunden.

 
Nikolai Semko:

1) Ich denke, das ist eine offensichtliche Tatsache.

intuitiv ja, aber das reicht bei weitem nicht aus, um einen festen Beweis zu erbringen.

2) Ich glaube

Wenn es eine gäbe, könnte sie gefunden werden, es gibt nur ein System von Gleichungen

Aleksey Nikolayev:

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

Ich habe ein solches Theorem nicht gefunden, nur Hinweise auf diese Eigenschaft.

wie immer: nutzlose Links und kein Wort zur Sache.

 
Andrei Trukhanovich:


wie üblich nutzlose Verweise und kein einziges Wort der Substanz.

es ist wirklich nutzlos für Sie

 
Nikolai Semko:

1) Ich denke, das ist eine offensichtliche Tatsache. Und es ist leicht zu beweisen, wenn man versteht, dass die maximale Fläche eines Dreiecks mit einer gegebenen Spitze A, einer Mittellinie h und einer gegebenen gegenüberliegenden Seite a die Fläche eines gleichschenkligen Dreiecks ist, wenn der Winkel an der gegebenen Spitze maximal ist. Und der Flächeninhalt eines solchen Dreiecks ist h*a/2

Stellen Sie sich vor, dass alle Knoten zwischen gegebenen Seiten von Polygonen flexibel sind (wie in einem Kinderbaukasten mit Magneten), und es ist klar, dass wir die Seiten so anordnen können, dass alle Scheitelpunkte einen gemeinsamen äquidistanten Mittelpunkt haben (vorausgesetzt, die größere Seite ist kleiner als die Summe der anderen Seiten, sonst können sie nicht verbunden werden), d.h. in einen Kreis eingeschrieben. Dies ist die maximale Fläche, da sie aus der Summe der Flächen gleichschenkliger Dreiecke besteht, deren Seitenlänge dem Radius des Kreises entspricht.

2) Ich glaube

3) Ich habe keine solche Formel in MQL4 oder MQL5 gefunden.

1) Vielleicht kann es irgendwie formalisiert werden als Gleichheit der Variation (Ableitung) der Fläche eines mnc nach den Koordinaten der Eckpunkte, wenn sie auf einem Kreis liegen. Nur ist dies eine Bedingung der lokalen Extremität und wir müssen 1) beweisen, dass es ein Maximum ist und 2) dass es global ist.

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



 

Man erhält ein Polynom aus den Wurzeln der anderen Polynome, und von all dem nimmt man drei Ableitungen. Kilometrische Formeln. Und wer weiß, vielleicht wartet am Ende noch eine Überraschung. Wir müssen uns einen Trick einfallen lassen.

 
Andrei Trukhanovich:

intuitiv ja, aber das ist noch lange kein starrer Beweis.

wenn es eine gäbe, könnte sie gefunden werden, es gibt nur ein System von Gleichungen

Ich konnte kein solches Theorem finden, nur Erwähnungen dieser Eigenschaft.

wie üblich nutzlose Verweise und kein einziges Wort zur Sache.

Googelt man "maximum area polygon given sides", findet man nur, dass dieses Ergebnis "well known" ist) und numerische Lösungen wie die von Nikolay.

Offenbar muss man dazu einige alte Bücher über Geometrie lesen - heutzutage wird so etwas nicht mehr gerne erläutert.

 

Die obige Lösung gilt nur für Polygone, bei denen der Mittelpunkt des Umkreises innerhalb des Umfangs liegt. Versuchen Sie das Dreieck {2,2,3.9}

Im Allgemeinen (Annäherung durch Präzisionsdoppel) wird wie folgt gelöst:

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:

Die obige Lösung gilt nur für Polygone, bei denen der Mittelpunkt des Umkreises innerhalb des Umfangs liegt. Versuchen Sie das Dreieck {2,2,3.9}

...

Was hat das mit einem Dreieck zu tun, wenn das Problem darin besteht, ein Polygon mit der maximalen Fläche bei gegebenen Seitenmaßen zu finden?

 

Ups. Ich selbst habe nur eine der Varianten richtig gezählt)))

UPD: Korrigiert.

 
Dmitry Fedoseev:

Man erhält ein Polynom aus den Wurzeln der anderen Polynome, und von all dem nimmt man drei Ableitungen. Kilometrische Formeln. Und wer weiß, vielleicht wartet am Ende noch eine Überraschung. Wir müssen uns einen Trick einfallen lassen.

Hier ist die Funktion für die Summe aller Winkel in Abhängigkeit vom Radius. Der Lösungsbereich von 2p ist grün hervorgehoben.

Vielleicht hilft das hier weiter.
Ich bin zu faul, mir den Kopf zu zerbrechen, zumal ich mich mit dem Turm nicht besonders gut auskenne.

Dateien:
Zadacha2.mq5  4 kb
Grund der Beschwerde: