Imagina正弦波在零线附近振荡。我的任务是使用相当粗糙的x轴刻度计算沿波的几个随机点的斜率。 (是的,这有一个真正的应用)
当波在+ ve terrirtory(零线以上)时,斜率可以通过以下公式计算:
Slope = (y(n) / y(n-1)) - 1
这个正在向前倾斜并向前倾斜的斜坡上升了。
问题是当我们处于-ve领域时必须切换它,当其中一个值为零时,需要另外两个表达式,总共四个表达式必须以条件语句以编程方式选择。
我想找到一个涵盖所有四种条件的表达式,因为这是一个经常运行的算法和clks计数的中心!
我相信这对于数学天才来说是一个微不足道的解决方案,但是对于这些疲惫的眼睛来说,这让我望而却步......
添加了:
“正弦波”实际上是一个MACD指标,它源自金融市场的(随机)价格行为。一个例子就在这里:
http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_average_conve
斜率(例如下图中粗黑线的斜率)是我需要计算的,只需将其定义为向上或向下(向上标记为+ ve)
问题是+ ve和-ve斜率都可以出现在零度之上和之下。使用越过零线和零线的增量也可以进行斜率计算。
找到一个不涉及大量IF语句的解决方案会很高兴...例如,将所有y值按固定量移动,使它们变为+ ve,然后计算+ ve区域的斜率。我需要选择一个历史上的数字,y从未低于,例如几个数量级(99)然后我可以执行offest和一个斜率计算?
答案 0 :(得分:3)
你的'正弦波'是什么意思?你的意思是数学生成的y = a sin(bx)
曲线或通过样条适合某些实验点的平滑曲线恰好类似于正弦波,因为它围绕x轴振荡?如果是前者,您可以在数学上区分它并在任何点获得精确的斜率。如果是后者,你正在寻找的公式是
slope(x) = (y(x-delta) - y(x+delta))/(2 * delta)
尝试不同的delta值。没有条件涉及;分子和分母的符号将自动确保您获得斜坡的正确符号。
答案 1 :(得分:2)
斜率只是
slope = y(n)-y(n-1)
或者,如果x轴上有单位,则将其除以一个x轴步长(即x(n)-x(n-1))。
此公式是定义的排序,并且您所在的x轴的哪一侧无关紧要。 (我在这里说“排序”,因为斜率是这个等式的极限,因为你的样本箱非常接近,所以这个等式是近似值,可以使用其他近似值。)
请记住,噪声数据的斜率看起来会更加嘈杂。
我怀疑slope page on wikipedia的前几段会帮助你解决这个问题。
答案 2 :(得分:0)
如果您正在寻找正弦波的斜率,可以通过标准微积分函数完成。
f(x)=sin(x)
行的斜率为f'(x)=cos(x)
。
然而,根据你的公式,我并不完全确定你所追求的是什么。也许你需要弄清楚它。
但是如果你想要问题所示的方法,我认为你对性能的关注是错误的。为了将此计算作为单个算术表达式进行,您将不得不乘以-1,具体取决于您是在x轴之上还是之下(以及是否从f(n)过渡到该轴-1)到f(n))。
一旦将它编译成机器语言,这可能比简单的if语句序列更慢(或者至少没有更快)。
与所有优化一样,您应首先选择最容易开发的方法然后查看它是否存在性能问题。否则你可能会在前面浪费很多精力来获得不必要的提升。
答案 3 :(得分:0)
你不需要斜坡;你可以这样做:
(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) <
iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2)
意味着减少。否则增加图表,只要:
(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) >0