如何通过编程判断一维数组的周期?
有一组一维数组,数组的长度一定。比如a1=,我们就认为a1记录的是一个三周期的运动,a也可能是如下形式a1=,我们认为a1记录的是一个单周期的运动(也可能是一个稳定的吸引子),a1=,则我们就认为a1记录的吸引子是逆周期的或者是混沌的,假设a1只存在以上几种可能,请问如何通过编程实现对一维数组的操作,使其返回值记录a1是否是周期运动,周期形式是什么(如:是1-2的二周期还是1-2-3的三周期等)。希望大家给一点灵感,要求算法时间越少越好。软件不限,说出大体思路就可以了,谢谢!(这个问题是我在做胞映射---胞化积分轨迹法遇到的) 画出曲线图来(横坐标是数组索引,纵坐标是值),既然只存在很明显的几种趋势,观察也能知道了。 感谢Rainyboy院长的回答,我的想法是做全局形态分析,不能借助观察,完全通过程序和算法实现 本帖最后由 Rainyboy 于 2011-5-12 22:24 编辑回复 3 # sososwim 的帖子
这样啊,那做个FFT分析如何? 本帖最后由 sososwim 于 2011-5-13 11:04 编辑
我在matlab用seqperiod命令可以实现大部分功能,fft去做的思想是怎样?我只知道fft是快速傅里叶变换{:{28}:} 回复 4 # Rainyboy 的帖子
FFT怎么分析呢??{:{46}:} 回复 4 # Rainyboy 的帖子
请问FFT怎么分析呢? 回复 7 # sososwim 的帖子
我是想通过FFT的结果判断序列数据的周期性……不过对于非简谐数据也不是很明显……还是用常规方法吧……
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <math.h>
using namespace std;
#define NN 10
#define NEARZERO 1e-5
void Sample_Random(double *arrSource,int arrlen)
{
srand((int)time(0));
for(int i=0;i<arrlen;++i)
cout << (*(arrSource+i) = rand()%100)<<endl;
}
void Sample_Cycle(double *arrSouce,int slen,double *arrCycle,int clen)
{
for(int i=0;i<slen;++i)
cout << (*(arrSouce+i) = *(arrCycle+i%clen)) <<endl;
}
int SearchForCycle(double *arrSouce,int slen)
{
for (int clen =1;clen<=slen/2;++clen)
{
double abssum = 0.0;
//按照位移量clen作差并求绝对值和
for(int i=0;i<slen/2;++i)
{
abssum += abs( *(arrSouce+i) - *(arrSouce+i+clen) );
if(abssum >= NEARZERO)
break;
}
if(abssum < NEARZERO)
return clen;
}
return -1;
}
int main(int argc, char* argv[])
{
double arrData;
double arrC3[] = {1,2,3};
double arrC2[] = {1,2};
int choice;
cout<<"0]随机序列"<<"1]循环序列A"<<"2]循环序列B"<<endl;
cin>>choice;
system("cls");
switch (choice)
{
case 0:
Sample_Random(arrData,NN);
break;
case 1:
Sample_Cycle(arrData,NN,arrC2,2);
break;
case 2:
Sample_Cycle(arrData,NN,arrC3,3);
break;
}
cout<<"****"<<endl;
int clen = SearchForCycle(arrData,NN);
if(clen >0)
{
cout<<"最小循环:"<<clen<<endl;
cout<<"循环体:"<<endl;
for(int i=0;i<clen;++i)
{
cout<<arrData<<endl;
}
}
else
{
cout<<"无循环体"<<endl;
}
system("pause");
return 0;
}
页:
[1]