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