Математики и программисты! Нужна помощь! - страница 2

 

Сваял все таки костыль)):

 
#property script_show_inputs
//--- input parameters
input int      InputBar=8;//кол-во N
input int      OutBar=5;//кол-во Y
//+------------------------------------------------------------------+
MqlRates rates[];
double in_Bars[];//Входные данные
                 //in_Bars11[8]={1.5,1.6,1.4,1.65,1.59,1.45,1.35,1.41};

double out_Bars[];//Выходные данные
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---init
   ArraySetAsSeries(rates,true);
   ArrayResize(in_Bars,InputBar);
   ArrayResize(out_Bars,OutBar);
   ArrayInitialize(out_Bars,0);
   double step=(double)OutBar/(double)InputBar;//Шаг, кол-во N в 1-м Y
   double Start=0;//Отсчет координат
   int inp_iB=0;//N по порядку
//-------
   CopyRates(Symbol(),0,0,InputBar+1,rates);
   for(int a=0;a<InputBar;a++)
     {
      in_Bars[a]=rates[a].close;
     }
//--------
   double nxtsum=0;//Значение остатка (для Y+1)
   double nxtdev=0;//Делитель остатка (для Y+1)
   for(int i=0;i<OutBar;i++)//Основной цикл
     {
      double sum=0+nxtsum;nxtsum=0;//Предидущее значение остатка
      double dev=0+nxtdev;nxtdev=0;//Предидущее значение остатка

      while(Start<double(i+1))
        {
         Start+=step;
         if(Start>(double)(i+1))//Если отсчет больше чем I+1, расчет текущего значения и остатка
           {
            // Текущие значения и делитель для части N
            sum+=in_Bars[inp_iB]*(step-((Start-(double)(i+1))))/step;
            dev+=(step-((Start-(double)(i+1))))/step;
            // Остаток значения и делитель для части N следующего Y
            nxtsum=in_Bars[inp_iB]*(((Start-(double)(i+1))))/step;
            nxtdev=(((Start-(double)(i+1))))/step;

            inp_iB++;//N++
              } else {sum+=in_Bars[inp_iB]*1;dev+=1;inp_iB++;
           } // Текущие значения и делитель для полного N
        }
      out_Bars[i]=sum/dev;//Усреднение
      Print("out_Bars[",i,"] Value=",out_Bars[i]);
     }
  }
//+------------------------------------------------------------------+
 
Михаил:

Какое Т.З, таков и результат.

То, что Вы вновь нарисовали - опять не правильно.

Нужно так:

1. Есть исходные 8 точек, которые соответствуют таким-то отрезкам времени (указать шаг времени)

 2. То, что нужно получить (из каких параметров Вы строите первую красную точку? Почему первая синяя точка = 1, а первая красная = 0,6 ?)

 

Некую последовательность из N элементов преобразовать в последовательность из Y элементов (черная шкала на рисунке)

Зеленая шкала(где |---1---|-0.6--/-0.4-|---1---|-0.2--/--0.8--|--0.8--/-- и т.д.) вклад (вес) элемента N  в элемент Y (сверху шкалы Y значение(Y[0]=1.5375;Y[1]=1.48125...) и расчет значения для красной линии)

Cиняя линия исходные значения N

Надеюсь так яснее будет) 

 
при (N<Y) бред какой-то получается...точно костыль...возможно у кого будет идеи как исправить/упростить?
 

Интерполируем -- p(t)

 

 

Точек меньше, т.е шаг стал больше  --- выравниваем

 

 ======================

 

ИТОГО :

 

 

Если точек больше

 

 
Поздравляю всех потрудившихся в этой ветке. На пути создания идеального фильтра преодолена большая веха. Вы задумались над тем, как освоить вычисление SMA(2), это я о первом посте, начавшем тему. Пока, правда, не полностью. Половину баров SMA2 зачем-то решили отбрасывать. Но это не суть. Касаемо предудыщего моему поста: поздравляю, Вы, работая в Маткаде, решили принципиально игнорировать функцию linterp и сделали всё сами. 
 
Mikhael Isakov:
Поздравляю всех потрудившихся в этой ветке. На пути создания идеального фильтра преодолена большая веха. Вы задумались над тем, как освоить вычисление SMA(2), это я о первом посте, начавшем тему. Пока, правда, не полностью. Половину баров SMA2 зачем-то решили отбрасывать. Но это не суть. Касаемо предудыщего моему поста: поздравляю, Вы, работая в Маткаде, решили принципиально игнорировать функцию linterp и сделали всё сами. 

А вы не пытались подумать над тем, почему я не воспользовался встроенными функциями Маткад?  Нет?  Подумайте. 

 
Олег avtomat:

А вы не пытались подумать над тем, почему я не воспользовался встроенными функциями Маткад?  Нет?  Подумайте. 

Возможно, единственно потому, что не смогли применить их по назначению. Я вот элементарно сделал бы это на linterp. 
 
Mikhael Isakov:
Возможно, единственно потому, что не смогли применить их по назначению. Я вот элементарно сделал бы это на linterp. 

1) Ущипнуть хочешь?... Смешон. 

2) Вот именно, в Маткад на linterp сделать это -- элементарно.   

Но в мкл такой встроенной функции нет, и поэтому применить её не получится.

Но и напрямую это сделать совсем не сложно.  Попробуйте, может быть и у вас получится.