ライブラリ: ALGLIB - 数値分析ライブラリ - ページ 5

 

こんにちは!


私はALGLIBの全くの初心者です。スクリプトを使用してk²を計算することです。エクセルでは簡単にできるのですが,1つのボックス制約を持つ非線形方程式モデルをどのように使えばよいのかわかりません.


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}; //ウェイト
   const double x0 = 37.74; //中心値の定理

//モデル方程式
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2は0.582018800686398と計算された。エクセルのソルバーを使用した結果、誤差はw(y-y0)^2の最小化和となった。
//ボックスの制約 k^2>0;
  };




お読みいただきありがとうございました!

 
Arthur Albano #:

こんにちは!


私はALGLIBの全くの初心者です。スクリプトを使用してk²を計算することです。Excelでは簡単にできるのですが,1つのボックス制約を持つ非線形方程式モデルを使用する方法がわかりません.





読んでくれてありがとう!


今のところ、不細工に見える...。


//+------------------------------------------------------------------+
//|AlgLibExample.mq5
//|アーサー・アルバノ
//|https://www.mql5.com/ja/users/arthuralbano
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/ja/users/arthuralbano"
#property version   "1.00"
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   const double x0 = 37.74; //中心値の定理

//モデル方程式
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
エクセルのソルバーを使って、//k^2は0.582018800686398と計算された。
//ボックスの制約 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}; //ウェイト
   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;

   //Alglib::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);
  };
//+------------------------------------------------------------------+
 

できました。

基本的にはAlgLib TestInterface.mqhからコピー&ペースト。

//+------------------------------------------------------------------+
//|AlgLibTest.mq5
//|著作権 2022, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+

#include <Math\Alglib\alglib.mqh>

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

//+------------------------------------------------------------------+
//| CNDimensional_PFuncからの派生クラス|
//+------------------------------------------------------------------+
class CNDimensional_CX_1_Func : public CNDimensional_PFunc
  {
public:
   //--- コンストラクタ、デストラクタ
                     CNDimensional_CX_1_Func(void);
                    ~CNDimensional_CX_1_Func(void);
   //--- メソッド
   virtual void      PFunc(double &c[], double &x[], double &func, CObject &obj);
  };
//+------------------------------------------------------------------+
//| パラメータなしのコンストラクタ|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
CNDimensional_CX_1_Func::~CNDimensional_CX_1_Func(void)
  {

  }
//+------------------------------------------------------------------+
//| このコールバックはf(c,x)を計算する。
//| X軸上の位置とcは調整可能なパラメータである。
//+------------------------------------------------------------------+
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];
  }

//+------------------------------------------------------------------+
//| 関数値のみを用いた非線形フィッティング
//+------------------------------------------------------------------+
double TEST_LSFit_D_NLF()
  {
//--- 変数の作成
   CMatrixDouble           x;
   double                  y[];
   double                  c[];
   double                  w[];
   CObject                 obj;
   CNDimensional_CX_1_Func fcx1func;
   CNDimensional_Rep       frep;
   x.Resize(22,1);
//--- 初期化
   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);
//--- アロケーション
   ArrayResize(y,22);
//--- 初期化
   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;
//--- アロケーション
   ArrayResize(c,1);
//--- 初期化
   c[0] =  0.5;
//--- 変数の作成
   int maxits=0;
   int info;
   CLSFitStateShell state;
   double diffstep=0.0001;
//--- ウェイト・フィッティング
   CAlglib::LSFitCreateF(x,y,c,diffstep,state);
//--- 関数呼び出し
   double epsf = 0.0000001;
   double epsx = 0.0000001;
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- 関数呼び出し
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- 関数呼び出し
   CLSFitReportShell rep;
   CAlglib::LSFitResults(state,info,c,rep);
//--- ウェイトを使ったフィッティング
//--- (重みを変えて、結果がどう変わるかを見ることができる)
   ArrayResize(w,22);
//--- 初期化
   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;
//--- ウェイトをクリアする
// ArrayFill(w,0,ArraySize(w),1);
//--- 関数呼び出し
   CAlglib::LSFitCreateWF(x,y,w,c,diffstep,state);
//--- 関数呼び出し
   CAlglib::LSFitSetCond(state,epsf,epsx,maxits);
//--- 関数呼び出し
   CAlglib::LSFitFit(state,fcx1func,frep,0,obj);
//--- 関数呼び出し
   CAlglib::LSFitResults(state,info,c,rep);
   return(c[0]);
  }
//+------------------------------------------------------------------+
 
コンパイルできないので、新しいバージョンに戻してください!(
 
Koshtenko #:
最新バージョンに戻してください、コンパイルできません!(

標準バージョンのAlglibを使ってください。複素数のクラスが適応されています:


 
qingyouwei #:
alglibライブラリを使用して2つの行列を乗算するには?

alglibライブラリを使用して2つの行列を乗算するには?

ALGLIBをコンパイルして渡すことはできますか?

私のコンパイルは、次のエラー: 'complex' - 予期しないトークンcomplex.mqh 37 8

'complex' - 予期しないトークン complex.mqh 37 8

'{' - 予想される名前 complex.mqh 38 3

'complex' - 予期しないトークン、おそらく型が見つからない? complex.mqh 79 1

'im' - 予期しないトークン、おそらく型が不明か complex.mqh 79 31

'im' - class type expected complex.mqh 79 31

'}' - セミコロンが予想されます complex.mqh 82 3

'}' - グローバル・スコープでは式は使用できません complex.mqh 82 3

'complex' - 予期しないトークン、おそらく型が見つからない? complex.mqh 86 1

'im' - 予期しないトークン、おそらく型が見つかりませんか? complex.mqh 86 41

'im' - 変数がすでに定義されている complex.mqh 86 41

以前の変数'im'の宣言を参照 complex.mqh 79 31

'im' - 期待されるクラス型 complex.mqh 86

 


SSA?
ALGLIBにはあるが、MTにはまだない。
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

 
Ivan Shishikin #:


SSA?
ALGLIBにはあるが、MTにはまだない。
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

標準ライブラリが追加されないうちは(すぐには追加されないかもしれないが)、既存のソース(1,2)でよいのでは?

 
。しかし、それだけでは十分ではない。
 
Ivan Shishikin #:


SSA?
ALGLIBにはあるが、MTにはまだない。
https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic

私の考えでは、それが登場する保証はまったくない.待つより、Cコードで直接使った方がいいのでは?