C#中如何判断曲线趋势?

xiaofeng54 2010-04-13 03:52:45
在程序中建有一个变量temp和一个数组float[]=new myarray[10],在timer下,temp每秒更新一次值,myarray[9]=temp,然后

for(int i=0;i<=8;i++)
{
myarray[i]=myarray[i+1];
}

这样子数组myarray中就由temp最新的十个值所填充,
现在的问题就是如何才能判断出myarray中的10个值连成的曲线是一个逐渐上升然后下降的波峰,不知道有没有成熟的算法或者好的建议,希望大家帮助我!

例如数据为:2,2,2,3,5,8,9,7,8,6,4,2,1,1,则判断为产生了一个满足条件的曲线。


图示:
如何判断下面链接图中的波峰

http://images.google.com.hk/imglanding?q=C%23%20%E6%9B%B2%E7%BA%BF&imgurl=http://images.cnblogs.com/cnblogs_com/kenblove/Curve4.jpg&imgrefurl=http://www.cnblogs.com/lr21shiji/articles/590972.html&usg=__KPN11pLF38YlPWUfdce-jbofk4Y=&h=500&w=900&sz=35&hl=zh-CN&um=1&itbs=1&tbnid=T60oKSZalQTV2M:&tbnh=81&tbnw=146&prev=/images%3Fq%3DC%2523%2B%25E6%259B%25B2%25E7%25BA%25BF%26um%3D1%26hl%3Dzh-CN%26newwindow%3D1%26safe%3Dstrict%26client%3Daff-avalanche%26sa%3DN%26channel%3Dsearchbox%26tbs%3Disch:1&um=1&newwindow=1&safe=strict&client=aff-avalanche&sa=N&channel=searchbox&tbs=isch:1&start=9#tbnid=T60oKSZalQTV2M&start=13



...全文
901 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zsuswy 的回复:]
我觉得这个好办
比如一个序列,我们对他生成一个新的序列,如果后一个>前一个大就算1,<就算-1,如果相等就看前面一个是1还是-1,前面没有的时候算1。
例如:2,2,2,3,5,8,9,7,8,6,4,2,1,1
得到的是 1,1,1,1,1,1,-1,1,-1,-1,-1,
然后把相邻的进行合并,于是得到 1,-1,1,-1
根据这个序列,就很算波动次数了,其它的再慢慢发散吧。这个过程……
[/Quote]

我觉得这样子好像还是不能确切的判断出哪个点出现了异常,哪个点是波峰哦,我在想能否利用数学来解决这个问题呢?例如求导?微积分?等等方法~~~这方面我不是很熟悉,不知道大家有什么意见和建议~~
zhoudan3986226 2010-04-13
  • 打赏
  • 举报
回复
你取每个波峰和波谷中间的点 再根据那些点就可以判断了
zsuswy 2010-04-13
  • 打赏
  • 举报
回复
我觉得这个好办
比如一个序列,我们对他生成一个新的序列,如果后一个>前一个大就算1,<就算-1,如果相等就看前面一个是1还是-1,前面没有的时候算1。
例如:2,2,2,3,5,8,9,7,8,6,4,2,1,1
得到的是 1,1,1,1,1,1,-1,1,-1,-1,-1,
然后把相邻的进行合并,于是得到 1,-1,1,-1
根据这个序列,就很算波动次数了,其它的再慢慢发散吧。这个过程还可以计算权重值,这样可以记录波动的大小。我觉得可行。
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wanghui0380 的回复:]
呵呵,这个问题你最好去问技术派的股民

估计随便挑一个就能给你说个一二三四五出来
[/Quote]

哈哈,那倒是,可是怎样转换为算法和编程语言呢?
wanghui0380 2010-04-13
  • 打赏
  • 举报
回复
呵呵,这个问题你最好去问技术派的股民

估计随便挑一个就能给你说个一二三四五出来
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsuswy 的回复:]
1,1,1,2,3,4,5,6,1000,1
---------------------
1,1,1000,2,3,1000,5,6,1000,1
------
我想问下这两种,算不算符合你的要求的??
[/Quote]

这样吧,我把问题再明确一下,一般正常情况的数据在50-55之间,异常范围在56-80之间,小波动范围在0-2之间。
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsuswy 的回复:]
1,1,1,2,3,4,5,6,1000,1
---------------------
1,1,1000,2,3,1000,5,6,1000,1
------
我想问下这两种,算不算符合你的要求的??
[/Quote]

数据1可以认为有1次波动
数据2可以认为有3次波动
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zsuswy 的回复:]
问题就在于这里啊,你说的这种小的波动在一个什么范围内???你怎么去衡量这个波动是“小”的而不是“大”的?? 你应该有你的判断标准啊。
[/Quote]

这个我会在程序里留出参数设置接口,现在可以先用一个经验值代替,先随便写一个,例如myarray[i+1]-myarray[i]的绝对值小于2则认为在小波动范围之内。
zsuswy 2010-04-13
  • 打赏
  • 举报
回复
1,1,1,2,3,4,5,6,1000,1
---------------------
1,1,1000,2,3,1000,5,6,1000,1
------
我想问下这两种,算不算符合你的要求的??
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
我目前的想法是对myarray[0]-myarray[5]取平均值放在 avg 里面,如果连续三次myarray[9]-myarray[8]>0,并且myarray[9]-avg>3(随便写的,也可以为其他经验值),则判断曲线在上升。不知道这样可不可取。
如果可取,后面再怎么判断波峰和下降我就不知道怎么写了~~~~唉,好像有点麻烦。
zsuswy 2010-04-13
  • 打赏
  • 举报
回复
问题就在于这里啊,你说的这种小的波动在一个什么范围内???你怎么去衡量这个波动是“小”的而不是“大”的?? 你应该有你的判断标准啊。
xiaofeng54 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zsuswy 的回复:]
:2,2,2,3,5,8,9,7,8,6,4,2,1,1
-------------------------------

我注意到中间的 9,7,8,6
意思就是说你这个还不一定是一个非常规整的过程,因为从2上升到9后,又下降到7,然后又上升到8,然后又开始下降。。。 也就是说中间还有其它波动。。。。
是不?
[/Quote]

是的,因为是实时监控外部设备传入的数据,所以有可能会出现这种小波动的,但是总体的趋势是形成一个波峰。
zsuswy 2010-04-13
  • 打赏
  • 举报
回复
:2,2,2,3,5,8,9,7,8,6,4,2,1,1
-------------------------------

我注意到中间的 9,7,8,6
意思就是说你这个还不一定是一个非常规整的过程,因为从2上升到9后,又下降到7,然后又上升到8,然后又开始下降。。。 也就是说中间还有其它波动。。。。
是不?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