∑(1/n^2) n = 1 ~ ∞は π・π/6 に収束する。これを計算して n = 10億ぐらいでどれだけ近づくかなとやってみたところ、n = 1 億ぐらいから 飽和した。
n の値が大きくなると 1/n^2は非常に小さくなって前までの値と足しても増えないようだ。
ならば 1から計算を始めるのではなくて n_max(最大値)から計算を初めたらどや?
for( n = n_max; n > 0; n--){
sum += 1.0/pow((double)n, 2) ; 以下略
n _ max = 100 億 の場合
1/n^2 の収束は = 1.6449340668482264061
n = 10000000000 までの和は 0.000000000000000000010000000000
n = 9000000000 までの和は 0.000000000011111111122283359682
n = 8000000000 までの和は 0.000000000025000000012811807215
n = 7000000000 までの和は 0.000000000042857142872343361362
n = 6000000000 までの和は 0.000000000066666666685549522269
n = 5000000000 までの和は 0.000000000100000000025002468236
n = 4000000000 までの和は 0.000000000150000000036251783884
n = 3000000000 までの和は 0.000000000233333333393864519130
n = 2000000000 までの和は 0.000000000400000000129986071162
n = 1000000000 までの和は 0.000000000900000000505036047587
--------------------
n = 1 までの和は 1.644934066748226397791654562752
ここまでの時間 = 368286 ms
計算値と収束値の差 =-1.0000000827403709991e-10
てな感じで飽和したかのような症状はでなかった。n = 10 億までの表示だがその下では徐々に数字が左側にも出てくるわけさ~。
なるほどね、こういう手法があるのだなあ。先人は賢いだわ。
doubleの有効数字は15桁ぐらいである。収束値の15桁までと結果の数字の15桁までをみると小数点以下9桁までは一致だ。数学の屁理屈では無限大での収束だから100億は無限大ではないからねえ・・・・・ これは10兆まで計算してみるかい。
それは夜に仕込んで一晩かけて・・・・ どや。知らんけど。
小数点以下15桁まで一致するには n はいくらになるでしょうか? うむ。
ま~無限大というのはな、数ではないのだよ。知ってら~。えーと、ここでの n, n_maxは intではなくて long long int ですよってに。蛇足ながら。
DELL OPTIPLEX 7010SFF Win 11 23H2(非推奨PC) Core-i5 3代目 3.2GHz。
4コア4スレッド for文はOpenMPで並列化に適しているらしいから試す。時間が半分以下になったらラッキーですわ。
posted by toinohni at 05:58| 東京 ☀|
Comment(0)
|
ソフト系雑学
|
|