Bibliothèque: ALGLIB - Bibliothèque d'Analyse Numérique - page 5

 

Bonjour !


Je suis complètement novice en matière d'ALGLIB. J'ai donc essayé d'effectuer la tâche suivante, qui consiste à calculer k² à l'aide d'un script. Je peux facilement le faire dans Excel, mais je n'ai aucune idée de la façon d'utiliser un modèle d'équation non linéaire avec une contrainte encadrée.


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}; //Poids
   const double x0 = 37.74; //Théorème de la valeur centrale

//modèle d'équation
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 a été calculé comme étant 0,582018800686398, après avoir utilisé le Solveur dans Excel où l'erreur totale était une somme minimisée de w(y-y0)^2.
//Contrainte de boîte k^2>0 ;
  };




Merci d'avance pour votre lecture !

 
Arthur Albano #:

Bonjour !


Je suis complètement novice en matière d'ALGLIB. J'ai donc essayé d'effectuer la tâche suivante, qui consiste à calculer k² à l'aide d'un script. Je peux facilement le faire dans Excel, mais je n'ai aucune idée de la façon d'utiliser un modèle d'équation non linéaire avec une contrainte encadrée.





Merci d'avance pour votre lecture !


Pour l'instant, c'est moche...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5 |
//|Arthur Albano
//| https://www.mql5.com/fr/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/fr/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   const double x0 = 37.74; //Théorème de la valeur centrale

//modèle d'équation
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 a été calculé comme étant 0,582018800686398, après avoir utilisé le Solveur dans Excel.
//contrainte de boîte 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}; //Poids
   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(state,Pfunc,,,rep,state) ;
   
   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);
  };
//+------------------------------------------------------------------+
 

C'est fait.

Il s'agit essentiellement d'un copier-coller du fichier AlgLib TestInterface.mqh.

//+------------------------------------------------------------------+
//|AlgLibTest.mq5 |
//|Copyright 2022, MetaQuotes Ltd. |
//| https ://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| Classe dérivée de CNDimensional_PFunc|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- constructeur, destructeur
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- méthode
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Constructeur sans paramètres|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

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

  }
//+------------------------------------------------------------------+
//| Ce callback calcule f(c,x), où x est une variable d'environnement.
//| position sur l'axe X et c est un paramètre ajustable |
//+------------------------------------------------------------------+
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];
  }

//+------------------------------------------------------------------+
//| Ajustement non linéaire utilisant uniquement la valeur de la fonction |
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- créer des variables
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- initialisation
   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);
//--- allocation
   ArrayResize(y,22);
//--- initialisation
   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;
//--- allocation
   ArrayResize(c,1);
//--- initialisation
   c[0] =  0.5;
//--- créer des variables
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Ajustement avec des poids
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- appel de fonction
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- appel de fonction
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- appel de fonction
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Ajustement avec les poids
//--- (vous pouvez modifier les poids et voir comment cela change le résultat)
   ArrayResize(w,22);
//--- initialisation
   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;
//--- Effacer les poids
// ArrayFill(w,0,ArraySize(w),1) ;
//--- appel de fonction
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- appel de fonction
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- appel de fonction
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- appel de fonction
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Veuillez réinitialiser une nouvelle version, elle ne compile pas !(
 
Koshtenko #:
Veuillez réinitialiser la dernière version, elle ne compile pas !(

Utilisez la version standard d'Alglib, qui est fournie avec le terminal depuis longtemps. La classe des nombres complexes y est adaptée :


 
qingyouwei #:
Comment multiplier deux matrices en utilisant la librairie alglib ?

Comment multiplier deux matrices en utilisant la librairie alglib ?

Peut-on compiler ALGLIB et le passer ?

J'ai compilé l'erreur suivante : 'complex' - unexpected token complex.mqh 37 8

'complex' - unexpected token complex.mqh 37 8

'{' - nom attendu complex.mqh 38 3

complex" - jeton inattendu, probablement le type est manquant ? complex.mqh 79 1

'im' - jeton inattendu, le type est probablement manquant ? complex.mqh 79 31

'im' - type de classe attendu complex.mqh 79 31

'}' - point-virgule attendu complex.mqh 82 3

'}' - les expressions ne sont pas autorisées à l'échelle globale complex.mqh 82 3

'complex' - jeton inattendu, probablement le type est manquant ? complex.mqh 86 1

'im' - jeton inattendu, le type est probablement manquant ? complex.mqh 86 41

'im' - variable déjà définie complex.mqh 86 41

voir la déclaration précédente de la variable 'im' complex.mqh 79 31

'im' - type de classe attendu complex.mqh 86

 

Quand allons-nous ajouter les fonctions d'analyse spectrale
SSA ?
ALGLIB les a, mais MT ne les a toujours pas.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

Quand allons-nous ajouter les fonctions d'analyse spectrale
SSA ?
ALGLIB les a, mais MT ne les a toujours pas.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Peut-être que tant que la bibliothèque standard ne sera pas ajoutée (et ce n'est peut-être pas pour tout de suite), les sources existantes(1, 2) conviendront ?

 
Malheureusement, il n'y a pas de code pour les prédicats.
il n'y a que le modèle lui-même. mais ce n'est pas suffisant.
 
Ivan Shishikin #:

Quand allons-nous ajouter les fonctions d'analyse spectrale
SSA ?
ALGLIB les a, mais MT ne les a toujours pas.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Je pense qu'il n'y a aucune garantie que cela apparaisse ... Peut-être qu'au lieu d'attendre, il vaut mieux les utiliser directement dans le code C ?