Bibliotecas: ALGLIB - Biblioteca de análisis numérico - página 5

 

¡Hola!


Soy completamente nuevo en ALGLIB. Estaba intentando realizar la siguiente tarea, que consiste en calcular k² utilizando un script. Puedo hacerlo fácilmente en Excel, pero no tengo ni idea de cómo utilizar un modelo de ecuación no lineal con una restricción de caja.


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}; //pesos
   const double x0 = 37.74; //teorema del valor central

//ecuación modelo
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 se calculó como 0.582018800686398, después de usar Solver en Excel donde el error total era una suma minimizada de w(y-y0)^2
//restricción de caja k^2>0;
  };




Gracias de antemano por leerme.

 
Arthur Albano #:

¡Hola!


Soy completamente nuevo en ALGLIB. Estaba intentando realizar la siguiente tarea, que consiste en calcular k² utilizando un script. Puedo hacerlo fácilmente en Excel, pero no tengo ni idea de cómo utilizar un modelo de ecuación no lineal con una restricción de caja.





Gracias de antemano por su lectura.


Hasta ahora, se ve feo...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5
//|Arthur Albano
//| https://www.mql5.com/es/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/es/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+

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

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

//ecuación modelo
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 se calculó como 0.582018800686398, después de usar Solver en Excel
//condición de caja 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}; //pesos
   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(estado,Pfunc,,,rep,estado);
   
   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);
  };
//+------------------------------------------------------------------+
 

Hecho.

Básicamente copiar y pegar desde 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"
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| Clase derivada de CNDimensional_PFunc|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- constructor, destructor
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- método
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Constructor sin parámetros|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

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

  }
//+------------------------------------------------------------------+
//| Esta llamada de retorno calcula f(c,x), donde x es un |
//| posición en el eje X y c es un parámetro 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];
  }

//+------------------------------------------------------------------+
//| Ajuste no lineal usando sólo el valor de la función ||
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- crear variables
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- inicialización
   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);
//--- asignación
   ArrayResize(y,22);
//--- inicialización
   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;
//--- asignación
   ArrayResize(c,1);
//--- inicialización
   c[0] =  0.5;
//--- crear variables
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Ajuste con pesas
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- llamada a función
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- llamada a función
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- llamada a función
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Ajuste con pesos
//--- (puedes cambiar los pesos y ver como cambia el resultado)
   ArrayResize(w,22);
//--- inicialización
   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;
//--- Borrar pesos
// ArrayFill(w,0,ArraySize(w),1);
//--- llamada a función
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- llamada a función
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- llamada a función
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- llamada a función
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Por favor, reinicia una nueva versión, ¡no compila!(
 
Koshtenko #:
Por favor, reinicie la última versión, ¡no compila!(

Utilice la versión estándar de Alglib, que se suministra con el terminal desde hace mucho tiempo. La clase de números complejos está adaptada en ella:


 
qingyouwei #:
¿Cómo puedo multiplicar dos matrices utilizando la librería alglib?

¿Cómo puedo multiplicar dos matrices utilizando la librería alglib?

¿Puede compilar ALGLIB y pasarlo?

Mi compilado el siguiente error: 'complex' - unexpected token complex.mqh 37 8

'complex' - token inesperado complex.mqh 37 8

'{' - nombre esperado complex.mqh 38 3

complex' - token inesperado, probablemente falta el tipo complex.mqh 79 1

im' - token inesperado, probablemente falta el tipo complex.mqh 79 31

im' - tipo de clase esperada complex.mqh 79 31

}' - punto y coma esperado complex.mqh 82 3

}' - las expresiones no están permitidas en un ámbito global complex.mqh 82 3

complex' - token inesperado, probablemente falta el tipo complex.mqh 86 1

im' - token inesperado, probablemente falta el tipo complex.mqh 86 41

im' - variable ya definida complex.mqh 86 41

ver declaración previa de variable 'im' complex.mqh 79 31

'im' - tipo de clase esperado complex.mqh 86

 

¿Cuándo vamos a añadir funciones de análisis espectral
SSA ?
ALGLIB las tiene, pero MT aún no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

¿Cuándo vamos a añadir funciones de análisis espectral
SSA ?
ALGLIB las tiene, pero MT aún no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

¿Quizás hasta que no se añada la librería estándar (y puede que no sea pronto), las fuentes existentes(1, 2) estarán bien?

 
Por desgracia, no hay código para los predicados.
sólo existe el modelo en sí. pero eso no es suficiente.
 
Ivan Shishikin #:

¿Cuándo vamos a añadir funciones de análisis espectral
SSA ?
ALGLIB las tiene, pero MT aún no.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Imho, no hay ninguna garantía de que aparecerá en absoluto ... ¿Quizás, en vez de esperar, es mejor usarlas directamente en código C?