求判断曲线趋势的算法

xiaofeng54 2010-04-13 07:48:38
在程序中建有一个变量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

...全文
1687 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaofeng54 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaowai0219 的回复:]
可以用插值法求出下一个点的近似值,然后就可以判断了啊
求近似值的方法:

C/C++ code
/*lagrange差值函数:pn(x)=Σ(Π(x-xi)/(xk-xi))yk*/

for(k=0;k<n;k++)
{
temp=1;
for(i=0;i<n;i++)
{if(i==k)continue;
……
[/Quote]

这个是说先求出下一点的近似值,然后如果实际值超出近似值某一个范围则认为上升在么?
showjim 2010-04-14
  • 打赏
  • 举报
回复
判断曲线趋势,这个不懂。估计得自己先总结一下需要提取的决定性特征
showjim 2010-04-14
  • 打赏
  • 举报
回复
第一点 myarray 应该做成循环链表,更新时间是O(1)的。
如果在更新的时候,再维护一个状态(当前结点的升降次数+升降状态)组合链表,应该只要取出第一个与最后一个状态比较就可以了。(说明:4位表示次数的话,次数差小于0则要+16)
不过看你的数据序列2,2,2,3,5,8,9,7,8,6,4,2,1,1,不是完全的逐渐上升然后下降。需要记录更详细的状态组合,如可忽略的小幅波动次数,甚至最大小幅波动值。
xiaowai0219 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaofeng54 的回复:]

引用 5 楼 donkey301 的回复:
用这10个点去拟合一条抛物线方程:
y = a(x-b)^2 + c
如果拟合结果是a<0,而且b在[0,9]之间,那么可以认为有峰。而且你还可以用a来控制你的误差


这个看来不错,能给个具体的实现代码么?多谢!
[/Quote]
我上面说的差值就可以拟合曲线的,知道相邻的两个点,曲线的大体趋势应该好判断吧。。。
donkey301 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaofeng54 的回复:]

引用 5 楼 donkey301 的回复:
用这10个点去拟合一条抛物线方程:
y = a(x-b)^2 + c
如果拟合结果是a<0,而且b在[0,9]之间,那么可以认为有峰。而且你还可以用a来控制你的误差


这个看来不错,能给个具体的实现代码么?多谢!
[/Quote]
主要的代码就是最小二乘法拟合。
你可以用这个库:
http://www.ics.forth.gr/~lourakis/levmar/
非常好用。
xiaofeng54 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 donkey301 的回复:]
用这10个点去拟合一条抛物线方程:
y = a(x-b)^2 + c
如果拟合结果是a<0,而且b在[0,9]之间,那么可以认为有峰。而且你还可以用a来控制你的误差
[/Quote]

这个看来不错,能给个具体的实现代码么?多谢!
donkey301 2010-04-14
  • 打赏
  • 举报
回复
用这10个点去拟合一条抛物线方程:
y = a(x-b)^2 + c
如果拟合结果是a<0,而且b在[0,9]之间,那么可以认为有峰。而且你还可以用a来控制你的误差
xiaowai0219 2010-04-13
  • 打赏
  • 举报
回复
可以用插值法求出下一个点的近似值,然后就可以判断了啊
求近似值的方法:
/*lagrange差值函数:pn(x)=Σ(Π(x-xi)/(xk-xi))yk*/

for(k=0;k<n;k++)
{
temp=1;
for(i=0;i<n;i++)
{if(i==k)continue;
temp=temp*(x-px[i])/(px[k]-px[i]);}
lagrange=lagrange+py[k]*temp;
}

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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