Delphi 计算赫斯特指数

Delphi 计算赫斯特指数,delphi,math,Delphi,Math,嗨,你好(=)提前为我的英语道歉 我的任务是用线性回归的方法计算赫斯特指数。我有解决方案的文字说明。这看起来很简单,但我总是得到范围为0..1的值。通常,值为1.9或类似值。有时它会得到接近于零的负值。 我已经检查了大约一千次代码,但没有发现错误 var max_z,min_z,x_m:real; //max and min of cumulative sum and mean value of X for every Tau st,ss,sst,st2 :real; Al, Herst: re

嗨,你好(=)提前为我的英语道歉 我的任务是用线性回归的方法计算赫斯特指数。我有解决方案的文字说明。这看起来很简单,但我总是得到范围为0..1的值。通常,值为1.9或类似值。有时它会得到接近于零的负值。 我已经检查了大约一千次代码,但没有发现错误

var
max_z,min_z,x_m:real; //max and min of cumulative sum and mean value of X for every Tau
st,ss,sst,st2 :real;
Al, Herst: real;
x_vr:array of double;   //a piece of array with length=tau
i, j, nach: integer;
begin
    //file opening and getting values of X array are in another function
    nach:=3;    //initial value of tau
    Setlength(ln_rs,l-nach); //length of  ln(R/S) array
    Setlength(ln_t,l-nach);  //length of  ln(tau) array
    Setlength(r,l-nach);   //length of  R array
    Setlength(s,l-nach);   //length of S array


      //Let's start
    for tau:=nach to l do  //we will change tau
    begin
        Setlength(x_vr,tau+1); //set new local array (length=tau)
        for i:=0 to length(x_vr)-1 do
            x_vr[i]:=x[i];

        x_m:=Mean(x_vr);    //mean value
        Setlength(y,tau+1);   //length of array of difference from mean value
        Setlength(z,tau+1);   //length of array of cumulative sum

        for i:=0 to tau do
            y[i]:=x_vr[i]-x_m;      //difference from mean value

        z[0]:=y[0];
        for i:=1 to tau do      //cumulative sum
             for j :=i downto 0 do
                z[i]:=z[i]+y[j];

        max_z:=z[0];
        for i:=1 to tau do        //max of cumulative sum
            max_z:=max(max_z,z[i]);

        min_z:=z[0];
        for i:=1 to tau do        //min of cumulative sum
            min_z:=min(min_z,z[i]);

        r[tau-nach]:=max_z-min_z;    //R value
        s[tau-nach]:=0;
        for i:=0 to tau do
            s[tau-nach]:=power(y[i],2)+s[tau-nach];         //S value

        s[tau-nach]:=sqrt(s[tau-nach]/(tau+1));

        //new array values
        ln_rs[tau-nach]:=Ln(R[tau-nach]/S[tau-nach]);   // ln(R/S)
        ln_t[tau-nach]:=ln(tau);                        // ln (tau)

    end;    //End of calculating

    //Method of Least squares
    for i:=0 to length(ln_rs)-1 do  
        st:=st+ln_t[i];

    st:=(1/length(ln_rs))*st;

    for i:=0 to length(ln_rs)-1 do
        ss:=ss+ln_rs[i];

    ss:=(1/length(ln_rs))*ss;

    for i:=0 to length(ln_rs)-1 do
        sst:=sst+ln_t[i]*ln_rs[i];

    sst:=(1/length(ln_rs))*sst;

    for i:=0 to length(ln_rs)-1 do
        st2:=st2+ln_t[i]*ln_t[i];

    st2:=(1/length(ln_rs))*st2;


    Herst:=(sst-st*ss)/(st2-st*st);      //coefficient of approximal function
    al:=ss-st*Herst;
谢谢大家()

附言

这是我,不是1。L是X数组的长度。当L=nach时,L>nach总是在最后一步之外

p.p.S。 行了,伙计们。但价值观并不正确。他们离开了射程。也许,算法中有错误。或者我跳过了一步

上次更新

它是神秘的,但我只是改变了计算数组Z的方法,它开始正常工作。。。。 谢谢大家=)

我看到的第一件事:

nach := 3;    
for tau := nach to l do  //w
这很重要。因为nach>1,这个循环的主体将不会被执行

如果你想倒数。使用downto变量。倒计时:

for tau := nach downto l do  //w
假设主循环(
for tau
)从
nach
迭代到
l
,那么前四个
SetLength
调用应该设置
l-nach+1
的长度,而不是
l-nach
应该设置行的长度

z[i]:=z[i]+y[j];
不可能

z[i]:=z[i - 1]+y[j];

Mm。。这不是1,这是我。。。五十> nach始终只有在最后一步L=nach Oh。。这是我的错。我并没有说L,L是X arrayOk的长度,只是不使用单字符变量的另一个原因。l看起来像1。我不知道如何用线性回归法计算赫斯特指数或它是什么。如果你说代码运行没有问题,但结果是错误的,那么我建议你做的是:去喝一杯咖啡/水/等10分钟(休息一下),然后拿一张纸和一支铅笔,对算法(输入和输出)进行几个案例研究,在代码中设置断点并逐步运行。当我有一个复杂的代码无法工作时,我就是这么做的。谢谢你的建议,RBA。但是我试了三天这个方法。。。而且看不出有错。。我会发疯的……)你们说,“除了最后一步,当L=nach时,L>nach”。但我看不到任何代码更改L或nach!?!它们是常量。你在哪里初始化L?天哪。。。我必须谈谈L和Tau。。。当然,nach是一个常数。头在变。。除最后一步外,L>tau。。我很抱歉。。我很累了。我第一次试过了。。但这没用。。谢谢,我会编辑这个
z[i]:=z[i - 1]+y[j];