如何在Racket中实现持续分数的对数?

时间:2017-11-26 01:24:16

标签: racket

log-approx输入整数n和近似日志,使得值返回来自计算序列的前n个项。示例输出为((log-approx 100) 0.75),返回接近-1.38629的数字。

我的想法是使用连续分数近似日志。但是我的代码没有返回所需的输出。

到目前为止我的代码。

(define (cont-frac n x k)
  (define (iter result count)
    (if (= count 0) result
        (iter (/ (n count) (+ ( x count) result))
              (- count 1))))
  (iter 0 k))

(define (log-approx n)
  (cont-frac (lambda (i) -1.0)
             (lambda (i) n)
             100))

这就是我得到的:(log-approx 0.75) ; outputs 1.56467792561282 但它应该是-1.38629。

编辑:我忘了提及该系列的公式。 -log(1 - x)可以近似为术语(x^k)/k的总和,k从1到n运行,近似值随着n的增加而提高。

1 个答案:

答案 0 :(得分:0)

您应该编写cont-frac过程以匹配给定的公式(为什么lambda s?它们只返回常量值!)。还要注意由连续分数计算的结果:它-log(1 - x),所以我们必须调整log-approx。这应该有效:

(define (cont-frac n k)
  (define (iter k acc)
    (if (zero? k)
        acc
        (iter (sub1 k) (+ (/ (expt n k) k) acc))))
  (iter k 0))

(define (log-approx n)
  (- (cont-frac (- 1 n) 100)))

例如:

(log 0.75)
=> -0.2876820724517809
(log-approx 0.75)
=> -0.2876820724517809