61 lines
3.7 KiB
Common Lisp
61 lines
3.7 KiB
Common Lisp
//============================================================================================= MQL5 ===
|
|
// LibreFEI v1.006 (MQL5)
|
|
// Модуль кернел-функций для OpenCL
|
|
// Librecoin(c)2014-2017
|
|
//------------------------------------------------------------------------------------------------------
|
|
// Внимание! OpenCL не учитывает AsSeries(), массивы всегда нумеруются справа-налево!
|
|
//------------------------------------------------------------------------------------------------------
|
|
kernel void TrigFit_OCL(
|
|
global double *x,
|
|
global double *ipc,
|
|
int n,
|
|
double w,
|
|
global double *m,
|
|
global double *c,
|
|
global double *s
|
|
)
|
|
{
|
|
double Sc =0.0;
|
|
double Ss =0.0;
|
|
double Scc=0.0;
|
|
double Sss=0.0;
|
|
double Scs=0.0;
|
|
double Sx =0.0;
|
|
double Sxc=0.0;
|
|
double Sxs=0.0;
|
|
{for(int i=0;i<n;i++)
|
|
{
|
|
double cos_w_i=cos(w*i);
|
|
double sin_w_i=sin(w*i);
|
|
double dx=x[i]-ipc[i];
|
|
Sc +=cos_w_i;
|
|
Ss +=sin_w_i;
|
|
Scc+=cos_w_i*cos_w_i;
|
|
Sss+=sin_w_i*sin_w_i;
|
|
Scs+=cos_w_i*sin_w_i;
|
|
Sx +=dx;
|
|
Sxc+=dx*cos_w_i;
|
|
Sxs+=dx*sin_w_i;
|
|
}}//for(int i=0;i<n;i++)
|
|
Sc /=n;
|
|
Ss /=n;
|
|
Scc/=n;
|
|
Sss/=n;
|
|
Scs/=n;
|
|
Sx /=n;
|
|
Sxc/=n;
|
|
Sxs/=n;
|
|
{if(w==0.0)
|
|
{
|
|
m[0]=Sx;
|
|
c[0]=0.0;
|
|
s[0]=0.0;
|
|
}else{
|
|
// calculating a, b, and m
|
|
double den=pow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
|
|
c[0]=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
|
|
s[0]=((Sxc-Sx*Sc)*(Scs-Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc))/den;
|
|
m[0]=Sx-c[0]*Sc-s[0]*Ss;
|
|
}}//if(w==0.0)
|
|
}//TrigFit_OCL()
|
|
//
|