【混沌算法】0-1测试的matlab代码及总结

0-1 test

0-1测试是一个能够衡量时间序列是否有混沌的一种测试算法,与李亚普洛夫指数不同的是,它不需要进行相空间重构,通过输出结果是否接近于1来判别混沌现象的产生。

算法步骤

1.对于一个常数 c ∈ ( 0 , π ) c\in(0,\pi) c(0,π),计算:在这里插入图片描述
这里 n = 1 , 2 , . . . , N n=1,2,...,N n=1,2,...,N。我们可以画出分别以 p c p_c pc q c q_c qc为横轴和纵轴的轨迹图,其图形产生的布朗运动可以表征混沌现象。
2.为了分析 p c p_c pc q c q_c qc的扩散行为,我们可以计算位移均方差MSD,计算式为:
MSD这里,一般 n = N / 10 n=N/10 n=N/10,但是这里的 N N N如果采用原始序列的长度,那么横线处的 p c p_c pc将超出本身大小,所以我认为 N = N − n N=N-n N=Nn,这块我查阅了一些参考文献,都没有给出具体说明,我认为还可以讨论。
3.本身算出 M c ( n ) M_c(n) Mc(n)后可以直接计算 k c k_c kc,但是一般我们还需对于结果进行修正,首先我们给出原始算法被称为回归算法
在这里插入图片描述
4.这里我们再给出修正后的算法在这里插入图片描述
这里需要根据(7.4)计算得出 D c ( n ) D_c(n) Dc(n),然后进行计算即可;
在这里插入图片描述
这里 a a a一般取1.1。接着计算 k c k_c kc
在这里插入图片描述
可以得到 k c k_c kc的修正值。
5.文献中还给出了一种相关方法计算 k c k_c kc
在这里插入图片描述
这种方法的好处是计算结果能够比较好的接近于1或者0,符合0-1测试的内涵。
下面分享下自己编写的MATLAB代码,希望交流指正。



function [Kc,Kcreg,KcCorr] =ZeroOneTest(dataSet,cont)

%函数功能:完成0-1测试

%输入参数说明

%dataSet:待测试序列

%cont:规定常数值,范围0-pi自选

%------------------------

%输出参数说明

%Kc:利用Mc计算

%Kcreg:利用修正D得到

%------------------------

%测试样例

%dataset = logisticmap(0.3,3.97,4999);

%cont = 2;

% [Kc,Kcreg,KcCorr] =
ZeroOneTest(dataSet,cont);

%参考文献:The 0-1 Test
for Chaos: A Review

%计算开始

Ndata = size(dataSet,1);

p(1)=dataSet(1)*cos(cont);

s(1)=dataSet(1)*sin(cont);

for n = 1:Ndata

       
p(n+1)=p(n)+dataSet(n)*cos(n*cont);

       
s(n+1)=s(n)+dataSet(n)*sin(n*cont);

end

% %画出p和s的轨迹图

% figure

% plot(p,s);

% xlabel('p_c');ylabel('q_c');

% %画图结束;

%计算均方位移

Numn = Ndata/10;%建议不超过数据集大小的十分十一

meanpower = mean(dataSet,1)^2;

for n = 1:Numn

sumMean = 0;

for j = 1:Ndata-Numn%此处公式中N的大小取剩余的值

   
sumMean = sumMean + (p(j+n)-p(j))^2 + (s(j+n)-s(j))^2;

end

Mc(n) = 1/Ndata*sumMean;

Vosc(n) =
meanpower*((1-cos(n*cont))/(1-cos(cont)));

end

D = Mc -Vosc;

x = 1:Numn;

KcCorr = corr(x',D');

% %画图:画出Mc和D的变化

% figure

% n = 1:Numn;

% plot(n,Mc);

% hold on

% plot(n,D);

% xlabel('n');ylabel('Mc,D');

% %结束画图

Dreg = D(Numn) + 1.1*min(abs(D)); 

Kc = log(Mc(Numn))/log(Numn);

Kcreg = log(Dreg)/log(Numn);

end

测试代码



function [medianKcreg,medianKcCorr] =calcuKcreg(dataSet)

%函数功能:01测试进行100次,随机选择常数cont,得到Kcreg修正值

%输入参数:dataSet测试数据集

%输出参数:medianKcreg计算出来的Kcreg的中位数

for Numcalcu = 1:100

   
cont = pi/5+3*pi/5.*rand(1);

   
[Kc,Kcreg,KcCorr] = ZeroOneTest(dataSet,cont);

   
Kcreg1(Numcalcu) = Kcreg;  

    KcCorr1(Numcalcu)
= KcCorr;

end

medianKcreg = median(Kcreg1,2);

medianKcCorr = median(KcCorr1,2);

end

共同学习,欢迎留言指正。

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
混沌算法是一种基于混沌理论的优化算法,经常用于解决非线性优化问题。混沌算法可以搜索到全局最优解,并且具备较好的搜索效率。 以下是混沌算法MATLAB代码示例: ```MATLAB function [bestSolution, bestFitness] = chaosAlgorithm(costFunction, numVariables, numChaosAgents, numIterations) % 初始化混沌粒子位置和速度 chaosAgents = rand(numChaosAgents, numVariables); chaosVelocities = rand(numChaosAgents, numVariables); % 设置混沌参数 alpha = 1; % 混沌系统增益因子 beta = 0.5; % 混沌系统初始值调整系数 for iteration = 1:numIterations % 更新混沌粒子位置和速度 chaosVelocities = alpha * chaosVelocities + beta * (1 - 2 * chaosAgents); chaosAgents = chaosAgents + chaosVelocities; % 边界处理 chaosAgents(chaosAgents > 1) = 1; chaosAgents(chaosAgents < 0) = 0; % 计算适应度值 fitness = zeros(numChaosAgents, 1); for i = 1:numChaosAgents fitness(i) = costFunction(chaosAgents(i, :)); end % 更新最优解 [bestFitness, bestIndex] = min(fitness); bestSolution = chaosAgents(bestIndex, :); % 更新混沌参数 alpha = alpha / iteration; % 迭代次数越大,增益因子越小 beta = beta / iteration; % 迭代次数越大,初始值调整系数越小 end end ``` 使用该代码时,需要定义一个适应度函数`costFunction`,该函数的输入是某个解向量,输出是该解向量对应的适应度值。 使用混沌算法求解非线性优化问题可以按照以下步骤进行: 1. 定义适应度函数。根据具体问题的要求,编写适应度函数。 2. 调用`chaosAlgorithm`函数。输入参数包括适应度函数、决策变量的个数、混沌粒子的个数以及最大迭代次数。 3. 获取最优解和最优适应度。函数返回两个值,`bestSolution`是最优解向量,`bestFitness`是该最优解对应的适应度值。 以上是一个简单的混沌算法MATLAB代码示例,可以根据具体问题进行相应的修改和优化。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDD铩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值