Kitaplıklar: ALGLIB - Sayısal Analiz Kütüphanesi - sayfa 5

 

Merhaba!


ALGLIB'de tamamen yeniyim. Bu yüzden, bir komut dosyası kullanarak k²'yi hesaplamak olan aşağıdaki görevi gerçekleştirmeye çalışıyordum. Bunu Excel'de kolayca yapabiliyorum, ancak bir kutulu kısıtlama ile doğrusal olmayan bir denklem modelinin nasıl kullanılacağı hakkında hiçbir fikrim yok.


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}; //ağırlıklar
   const double x0 = 37.74; //merkezi değer teoremi

//model denklemi
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2, toplam hatanın w(y-y0)^2'nin minimize edilmiş bir toplamı olduğu Excel'de Çözücü kullanıldıktan sonra 0.582018800686398 olarak hesaplandı
//kutu kısıtlaması k^2>0;
  };




Okuduğunuz için şimdiden teşekkürler!

 
Arthur Albano #:

Merhaba!


ALGLIB'de tamamen yeniyim. Bu yüzden, bir komut dosyası kullanarak k²'yi hesaplamak olan aşağıdaki görevi gerçekleştirmeye çalışıyordum. Bunu Excel'de kolayca yapabilirim, ancak bir kutulu kısıtlama ile doğrusal olmayan bir denklem modelinin nasıl kullanılacağı hakkında hiçbir fikrim yok.





Okuduğunuz için şimdiden teşekkürler!


Şimdiye kadar, çirkin görünüyor.


//+------------------------------------------------------------------+
//|AlgLibExample.mq5 |
//|Arthur Albano |
//| https://www.mql5.com/tr/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/tr/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Betik program başlatma işlevi|
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   const double x0 = 37.74; //merkezi değer teoremi

//model denklemi
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2 Excel'de Çözücü kullanıldıktan sonra 0.582018800686398 olarak hesaplanmıştır
//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}; //ağırlıklar
   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);
  };
//+------------------------------------------------------------------+
 

Tamamdır.

Temel olarak AlgLib TestInterface.mqh dosyasından kopyala ve yapıştır.

//+------------------------------------------------------------------+
//|AlgLibTest.mq5 |
//|Telif Hakkı 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Betik program başlatma işlevi|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| CNDimensional_PFunc'dan türetilmiş sınıf|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- kurucu, yıkıcı
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- yöntem
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| Parametreler olmadan kurucu|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| Yıkıcı|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::~CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| Bu geri arama f(c,x)'i hesaplar, burada x bir |
//| X eksenindeki konum ve c ayarlanabilir parametredir |
//+------------------------------------------------------------------+
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];
  }

//+------------------------------------------------------------------+
//| Yalnızca fonksiyon değerini kullanarak doğrusal olmayan uydurma |
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- değişkenler oluşturun
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- başlatma
   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);
//--- tahsis
   ArrayResize(y,22);
//--- başlatma
   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;
//--- tahsis
   ArrayResize(c,1);
//--- başlatma
   c[0] =  0.5;
//--- değişkenler oluşturun
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- Ağırlıklar ile fitting
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- fonksiyon çağrısı
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- fonksiyon çağrısı
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- fonksiyon çağrısı
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- Ağırlıklarla uydurma
//--- (ağırlıkları değiştirebilir ve sonucu nasıl değiştirdiğini görebilirsiniz)
   ArrayResize(w,22);
//--- başlatma
   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;
//--- Ağırlıkları temizleyin
// ArrayFill(w,0,ArraySize(w),1);
//--- fonksiyon çağrısı
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- fonksiyon çağrısı
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- fonksiyon çağrısı
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- fonksiyon çağrısı
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
Lütfen yeni bir sürümü sıfırlayın, derlenmiyor!(
 
Koshtenko #:
Lütfen en son sürümü sıfırlayın, derlenmiyor!(

Uzun süredir terminalle birlikte verilen Alglib'in standart sürümünü kullanın. Karmaşık sayılar sınıfı içinde uyarlanmıştır:


 
qingyouwei #:
Alglib kütüphanesini kullanarak iki matrisi nasıl çarpabilirim?

Alglib kütüphanesini kullanarak iki matrisi nasıl çarpabilirim?

ALGLIB'i derleyip geçebilir misiniz?

Derlediğim hata şu: 'complex' - unexpected token complex.mqh 37 8

'complex' - beklenmedik belirteç complex.mqh 37 8

'{' - ad bekleniyor complex.mqh 38 3

'complex' - beklenmedik belirteç, muhtemelen tür eksik? complex.mqh 79 1

'im' - beklenmedik belirteç, muhtemelen tür eksik? complex.mqh 79 31

'im' - sınıf türü bekleniyor complex.mqh 79 31

'}' - noktalı virgül bekleniyor complex.mqh 82 3

'}' - ifadelere küresel kapsamda izin verilmez complex.mqh 82 3

'complex' - beklenmedik belirteç, muhtemelen tür eksik? complex.mqh 86 1

'im' - beklenmedik belirteç, muhtemelen tür eksik? complex.mqh 86 41

'im' - değişken zaten tanımlanmış complex.mqh 86 41

'im' değişkeninin önceki bildirimine bakınız complex.mqh 79 31

'im' - sınıf türü bekleniyor complex.mqh 86

 

Spektral analiz fonksiyonlarını ne zaman ekleyeceğiz
SSA ?
ALGLIB'de var, ancak MT'de hala yok.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:

Spektral analiz fonksiyonlarını ne zaman ekleyeceğiz
SSA ?
ALGLIB'de var, ancak MT'de hala yok.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Belki de standart kütüphane eklenmeyene kadar (ve yakında olmayabilir), mevcut kaynaklar(1, 2) iyi olacak mı?

 
maalesef yüklemler için kod yok.
sadece modelin kendisi var. ama bu yeterli değil.
 
Ivan Shishikin #:

Spektral analiz fonksiyonlarını ne zaman ekleyeceğiz
SSA ?
ALGLIB'de var, ancak MT'de hala yok.
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

Bence, hiç görünmeyeceğinin garantisi yok ... Belki de beklemek yerine, bunları doğrudan C kodunda kullanmak daha iyidir?