如何通过迭代找到最小总和和相应的索引?

问题描述 投票:0回答:1

根据将时间序列除以两部分的方程式,当达到最小值时,我需要确定最小值和相应的索引:

equation

在该等式中,n1n2是时间序列的两个部分的大小,它们构成了大小n的原始时间序列。公式中还设置了以下附加条件:将时间序列的第一部分的最小大小设置为n1 = 10,为此,将其设置为n2 = n – n1,然后将其增大:n1 = 11, 12,…, k,其中k = n – 10在其中n2 = 10

我已尝试对此方程进行编程,以通过迭代找到最小和,但是我不确定脚本是否正确。特别是,是否正确应用了循环?另外,最后似乎是n2=11,但迭代完成时必须为10

n=66; % The size of the original time series for the characteristic Y (e.g., temperature)
n1=n-20; % This operation is needed for the loops below
minsum=10000000; % Declaration of the variable needed for the "if" operator at the end of the script.
for j=1:n1
    ik=10+j-1;  % This is from 10 to 55
    s31=0; % This is preallocation
    for i=1:ik  % This is from 1 to 10, 11,...,55
        s31=s31+Y(i); % The values are taken from 1 to 10,11,...,55
        cn=ik; % This is from 10 to 55
        Mean1=s31/cn; % Finding of the means from 1 to 10,11,...,55. So, the minimum size of the sample over which the mean is found is 10 years
        s32=0;
        s32=s32+(Y(i)-Mean1).^2; % This is the first term of the equation
        s41=0;
        in1=ik+1; % This is from 11 to 56
        for k=in1:n % This is from 11 to 66
            s41=s41+Y(k);
            mn=n-in1+1; % This is from 56 to 11
            Mean2=s41/mn; % Finding of the means from 66 to 11,12,...,56 or from 11,12,...,56 to 66 to be consistent with the notation in the formula. So, the minimum size of the sample over which the mean is found is 11 years
            s42=0;
            s42=s42+(Y(k)-Mean2).^2; % This is the second term of the equation
            summation=s32+s42; % Finding the sums between all possible sizes of the two parts of the time series
            if summation<minsum
                minsum=summation % The minimum sum is displayed in the last output among the iterated values.
                imin=in1 % Finding the index in the original time series for which the minimum sum is achieved.
            end
        end
    end
end
matlab for-loop if-statement indexing min
1个回答
0
投票
该任务实际上更简单,并且需要较短的代码。假设我们有几年的每月温度数据。然后,使用两个“ for”循环就可以解决问题:

a=load('filename.txt'); JanT=a(:,2); % Monthy temperature data for January Years=a(:,1); % Years in the time series n=length(JanT); % The size of the original time series n1=n-19; % This operation is needed for the 'for' loop below n2=n-9; % This operation is needed for the 'for' loop below S1=[]; % Initialisation of the sum for the first term of the equation (in the vector form) for i=1:n1 A=sum((JanT(1:i+9)-mean(JanT(1:i+9))).^2); % Finding of the sums from 1 to 10, 11,...56. S1=[S1,A]; % Writing of the obtained results into the array end S2=[]; % Initialisation of the sum for the second term of the equation (in the vector form) for j=11:n2 B=sum((JanT(j:n)-mean(JanT(j:n))).^2); % Finding of the sums from 66 to 11, 12,...57 S2=[S2,B]; % Writing of the obtained results into the array end Sum=S1+S2; % Finding the sums between all possible sizes of the two parts of the time series [minsum,imin]=min(Sum) % Finding the minimum sum and the corresponding index when it is achieved Years=Years+10; % Shifting the years properly to find the year when the minimum sum is achieved imin=Years(imin) % Attribution of the found index to the year in the original time series

© www.soinside.com 2019 - 2024. All rights reserved.