Bibliotheken: ALGLIB - Numerical Analysis Library - Seite 5

 

Hallo!


Ich bin völlig neu in der ALGLIB. Ich habe versucht, die folgende Aufgabe zu lösen, nämlich die Berechnung von k² mit Hilfe eines Skripts. Ich kann das problemlos in Excel machen, habe aber keine Ahnung, wie ich ein nichtlineares Gleichungsmodell mit einer Boxed Constraint verwenden kann.


void OnStart()
  {
   const double x[22] = {28.98, 30.48, 30.98, 31.48, 31.98, 32.48, 32.98, 33.48, 33.98, 34.48, 34.98, 35.48, 35.98, 36.48, 36.98, 37.48, 37.98, 38.48, 38.98, 39.98, 40.98, 41.98};
   const double y[22] = {8.26, 7.26, 5.71, 6.15, 5.90, 5.15, 5.03, 4.30, 4.15, 3.30, 2.90, 2.71, 1.96, 1.57, 1.27, 0.90, 0.70, 0.47, 0.33, 0.20, 0.09, 0.06};
   const double w[22] = {2, 8, 2, 2, 2, 1, 11, 12, 24, 12, 6, 12, 21, 7, 74, 51, 159, 385, 171, 109, 18, 18}; //Gewichte
   const double x0 = 37.74; //Zentralwerttheorem

//Modellgleichung
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 wurde als 0,582018800686398 berechnet, nachdem Solver in Excel verwendet wurde, wobei der Gesamtfehler eine minimierte Summe von w(y-y0)^2 war.
//Box-Zwangsbedingung k^2>0;
  };




Vielen Dank im Voraus fürs Lesen!

 
Arthur Albano #:

Hallo!


Ich bin völlig neu in der ALGLIB. Ich habe versucht, die folgende Aufgabe zu lösen, nämlich die Berechnung von k² mit Hilfe eines Skripts. Ich kann das leicht in Excel machen, habe aber keine Ahnung, wie man ein nicht-lineares Gleichungsmodell mit einer Boxed Constraint verwendet.





Vielen Dank im Voraus fürs Lesen!


So weit, sieht hässlich...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5 |
//|Arthur Albano |
//| https://www.mql5.com/de/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/de/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>
#include <Math\Alglib\interpolation.mqh>
#include <Arrays\ArrayDouble.mqh>

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   const double x0 = 37.74; //Zentralwerttheorem

//Modellgleichung
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 wurde mit Hilfe von Solver in Excel als 0.582018800686398 berechnet.
//box contraint k^2>0;

// https://www.alglib.net/translator/man/manual.cpp.html#example_lsfit_d_nlfb

   const double x[22] = {28.98, 30.48, 30.98, 31.48, 31.98, 32.48, 32.98, 33.48, 33.98, 34.48, 34.98, 35.48, 35.98, 36.48, 36.98, 37.48, 37.98, 38.48, 38.98, 39.98, 40.98, 41.98};
   double w[22] = {2, 8, 2, 2, 2, 1, 11, 12, 24, 12, 6, 12, 21, 7, 74, 51, 159, 385, 171, 109, 18, 18}; //Gewichte
   double y[22] = {8.26, 7.26, 5.71, 6.15, 5.90, 5.15, 5.03, 4.30, 4.15, 3.30, 2.90, 2.71, 1.96, 1.57, 1.27, 0.90, 0.70, 0.47, 0.33, 0.20, 0.09, 0.06};
   
   const int n = ArraySize(x);

   double c[1] = {x0 / 100.};
   CLSFitState state;

   CMatrixDouble xx(n, 1);
   for(int i = 0; i < n; i++)
     {
      xx[i].Set(0,x[i]);
     };

   CLSFit::LSFitCreateWFGH(xx, y, w, c, n,1,1,state);

   const double epsf = 0.000001;
   const double epsx = 0.000001;
   const int maxits = 0;
   CLSFit::LSFitSetCond(state,epsf,epsx,maxits);
   
   double bndl[1] = {0.};
   double bndu[1] = {x0 / 100.};
   CLSFit::LSFitSetBC(state,bndl,bndu);
   
   CNDimensional_PFunc *Pfunc = new CNDimensional_PFunc;

   //CAlglib::LSFitFit(Zustand,Pfunc,,,rep,Zustand);
   
   int info;
   CLSFitReport rep;
   CLSFit::LSFitResults(state,info,c,rep);
  };
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double func(const double _x, const double _k, const double _x0)
  {
   return((1. / 2.) * (pow(pow(_x, 2.) - 2 * _x0 * _x + pow(_x0, 2.) + 4 * pow(_k, 2.), 1. / 2.) + _x + _x0) - _x);
  };
//+------------------------------------------------------------------+
 

Erledigt.

Im Grunde genommen Kopieren und Einfügen aus AlgLib TestInterface.mqh.

//+------------------------------------------------------------------+
//|AlgLibTest.mq5 |
//|Urheberrecht 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(TEST_LSFit_D_NLF());
  };

//+------------------------------------------------------------------+
//| Abgeleitete Klasse von CNDimensional_PFunc|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- Konstruktor, Destruktor
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- Methode
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Konstruktor ohne Parameter|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| Destruktor|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::~CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| Dieser Callback berechnet f(c,x), wobei x ein | ist.
//| Position auf der X-Achse und c ist ein einstellbarer Parameter |
//+------------------------------------------------------------------+
void CNDimensional_CX_1_Func::PFunc(double &c[], double &x[], double &func, CObject &obj)
  {
   double x0 = 37.74;
   func = (1.0/2.0)*(sqrt(x[0]*x[0] - 2.0*x[0]*x0 + x0*x0 + 4*c[0]) + x[0] + x0) - x[0];
  }

