Go to the first, previous, next, last section, table of contents.


プログラミング 練習問題 9 解答「ディガンマ関数」

第一段階は z を 5 より大きく「調整」することです。 単純な "for" ループがここで役立つでしょう。 もし z が 5 より小さかったら、 ψ(z) = ψ(z+1) - 1/z を使って問題を軽減します。 ψ(z+1) を再帰的に計算していって、戻るとき忘れずに -1/z の要素を足し戻します。 これを z > 5 となるまで繰返します。

(この定義は長いので、最後にまとめたものを付けておきます。 学習者はそれを M-# m で読込むことができます。 マクロ中で本体を Z ` Z ' で囲んで入力している限り、 Calc はそのキーストロークを実行せず単に学習するだけなのですが、 ここでは説明のため Calc があたかも実行したかのように図示します。)

1:  1.             1:  1.
    .                  .

 1.0 RET       C-x ( Z `  s 1  0 t 2

ここで変数1 は z を、変数2 は「調整補正値」を保持します。 z < 5 ならば、ループで z を増加させます。

(ところで、整数の 1 ではなく `1.0' から開始しました。 さもないと以下の計算は厳密な分数計算になってしまい、収束しなくなるからです。 何故なら、分数の比較は厳密に等しい場合のみイコールで、 「精度内で等しい」といった事が検出できないのです。)

3:  1.      2:  1.       1:  6.
2:  1.      1:  1            .
1:  5           .
    .

  RET 5        a <    Z [  5 Z (  & s + 2  1 s + 1  1 Z ) r 1  Z ]

さあ、合計の最初の部分を計算します。 ln(z) - 1/2z - 「調整補正値」 です。

2:  1.79175946923      2:  1.7084261359      1:  -0.57490719743
1:  0.0833333333333    1:  2.28333333333         .
    .                      .

    L  r 1 2 * &           -  r 2                -

今度は級数を計算します。 2 n を数え上げるのに別の "for" ループを使います。 (Calc は合計を計算するコマンド a + をちゃんと持っているのですが、 ループの修行を積みましょう。)

3:  -0.5749       3:  -0.5749        4:  -0.5749      2:  -0.5749
2:  2             2:  1:6            3:  1:6          1:  2.3148e-3
1:  40            1:  2              2:  2                .
    .                 .              1:  36.
                                         .

   2 RET 40        Z ( RET k b TAB     RET r 1 TAB ^      * /

3:  -0.5749       3:  -0.5772      2:  -0.5772     1:  -0.577215664892
2:  -0.5749       2:  -0.5772      1:  0               .
1:  2.3148e-3     1:  -0.5749          .
    .                 .

  TAB RET M-TAB       - RET M-TAB      a =     Z /    2  Z )  Z ' C-x )
         (ESC TAB)         (ESC TAB)

これが - γ の値で、丸め誤差を少し含んでいます。 12桁の精度で求めたかったら、さらに高い精度で計算しましょう。

2:  -0.577215664892      2:  -0.577215664892
1:  1.                   1:  -0.577215664901532

    1. RET                   p 16 RET X

キーストロークの全手順をここにまとめます。

C-x ( Z `  s 1  0 t 2
           RET 5 a <  Z [  5 Z (  & s + 2  1 s + 1  1 Z ) r 1  Z ]
           L r 1 2 * & - r 2 -
           2 RET 40  Z (  RET k b TAB RET r 1 TAB ^ * /
                          TAB RET M-TAB - RET M-TAB a = Z /
                  2  Z )
      Z '
C-x )


Go to the first, previous, next, last section, table of contents.     利用度数