라이브러리: ALGLIB - 수치 분석 라이브러리 - 페이지 5

 

안녕하세요!


저는 ALGLIB을 완전히 처음 사용합니다. 그래서 스크립트를 사용하여 k²를 계산하는 다음 작업을 수행하려고합니다. Excel에서는 쉽게 할 수 있지만 상자형 제약 조건이 하나 있는 비선형 방정식 모델을 사용하는 방법을 모르겠습니다.


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}; //weights
   const double x0 = 37.74; //중심값 정리

//model 방정식
//y = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2는 Excel에서 솔버를 사용한 후 총 오차가 w(y-y0)^2의 최소 합계인 0.582018800686398로 계산되었습니다.
//상자 제약 조건 k^2>0;
  };




미리 읽어 주셔서 감사합니다!

 
Arthur Albano #:

안녕하세요!


저는 ALGLIB을 완전히 처음 사용합니다. 그래서 스크립트를 사용하여 k²를 계산하는 다음 작업을 수행하려고합니다. Excel에서는 쉽게 할 수 있지만 상자형 제약 조건이 하나 있는 비선형 방정식 모델을 사용하는 방법을 모르겠습니다.





미리 읽어 주셔서 감사합니다!


지금까지는 못생겨 보이지만...


//+------------------------------------------------------------------+
//|AlgLibExample.mq5 |
//|아서 알바노 |
//| https://www.mql5.com/ko/users/arthuralbano |
//+------------------------------------------------------------------+
#property copyright "Arthur Albano"
#property link      "https://www.mql5.com/ko/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; //중심값 정리

//model 방정식
//f(x,k²,x0) = (1/2)*((x^2-2x0x+x0^2+4k^2)^(1/2) + x+x0) - x
//k^2는 Excel에서 솔버를 사용한 후 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}; //weights
   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);
  };
//+------------------------------------------------------------------+
 

완료되었습니다.

기본적으로 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는 |입니다.
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를 사용하나요?

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' - 예상되는 클래스 타입 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 코드에서 직접 사용하는 것이 더 낫지 않을까요?