//+------------------------------------------------------------------+
//| Nichtlineare Anpassung nur mit Funktionswert |
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- Variablen erstellen
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- Initialisierung
   x[0].Set(0,28.98);
   x[1].Set(0,30.48);
   x[2].Set(0,30.98);
   x[3].Set(0,31.48);
   x[4].Set(0,31.98);
   x[5].Set(0,32.48);
   x[6].Set(0,32.98);
   x[7].Set(0,33.48);
   x[8].Set(0,33.98);
   x[9].Set(0,34.48);
   x[10].Set(0,34.98);
   x[11].Set(0,35.48);
   x[12].Set(0,35.98);
   x[13].Set(0,36.48);
   x[14].Set(0,36.98);
   x[15].Set(0,37.48);
   x[16].Set(0,37.98);
   x[17].Set(0,38.48);
   x[18].Set(0,38.98);
   x[19].Set(0,39.98);
   x[20].Set(0,40.98);
   x[21].Set(0,41.98);
//--- Zuweisung
   ArrayResize(y,22);
//--- Initialisierung
   y[0]=8.26;
   y[1]=7.26;
   y[2]=5.71;
   y[3]=6.15;
   y[4]=5.90;
   y[5]=5.15;
   y[6]=5.03;
   y[7]=4.30;
   y[8]=4.15;
   y[9]=3.30;
   y[10]=2.90;
   y[11]=2.71;
   y[12]=1.96;
   y[13]=1.57;
   y[14]=1.27;
   y[15]=0.90;
   y[16]=0.70;
   y[17]=0.47;
   y[18]=0.33;
   y[19]=0.20;
   y[20]=0.09;
   y[21]=0.06;
//--- Zuweisung
   ArrayResize(c,1);
//--- Initialisierung
   c[0] =  0.5;
//--- Variablen erstellen
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Anpassen mit Gewichten
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- Funktionsaufruf
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- Funktionsaufruf
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- Funktionsaufruf
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Anpassen mit Gewichten
//--- (Sie können die Gewichte ändern und sehen, wie sich das Ergebnis ändert)
   ArrayResize(w,22);
//--- Initialisierung
   w[0]=2;
   w[1]=8;
   w[2]=2;
   w[3]=2;
   w[4]=2;
   w[5]=1;
   w[6]=11;
   w[7]=12;
   w[8]=24;
   w[9]=12;
   w[10]=6;
   w[11]=12;
   w[12]=21;
   w[13]=7;
   w[14]=74;
   w[15]=51;
   w[16]=159;
   w[17]=385;
   w[18]=171;
   w[19]=109;
   w[20]=18;
   w[21]=18;
//--- Gewichte löschen
// ArrayFill(w,0,ArraySize(w),1);
//--- Funktionsaufruf
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- Funktionsaufruf
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- Funktionsaufruf
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- Funktionsaufruf
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Bitte setzen Sie eine neue Version zurück, sie lässt sich nicht kompilieren!(
 
Koshtenko #:
Bitte setzen Sie die neueste Version zurück, sie lässt sich nicht kompilieren!(

Verwenden Sie die Standardversion von Alglib, die seit langem mit dem Terminal ausgeliefert wird. Die Klasse der komplexen Zahlen ist darin angepasst:


 
qingyouwei #:
Wie kann ich zwei Matrizen mit der Lib Alglib multiplizieren?

Wie kann ich zwei Matrizen mit der Bibliothek alglib multiplizieren?

Können Sie kompilieren ALGLIB und übergeben Sie es?

Mein kompiliert den folgenden Fehler: 'complex' - unerwartetes Token complex.mqh 37 8

'complex' - unerwartetes Token complex.mqh 37 8

'{' - Name erwartet complex.mqh 38 3

'complex' - unerwartetes Token, wahrscheinlich fehlt der Typ? complex.mqh 79 1

'im' - unerwartetes Token, wahrscheinlich fehlt der Typ? complex.mqh 79 31

'im' - Klassentyp erwartet complex.mqh 79 31

'}' - Semikolon erwartet complex.mqh 82 3

'}' - Ausdrücke sind im globalen Bereich nicht zulässig complex.mqh 82 3

'complex' - unerwartetes Token, wahrscheinlich fehlt der Typ? complex.mqh 86 1

'im' - unerwartetes Token, wahrscheinlich fehlt der Typ? complex.mqh 86 41

'im' - Variable bereits definiert complex.mqh 86 41

siehe vorherige Deklaration der Variablen 'im' complex.mqh 79 31

'im' - Klassentyp erwartet complex.mqh 86

 

Wann werden wir die Spektralanalysefunktionen
SSA hinzufügen?
ALGLIB hat sie, aber MT noch nicht.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

Wann werden wir die Spektralanalysefunktionen
SSA hinzufügen?
ALGLIB hat sie, aber MT noch nicht.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Solange die Standardbibliothek nicht hinzugefügt wird (und das wird vielleicht nicht so bald der Fall sein), sind die vorhandenen Quellen(1, 2) vielleicht in Ordnung?

 
leider gibt es keinen code für prädikate.
es gibt nur das modell selbst. aber das ist nicht genug.
 
Ivan Shishikin #:

Wann werden wir die Spektralanalysefunktionen
SSA hinzufügen?
ALGLIB hat sie, aber MT noch nicht.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Imho gibt es keine Garantie, dass sie überhaupt erscheinen werden ... Vielleicht ist es besser, sie direkt in C-Code zu verwenden, anstatt zu warten?