Librerie: ALGLIB - Libreria di Analisi Numerica - pagina 5

 

Ciao!


Sono completamente nuovo ad ALGLIB. Quindi, stavo cercando di eseguire il seguente compito, che è quello di calcolare k² utilizzando uno script. Posso farlo facilmente in Excel, ma non ho idea di come utilizzare un modello di equazione non lineare con un vincolo boxato.


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}; //pesi
   const double x0 = 37.74; //teorema del valore centrale

//modello di equazione
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 è stato calcolato come 0.582018800686398, dopo aver usato il risolutore in Excel dove l'errore totale era una somma minimizzata di w(y-y0)^2
// vincolo della scatola k^2>0;
  };




Grazie in anticipo per la lettura!

 
Arthur Albano #:

Ciao!


Sono completamente nuovo ad ALGLIB. Quindi, stavo cercando di eseguire il seguente compito, che è quello di calcolare k² utilizzando uno script. Posso farlo facilmente in Excel, ma non ho idea di come utilizzare un modello di equazione non lineare con un vincolo boxato.





Grazie in anticipo per la lettura!


Per ora, sembra brutto...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5 |
//|Arthur Albano
//| https://www.mql5.com/it/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/it/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   const double x0 = 37.74; //teorema del valore centrale

//modello di equazione
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 è stato calcolato come 0,582018800686398, dopo aver usato il Risolutore in Excel
//contrapposizione della casella 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}; //pesi
   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(stato,Pfunc,,,rep,stato);
   
   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);
  };
//+------------------------------------------------------------------+
 

Fatto.

In pratica copia e incolla da 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"
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| Classe derivata da CNDimensional_PFunc|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- costruttore, distruttore
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- metodo
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Costruttore senza parametri|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

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

  }
//+------------------------------------------------------------------+
//| Questo callback calcola f(c,x), dove x è un parametro |
//| posizione sull'asse X e c è un parametro regolabile |
//+------------------------------------------------------------------+
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];
  }

//+------------------------------------------------------------------+
//| Adattamento non lineare che utilizza solo il valore della funzione |
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- creare variabili
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- inizializzazione
   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);
//--- assegnazione
   ArrayResize(y,22);
//--- inizializzazione
   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;
//--- assegnazione
   ArrayResize(c,1);
//--- inizializzazione
   c[0] =  0.5;
//--- creare variabili
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Adattamento con i pesi
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- chiamata di funzione
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- chiamata di funzione
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- chiamata di funzione
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Fitting con pesi
//--- (è possibile cambiare i pesi e vedere come cambia il risultato)
   ArrayResize(w,22);
//--- inizializzazione
   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;
//--- Cancella i pesi
// ArrayFill(w,0,ArraySize(w),1);
//--- chiamata di funzione
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- chiamata di funzione
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- chiamata di funzione
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- chiamata di funzione
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Per favore ripristina una nuova versione, non compila!(
 
Koshtenko #:
Si prega di ripristinare l'ultima versione, non si compila!(

Utilizzate la versione standard di Alglib, che viene fornita con il terminale da molto tempo. La classe dei numeri complessi è adattata in essa:


 
qingyouwei #:
Come posso moltiplicare due matrici utilizzando la lib alglib?

Come posso moltiplicare due matrici usando la lib alglib?

È possibile compilare ALGLIB e passarlo?

Ho compilato il seguente errore: 'complex' - token inatteso complex.mqh 37 8

'complex' - token inatteso complex.mqh 37 8

'{' - nome atteso complex.mqh 38 3

'complex' - token inatteso, probabilmente manca il tipo? complex.mqh 79 1

'im' - token inatteso, probabilmente manca il tipo? complex.mqh 79 31

'im' - tipo di classe previsto complex.mqh 79 31

'}' - punto e virgola atteso complex.mqh 82 3

'}' - le espressioni non sono consentite in un ambito globale complex.mqh 82 3

'complex' - token inatteso, probabilmente manca il tipo? complex.mqh 86 1

'im' - token inatteso, probabilmente manca il tipo? complex.mqh 86 41

'im' - variabile già definita complex.mqh 86 41

vedi dichiarazione precedente della variabile 'im' complex.mqh 79 31

'im' - tipo di classe previsto complex.mqh 86

 

Quando verranno aggiunte le funzioni di analisi spettrale
SSA?
ALGLIB le ha, ma MT ancora no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

Quando verranno aggiunte le funzioni di analisi spettrale
SSA?
ALGLIB le ha, ma MT ancora no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Forse finché la libreria standard non sarà aggiunta (e potrebbe non esserlo presto), i sorgenti esistenti(1, 2) andranno bene?

 
Purtroppo non c'è codice per i predicati.
c'è solo il modello stesso. ma non è sufficiente.
 
Ivan Shishikin #:

Quando verranno aggiunte le funzioni di analisi spettrale
SSA?
ALGLIB le ha, ma MT ancora no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Imho, non c'è alcuna garanzia che appariranno... Forse, invece di aspettare, è meglio usarle direttamente nel codice C?