差分微积分,例子。 - 页 4

 
尤苏夫霍贾-苏尔托诺夫

当你把样本增加到N=100时,四度方程给出了以下结果。



从数学上讲,你的搜索边界是非常模糊的。能否请你详细说明一下它是怎样的?

 
尼古拉-森科

是的,我错了。我以为你真的在用近似法。我仔细看了一下你的代码,意识到这不是一个近似值,而只是一个微不足道的平均数,尽管非常不寻常。之后,你把紫线和红线向左移72条,完成92条的红尾巴的绘制,而且每一个新的条形都会重新绘制。蓝线是由移位的紫线形成的。顺便说一下,使用收盘价而不是开盘价更正确。如果你改成收盘,你可以立即看到,每一个刻度线的红色尾巴92条都会跳动。

移动平均线 向左移动,没有任何用处和实际应用。它只为美丽、合适和魅力服务。

我们需要了解近似和平滑(平均)之间的区别。近似法在给定的数据区间上计算一个函数(多项式、傅里叶式、贝塞尔式、样条式等)的系数,当至少有一个数据值发生变化时,这些系数通常会发生一切变化,因此函数会在观察到的数据区间上重新绘制。但在平均化的情况下,只考虑在以前的数据基础上的一个当前点;因此,平均化(平滑化)不会重绘,但总是滞后于数据,这与近似化不同。
而且我不明白某个度数的多项式和牛顿二项式有什么关系,如果代码中甚至没有任何度数。

))

嗯哼,现在也是一个没有明确的Sin函数的正弦波。

正弦的差分方程:https://dxdy.ru/post1247421.html#p1247421

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  2701*a1_Buffer[i]   -5328   *a1_Buffer[i+1 ]    +  2628 *a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

      a3_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a3_Buffer[i+0+z]=  2.998096443*a3_Buffer[i+1+z]  -  2.998096443*a3_Buffer[i+2+z]   +   1*a3_Buffer[i+3+z]   ;  }}

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}

      a6_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a6_Buffer[i+0+z]=  3.998096443*a6_Buffer[i+1+z]  -  5.996192886*a6_Buffer[i+2+z]   +   3.998096443*a6_Buffer[i+3+z]  -  1*a6_Buffer[i+4+z] ;  }}

周期为144的正弦波的计算被强调。第一个是在常数附近(图中绿色),第二个是在斜线附近(图中红色)。

Рекуррентная формула для синуса : Дискуссионные темы (М) - Страница 7
  • dxdy.ru
В принципе, используется и рекуррентное вычисление через возвратное уравнение второго порядка, и через комплексную экспоненту. Первое менее расходно по ресурсам (умножение и два сложения и две ячейки памяти) по сравнению со вторым (два умножения, четыре сложения, две ячейки памяти при постоянной частоте), но накапливается погрешность быстрее...
附加的文件:
 

我也许应该马上在支部里附上一份'阅读清单'。))

关于这个问题的文献很多,我给大家推荐几本符合我口味的瘦身书。

列昂尼德-库兹米奇-拉赫丁的《有限差分的计算》。

马库舍维奇人工智能的返回序列

 
阿列克谢-潘菲洛夫

))

嗯哼,现在也是一个没有明确的Sin函数的正弦波。

正弦的差分方程:https://dxdy.ru/post1247421.html#p1247421

突出了周期为144的正弦波的计算。第一个是在常数附近(图中绿色),第二个是在斜线附近(图中红色)。


谢谢你,阿列克谢的文献。我承认递归可能是有用的,并成功地应用于加速一些函数或算法,但说实话,我对它不太确定。
我只是主张对事物要用正确的名称来称呼,要用常规的术语,这样才不会产生混淆。在我看来,在这个话题的开头提到递归会更符合逻辑,而不提插值、近似和多项式,因为它们在你的例子中没有显示。而且还不如把重点放在指标向左的转移上,这样就不会因为形式的过分正确而误导别人,因为不是每个人都喜欢理解别人的代码,我也上当了。

