Un esercizio di riscaldamento scolastico per occupare il tuo tempo - pagina 5

 
Aleksey Nikolayev:

1) È difficile dimostrare il fatto che i vertici dell'area massima devono trovarsi sullo stesso cerchio (teorema di Cramer). Non so come dimostrarlo o dove leggere la prova.

2) Non credo davvero nell'esistenza di una formula analitica per l'area o il raggio massimo di un cerchio.

3) La somma degli elementi dell'array può essere calcolata da MathSum()

1) Penso che questo sia un fatto ovvio. Ed è facile da dimostrare comprendendo che l'area massima di un triangolo con un dato vertice A, linea mediana h e dato lato opposto a è l'area di un triangolo isoscele, quando l'angolo al vertice dato è massimo. E l'area di tale triangolo è h*a/2

Immaginiamo che tutti i nodi tra i lati dati dei poligoni siano flessibili (come in un set di costruzioni per bambini sulle calamite) ed è chiaro che possiamo disporre i lati in modo tale che tutti i vertici abbiano un centro comune equidistante (a condizione che il lato maggiore sia più piccolo della somma degli altri lati, altrimenti non possono essere collegati), cioè inscritti in un cerchio. E questa sarà l'area massima, poiché consiste nella somma delle aree dei triangoli isosceli, con un lato uguale al raggio di questo cerchio.

2) Credo che

3) Non ho trovato tale formula in MQL4 o MQL5

 
Nikolai Semko:

1) Penso che questo sia un fatto ovvio.

Intuitivamente sì, ma non è neanche lontanamente una prova rigida.

2) Credo che

Se ce ne fosse uno, potrebbe essere trovato, c'è solo un sistema di equazioni

Aleksey Nikolayev:

1) La difficoltà sta nel dimostrare il fatto che i vertici della mnc con l'area massima devono trovarsi sullo stesso cerchio (teorema di Cramer). Non so come dimostrarlo o dove leggere le prove.

Non ho trovato nessun teorema del genere, solo riferimenti a questa proprietà.

come sempre, link inutili e nessuna parola sul punto.

 
Andrei Trukhanovich:


come al solito riferimenti inutili e non una parola di sostanza.

è davvero inutile per te

 
Nikolai Semko:

1) Penso che questo sia un fatto ovvio. Ed è facile da dimostrare comprendendo che l'area massima di un triangolo con un dato vertice A, linea mediana h e dato lato opposto a è l'area di un triangolo isoscele quando l'angolo al vertice dato è massimo. E l'area di tale triangolo è h*a/2

Immaginiamo che tutti i nodi tra i lati dati dei poligoni siano flessibili (come in un set di costruzioni per bambini sulle calamite) ed è chiaro che possiamo disporre i lati in modo tale che tutti i vertici abbiano un centro comune equidistante (a condizione che il lato maggiore sia più piccolo della somma degli altri lati, altrimenti non possono essere collegati), cioè inscritti in un cerchio. E questa sarà l'area massima, poiché consiste nella somma delle aree dei triangoli isosceli, con un lato uguale al raggio di questo cerchio.

2) Credo che

3) Non ho trovato questa formula in MQL4 o MQL5.

1) Forse può essere in qualche modo formalizzato come uguaglianza a zero della variazione (derivata) dell'area di un mnc per le coordinate dei vertici quando giacciono su un cerchio. Solo che questa è una condizione di estremità locale e dobbiamo dimostrare 1) che è un massimo e 2) che è globale.

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



 

Si ottiene un polinomio dalle radici degli altri polinomi, e da tutto questo baad over si prendono tre derivate. Formule chilometriche. E chissà, forse c'è una sorpresa che aspetta alla fine. Dovremo trovare un qualche tipo di trucco.

 
Andrei Trukhanovich:

Intuitivamente sì, ma non si tratta nemmeno di una prova rigida.

se ce ne fosse uno, potrebbe essere trovato, c'è solo un sistema di equazioni

Non sono riuscito a trovare un teorema del genere, solo menzioni di questa proprietà.

come al solito riferimenti inutili e non una sola parola sul punto.

Googlato "poligono di area massima dati i lati", ha trovato solo che questo risultato è "ben noto") e soluzioni numeriche come quella data da Nikolay.

A quanto pare, bisogna consultare alcuni libri antichi di geometria - al giorno d'oggi non amano esporre queste cose.

 

La soluzione di cui sopra è valida solo per i poligoni il cui centro della circonferenza si trova all'interno del perimetro. Prova il triangolo {2,2,3.9}

In termini generali (approssimazione di precisione doppia) si risolve come segue:

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:

La soluzione di cui sopra è valida solo per i poligoni il cui centro della circonferenza si trova all'interno del perimetro. Prova il triangolo {2,2,3.9}

...

Cosa c'entra questo con un triangolo se il problema è trovare un poligono con l'area massima date le dimensioni dei lati?

 

Ops. Io stesso ho solo una delle varianti che contano correttamente)))

UPD: Corretto.

 
Dmitry Fedoseev:

Si ottiene un polinomio dalle radici degli altri polinomi, e da tutto questo baad over si prendono tre derivate. Formule chilometriche. E chissà, forse c'è una sorpresa che aspetta alla fine. Dovremo trovare un qualche tipo di trucco.

Ecco la funzione per la somma di tutti gli angoli rispetto al raggio. L'area di soluzione di 2p è evidenziata in verde.

Forse questo aiuterà.
Sono troppo pigro per scervellarmi, soprattutto perché non sono molto bravo con la torre.

File:
Zadacha2.mq5  4 kb