2011-05-25 13 views
6

Cześć tam =) I przepraszam za mój angielski, z góry Mam zadanie obliczyć hurst wykładnik metodą regresji liniowej. I mam tekstowy opis rozwiązania. Wygląda to bardzo łatwo, ale zawsze otrzymuję wartości, które wychodzą z zakresu 0..1. Zwykle wartość wynosi 1,9 lub podobnie. Czasami otrzymuje wartość ujemną zbliżoną do zera. Przejrzałem kod o tysiąc razy, ale nie widziałem błędu.Obliczanie Hursta Exponent

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; 

Dzięki wszystkim =)

PS:

for tau:=nach to l do 

Istnieje L, a nie 1. A L to długość tablicy X. I L> nach zawsze oprócz ostatniego kroku, kiedy l = nach.

P.P.S. To działa, chłopaki. Ale wartości nie są właściwe. I wychodzą z zasięgu. Być może jest błąd w algorytmie. A może pominął jakiś krok.

Ostatnia aktualizacja

To mistyczny, ale jedynie zmieniono sposób obliczania macierzy Z i zaczął poprawnie działa .... Dzięki wszystkim =)

+4

Nie wiem, jak obliczyć "wykładnik hurst metodą regresji liniowej" lub co to jest. Co proponuję ci zrobić, jeśli powiesz, że kod działa bez problemów, ale wyniki są błędne to: idź, wypij kawę/wodę/itp 10 minut (zrób sobie przerwę), a następnie weź papier i ołówek, wykonaj kilka studiów przypadku dotyczących algorytmu (wejścia i wyjścia), ustaw punkty przerwania w kodzie i uruchom je krok po kroku. To właśnie robię, gdy mam złożony kod, który nie działa. – RBA

+0

Dzięki za sugestię, RBA. Ale próbuję tej metody przez 3 dni ... I nie widzę błędu .. Zaraz zwariuję ..) – Letoile

+0

Mówisz, że "L> nach oprócz ostatniego kroku, kiedy L = nach". Ale nie widzę żadnego kodu zmieniającego L lub nach!?! Są to stałe. Gdzie inicjujesz L? – Andreas

Odpowiedz

1

Pierwszą rzeczą widzę:

nach := 3;  
for tau := nach to l do //w 

To się liczy. A ponieważ nach> 1, treść tej pętli nie zostanie wykonana.

Jeśli spodziewasz się odliczać. Użyj wariantu downto. Odliczanie:

for tau := nach downto l do //w 
+0

Mm .. to nie jest 1, to L ... L> nach zawsze O_o tylko na ostatnim etapie l = nach O, to mój błąd. Nie mówiłem o L. L jest długością tablicy X – Letoile

+1

OK, po prostu kolejnym powodem, dla którego nie należy używać zmiennych pojedynczego znaku. Wyglądam jak 1. –

+0

Tak ... przepraszam – Letoile

0

Biorąc pod uwagę, że głównym pętla (for tau) iteracje od nach do l, pierwsze cztery SetLength rozmowy powinny ustawić długość l - nach + 1 zamiast l - nach.

+0

Próbowałem go po raz pierwszy .. Ale to nie pomaga .. Dzięki, będę edytować to – Letoile

0

Jeżeli linia

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

nie być

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

?