阿列克谢,据我所知,你在递归问题上是个专家。就我个人而言,我在其中毫无头绪。我有一个问题,一个请求和一个建议。你能用你的方法来加快傅里叶法的近似速度吗?直觉告诉我这是可能的。如果你能做到这一点,那将是哇!!!而实际用途将是巨大的。我附上一个在MT5上用傅里叶外推法进行逼近的例子(它只是工作得更快,更简单的更好)。我从这里 取了这个例子,并通过添加鼠标控制Ctrl键(改变起始位置)和Shift键(改变观察周期,同时改变谐波数),使其更加清晰。你能试一试吗?

该指标如下:首先,用鼠标点击图表(激活窗口),按下Ctrl键(并释放),然后移动鼠标,改变起始位置;要完成这个过程,按任何键(除了Ctrl和Shift)。同样的道理,Shift键可以改变周期(近似函数的条形范围)。

附加的文件:
Fourier.mq5  16 kb
 

关于交易、自动交易系统和交易策略测试的论坛

差分微积分,例子。

Nikolai Semko, 2018.01.12 00:43


我只是主张对事物应该用正确的名称来称呼,应该使用普遍接受的术语,这样就不会产生混淆。在我看来,在这个话题的开头提到递归会更符合逻辑,而不提插值、近似和多项式,因为它们在你的例子中没有显示。而且,把重点放在指标向左移动上会更正确,这样就不会因为形式的过度正确而误导别人,因为不是每个人都喜欢看别人的代码,我也曾上过当。


尼古拉,感谢你的帖子和所附指标。

我完全同意,首先需要对术语和名称有一个明确的理解。

让我解释一下我的立场。

你可以通过两点画一条线,这意味着你可以在两点之间的间隔内(内插法)或两点之间的间隔外(外推法)找到这条线的任何一点。

你可以画一条单值曲线,例如,对应于在直角坐标系中用线性二次方程表示的 正抛物线。这意味着,也可以在极端点之间的区间内(内插法)或在这个区间外(外推法)找到这个曲线的任何一点。绘制这些点所依据的规律仍然是多项式的。我还应该补充一点,至少通过三点,如果我们假设有正弦波规律,就有可能画出一个毫不含糊的正弦波,如果我们假设有圆,就有可能画出一个圆。

因此,用二度多项式对第四个点(在我们的例子中,其中两个点积累了以前的历史 ,第三个点带有新的信息)进行插值,变成了行动或过程的必要(可能还有其他规律) 和充分定义。

当然,除非你为它提出其他术语。

说到这里,我完全同意,如果想按超过最低要求的数值的数量来绘制曲线,就应该使用统计学(或其他方面)上合理的方法来加权,包括回归。
 
阿列克谢-潘菲洛夫


尼古拉,感谢你的帖子和所附指标。

我完全同意,首先需要对术语和名称有一个清晰的理解。

让我解释一下我的立场。

你可以在两点上画一条线,这意味着要找到这条线的任何一点,要么在两点之间的间隔内(内插法),要么在两点之间的间隔外(外推法)。

你可以画一条单值曲线,例如,对应于一个方形抛物线,在直角坐标系中,该抛物线由一个线性平方方程表示。这意味着,也可以在极端点之间的区间内(内插法)或在这个区间外(外推法)找到这个曲线的任何一点。绘制这些点所依据的规律仍然是多项式的。我还应该补充一点,至少通过三点,如果我们假设有正弦波规律,就有可能画出一个毫不含糊的正弦波,如果我们假设有圆,就有可能画出一个圆。

因此,用二度多项式对第四个点(在我们的例子中,其中两个点积累了以前的历史,第三个点带有新的信息) 进行插值,变成了行动或过程的必要(可能还有其他规律) 和充分定义。

当然,除非你为它提出其他术语。

也就是说,我完全同意,如果你需要为超过最低要求的数值绘制曲线,你需要使用统计学(或其他)上合理的数值加权方法,包括回归。

如何通过三个点构造一条多项式曲线,我最近在这个代码 中实现了 我建议你看一看。

但你的代码并没有按三点计算多项式。

阿列克谢-潘菲洛夫

它在图表上看起来是这样的。

蓝-红线是通过肩部为72的四度多项式进行插值(在一个区间内找到一个点)。

a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

蓝色细线是通过杠杆率为78的2度多项式进行外推(在区间外找到一个点)。

a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

红线是4次方的多项式的构造线。它被重新绘制,并以最后一个条形图的开盘点为基础。

