Bibliotecas: ALGLIB - Numerical Analysis Library - página 5

 

Hi!


Sou completamente novo no ALGLIB. Então, eu estava tentando executar a seguinte tarefa, que é calcular k² usando um script. Posso fazer isso facilmente no Excel, mas não tenho ideia de como usar um modelo de equação não linear com uma restrição em caixa.


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 do valor central

/equação do modelo
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 foi calculado como 0,582018800686398, depois de usar o Solver no Excel, onde o erro total foi uma soma minimizada de w(y-y0)^2
//restrição de caixa k^2>0;
  };




Desde já, obrigado pela leitura!

 
Arthur Albano #:

Hi!


Sou completamente novo no ALGLIB. Então, eu estava tentando executar a seguinte tarefa, que é calcular k² usando um script. Posso fazer isso facilmente no Excel, mas não tenho ideia de como usar um modelo de equação não linear com uma restrição em caixa.





Desde já, obrigado pela leitura!


Até agora, parece feio...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5
//|Arthur Albano
//| https://www.mql5.com/pt/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/pt/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Função de início do 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 do valor central

/equação do modelo
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 foi calculado como 0,582018800686398, depois de usar o Solver no Excel
//condição de caixa 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(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);
  };
//+------------------------------------------------------------------+
 

Feito.

Basicamente, copie e cole do 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"
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| Classe derivada de CNDimensional_PFunc|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- construtor, destrutor
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- método
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Construtor sem parâmetros|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

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

  }
//+------------------------------------------------------------------+
//| Essa chamada de retorno calcula f(c,x), em que x é um
//| posição no eixo X e c é um parâmetro ajustável
//+------------------------------------------------------------------+
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 não linear usando apenas o valor da função
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- criar variáveis
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- inicialização
   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);
//--- alocação
   ArrayResize(y,22);
//--- inicialização
   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;
//--- alocação
   ArrayResize(c,1);
//--- inicialização
   c[0] =  0.5;
//--- criar variáveis
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Ajuste com pesos
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- chamada de função
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- chamada de função
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- chamada de função
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Ajuste com pesos
//--- (você pode alterar os pesos e ver como isso altera o resultado)
   ArrayResize(w,22);
//--- inicialização
   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;
//--- Limpar pesos
// ArrayFill(w,0,ArraySize(w),1);
//--- chamada de função
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- chamada de função
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- chamada de função
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- chamada de função
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Por favor, redefina uma versão nova, pois ela não está compilando!
 
Koshtenko #:
Por favor, redefina a versão mais recente, pois ela não está compilando!

Use a versão padrão do Alglib, que vem sendo fornecida com o terminal há muito tempo. A classe de números complexos está adaptada nela:


 
qingyouwei #:
Como posso multiplicar duas matrizes usando a biblioteca alglib?

Como posso multiplicar duas matrizes usando a biblioteca alglib?

Você pode compilar a ALGLIB e passá-la?

Minha compilação apresentou o seguinte erro: 'complex' - token inesperado complex.mqh 37 8

'complex' - token inesperado complex.mqh 37 8

'{' - nome esperado complex.mqh 38 3

'complex' - token inesperado, provavelmente o tipo está faltando? complex.mqh 79 1

'im' - token inesperado, provavelmente o tipo está faltando? complex.mqh 79 31

'im' - tipo de classe esperado complex.mqh 79 31

'}' - ponto e vírgula esperado complex.mqh 82 3

'}' - expressões não são permitidas em um escopo global complex.mqh 82 3

'complex' - token inesperado, provavelmente o tipo está faltando? complex.mqh 86 1

'im' - token inesperado, provavelmente o tipo está faltando? complex.mqh 86 41

'im' - variável já definida complex.mqh 86 41

veja a declaração anterior da variável 'im' complex.mqh 79 31

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

 

Quando adicionaremos as funções de análise espectral
SSA ?
O ALGLIB as tem, mas o MT ainda não.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

Quando adicionaremos as funções de análise espectral
SSA ?
O ALGLIB as tem, mas o MT ainda não.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Talvez, até que a biblioteca padrão não seja adicionada (e pode não ser em breve), os códigos-fonte existentes(1, 2) sejam suficientes?

 
Infelizmente, não há código para predicados.
há apenas o modelo em si, mas isso não é suficiente.
 
Ivan Shishikin #:

Quando adicionaremos as funções de análise espectral
SSA ?
O ALGLIB as tem, mas o MT ainda não.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Na minha opinião, não há nenhuma garantia de que elas aparecerão... Talvez, em vez de esperar, seja melhor usá-las diretamente no código C?