Discussion:
ciag harmoniczny
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Elvis Presley
2005-12-08 17:51:43 UTC
Permalink
Mam pytanie!
Jak policzyc w c++ sume ciagu harmonicznego?
Z gory dzieki za odpowiedz
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tomek
2005-12-08 18:16:07 UTC
Permalink
Post by Elvis Presley
Mam pytanie!
Jak policzyc w c++ sume ciagu harmonicznego?
Z gory dzieki za odpowiedz
Może trochę rozwiniesz? Np jak masz ten ciąg zapisany i co rozumiesz
przez ciąg harmoniczny?
Tomek Nurkiewicz
2005-12-08 19:06:34 UTC
Permalink
Post by Elvis Presley
Jak policzyc w c++ sume ciagu harmonicznego?
Otworzyć pierwsze-lepsze tablice matematyczne albo notatki z analizy. Ja
znalazłem w mniej niż minutę, a i Google pewnie prawdę Ci powie.

I przede wszystkim: szereg sum częściowych ciągu harmonicznego jest
rozbieżny (1 + 1/2 + 1/3 + 1/4...), w przeciwieństwie np. do szeregu
anharmonicznego.

OT się robi: pytanie bardziej na grupę pl.sci.matematyka, bo w
implementacji raczej problemów nie ma.

pozdrowienia
--
Tomek Nurkiewicz
"Nic nie tłumaczy morderstwa!" - http://hunter.art.pl
In order to send me an e-mail remove the dot between "n" and "u"
bartekLTG
2005-12-09 19:12:44 UTC
Permalink
Post by Tomek Nurkiewicz
Post by Elvis Presley
Jak policzyc w c++ sume ciagu harmonicznego?
Otworzyć pierwsze-lepsze tablice matematyczne albo notatki z analizy. Ja
znalazłem w mniej niż minutę, a i Google pewnie prawdę Ci powie.
I przede wszystkim: szereg sum częściowych ciągu harmonicznego jest
rozbieżny (1 + 1/2 + 1/3 + 1/4...), w przeciwieństwie np. do szeregu
anharmonicznego.
OT się robi: pytanie bardziej na grupę pl.sci.matematyka, bo w
implementacji raczej problemów nie ma.
I tak i nie.
Tu licze szereg n^-2 na dwa sposoby zmieniajac jedynie kolejność
sumowania.


#define zakres 10000000
float suma=0;
for (int d=1;d<=zakres;d=d+1 ) suma=suma+1.0/((double)(d)*(double)(d));
printf("%2.15f \n",suma);
suma=0;
for (int d=zakres; d>=1 ;d=d-1 ) suma=suma+1.0/((double)d*(double)d);
printf("%2.15f \n",suma);
printf("1,644934066848226\n");
printf("%2.15f \n",2.0/(double)zakres);

Wynik

1.644725322723389
1.644933938980103
1,644934066848226
0.000000200000000

trzecia linia to wartosc szeregu nieskonczonego((pi^2)/6 )
a czwarta, oszacowanie na roznice miedzy szeregiem
nieskonczonym a sumą od 1 do zakres.

Widać, ze drugi sposób daje wynik zgodny z oczekiwaniami,
|prawidlowy wynik - suma skonczona | < blad,
za to wynik pierwszego algorytmu zdryfował gdześ trzy rzedy
wielkości ponad błąd.

O czywiście, dla typu double problemy te wystepuja znacznie
dalej, ale tez da sie je wykryc.

BTW, drugi sposob tez nie jest optymalny;)

pozdrawiam
bartekltg

Loading...