a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


你所说的2度多项式和4度多项式并不是多项式。

由于二度多项式的公式为

Price = a+b*i+c*i²

而是一个四度多项式的公式。

Price = a+b*i+c*i²+d*i³+f*i⁴

其中

a,b,c,d,f - 要计算的系数

i是酒吧的数量。

而你有一种华丽的平均方式,其中(以你所说的2度多项式为例)一条线i的当前点是由另一条线的最后三个点(i,i+1和i+2)计算而来,其权重系数不同。这被称为平均化(或平滑化)。这就是为什么你把图表向左移动了72个柱子,以隐藏因平均化而出现的滞后。

在我的例子 中,通过三个点计算多项式的情况清晰可见。

 
尼古拉-森科

然而,在我的例子 中,对三点的多项式的计算是清晰明了的。

你的指标非常好。

如果你有同样的一个四,那么就把它附在本主题第23 帖的灰色指标线的任何三点上。

这条线(灰色)是在缓冲区内计算的。

 a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}
1*Y1-3*Y2+3*Y3-1*Y4=0 - 二度抛物线差分方程对于等距离的点。
 
阿列克谢-潘菲洛夫

你的指标是一个非常好的指标。

如果你有相同的一个四,那么把它连接到本主题第23 帖的灰色指标线的任何三点上。

这条线(灰色)是在缓冲区内计算的。

1*Y1-3*Y2+3*Y3-1*Y4=0是一个二度抛物线的差分方程对于等距离的点。

我有MT4的代码,在那里的评论中进一步说明

是的,你的灰色线条是一个多项式。而你重画的92条消息 的红尾巴到移位的平均值也是多项式,只是重画。但你把其他的东西都称为多项式,同时又声称你的多项式没有被重绘。而事实并非如此。这就是为什么我要求你用正确的名字称呼事物。

顺便说一下,在我的例子 中,形成多项式的下一个点是通过计算系数完成的,这种算法比你的 "差分计算 "更快,尽管我也应用了与前值的差分。

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

你的选择。

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }
 
尼古拉-森科

我在评论中进一步提供了MT4的代码

是的,你的灰色线条是一个多项式。而从第2条信息 的92条红尾巴,你画到移位的平均值,也是一个多项式,它是透支的。但你把其他的东西都称为多项式,同时又声称你的多项式没有被重绘。而事实并非如此。这就是为什么我要求你用正确的名字称呼事物。


是的,我同意二阶多项式,只涉及4个点的构造,或四阶多项式的6个点。 得到的、没有重画的整条线当然不是多项式, 它只是在所考虑的情况下用一定程度的多项式构造的。

细线只直观地显示了那些构建下一个点的多项式。

看来我们在条款上达成了一致。:)


顺便说一下,在我的例子 中,多项式中下一个点的形成是通过计算系数完成的,这种算法比你的 "差分计算 "要快,尽管我也应用了与前值的差分。

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

你的选择。

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }

关于速度,你可能是对的。

我建议我们不要触及速度和可能的过失问题(首先是我的:)。)的编码,当然,如果它们不是关键的话。

 
尼古拉-森科

你能用你的方法来加快傅里叶近似的速度吗?直觉告诉我这是可能的。如果你能做到这一点,那将是令人惊叹的!......而且实际收益将是巨大的。我附上一个在MT5上用傅里叶外推法进行逼近的例子(它只是工作得更快,更简单的更好)。我从这里 取了这个例子,并通过添加鼠标控制Ctrl键(改变起始位置)和Shift键(改变观察周期,同时改变谐波数),使其更加清晰。你能试一试吗?

该指标如下:首先,用鼠标点击图表(激活窗口),按下Ctrl键(并释放),然后移动鼠标,改变起始位置;要完成这个过程,按任何键(除了Ctrl和Shift)。用Shift键改变周期(计算近似函数的条形范围)也一样。


关于傅立叶,这个话题很丰富。如果有兴趣,我们会不定期地接触它。

最有可能的是,主要问题会从问题陈述中产生(由于其他方法)。现在,据我所知,该指标从傅里叶频谱中选择最多振幅的频率。

我有一个想法,就是把傅里叶 指标拧到已经平均好的多项式线上。我怀疑,其推断的读数变化会更慢。