⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functionchaospredict.m

📁 混沌多步预测算法 可实现较为精确的多步预测 实用性较强
💻 M
字号:
%AOLMM多步预测函数
function [FChaosPredict] = FunctionChaosPredict(Data,N,mtbp,deltaT,tao,d,MaxStep)
%Data是一维信号时间序列,N是信号数据长度,mtbp,deltaT,tao,d分别是重构相空间的平均时间序列、采样周期、时延及嵌入维

%第一段:取横摇数据,重构相空间
%MatrixX是M行d列的矩阵,是相空间矩阵的转置
roll=Data;
M = N - (d - 1)*tao;
for i = 1 : M
    for j = 1 : d
        MatrixX(i,j) = roll(i + (j - 1)*tao);
    end
end


%第二段:寻找临近点,并依据各临近点到中心点的距离为各点赋值

%1、计算相空间中第M点与各点的欧式距离
for j = 1 : (M - 1)
         Dis(j) = norm(MatrixX(M,:) - MatrixX(j,:),2);
end

%2、排序计算相空间中第M点的(m+1)个参考邻近点
%这段代码的具体原理是:
%第一个for循环将相空间中离中心点最远的d+1个点与中心点的距离赋给neardis向量,
%这些距离通常较大,并将这些点的序号赋给nearpos序列
for i = 1 : (d + 1)
    NearDis(i) = Dis(i);
    NearPos(i) = i;
end
%将与中心点更近的点距离与以上neardis距离进行对比,将更小的距离赋给neardis.
%这个for循环的结果是,将距离最小的d+1各点赋给neardis,并记录序号nearpos
for i = (d + 2) : (M - mtbp)
    for j = 1 : (d + 1)
        if (abs(i-j)>mtbp) %& abs(i-j)<10*mtbp 
        if(Dis(i) < NearDis(j))
            NearDis(j) = Dis(i);
            NearPos(j) = i;
            break;
        end
        end
    end
end
SortedDis = sort(NearDis);%对neardis序列进行排序,由小到大
MinDis = SortedDis(1);


%第三段:计算第M点的(m+1)个参考邻近点的权P[i]
SumP = 0;
for i = 1 : (d + 1)
    P(i) = exp(-NearDis(i)/MinDis);
    SumP = SumP + P(i);
end
P = P/SumP;


%第四段:用最小二乘法计算a[],b[]
for step=1:1:MaxStep
    aCoe1 = 0;
    aCoe2 = d;
    bCoe1 = 0;
    bCoe2 = 0;
    e = 0;
    f = 0;
    for i = 1 : (d + 1)
        aCoe1 = aCoe1 + P(i)*sum(MatrixX(NearPos(i),:));
        bCoe1 = bCoe1 + P(i)*(MatrixX(NearPos(i),:)*MatrixX(NearPos(i),:)');
        e = e + P(i)*(MatrixX(NearPos(i) + step,:)*MatrixX(NearPos(i),:)');
        f = f + P(i)*sum(MatrixX(NearPos(i) + step,:));
    end
    bCoe2 = aCoe1;
    CoeMatrix = [aCoe1,bCoe1;aCoe2,bCoe2];
    ResultMatrix = [e;f];
    abResult = pinv(CoeMatrix)*ResultMatrix;
    a = abResult(1);
    b = abResult(2);
for j = 1 : d
%     MatrixX(M + step,j) = a + b*MatrixX(M,j); %以历史上相近点的演化规律作为中心点的演化规律以中心点为基准进行预报
    
    MatrixX(M + step,j) = 0;
    for i = 1 : (d + 1)
        MatrixX(M + step,j) = MatrixX(M + step,j) + P(i)*(a + b*MatrixX(NearPos(i),j)); %以历史上相近点的演化加权和直接作为中心点的演化点进行预报
    end
end
%误差修正
    if M-tao+step+(d-1)*tao < N+1
        for j=1:d-1
            err(j)=MatrixX(M + step,j)-roll(M+step+(j-1)*tao);
        end
        ppp=1:d-1;ttt=err;neterr=newrbe(ppp,ttt);xxx=2:d;errp=sim(neterr,xxx);
        PredictedData(step) = MatrixX(M + step,d) - errp(d-1);
        roll(N+step)=PredictedData(step);
    else    PredictedData(step) = MatrixX(M + step,d);
    end%        roll(N+k)=PredictedData(k);
FChaosPredict(step) = PredictedData(step);
% FChaosPredict(step) = MatrixX(M + step,d);
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -