如何获得余弦乘积近似值才能在球拍中使用?

时间:2019-04-01 00:35:54

标签: racket

对于作业,我必须编写一个函数,该函数表示余弦函数的乘积近似值,该函数将递归直到当前乘积和新计算乘积之间的差小于阈值。

(define (p_cos x)
(let* ([n 1]
       [xnew (* x (p_cos_aux x (+ n 1)))])
         (if (< (abs (- x xnew)) TOL)
             x
             (p_cos_aux xnew (+ n 1)))))

(define (p_cos_aux x n)
  (- 1 (/ (* 4 (square x)) (* (square pi) (square (- (* 2 n) 1))))))

该值应为:

(p_cos 0)
=> 1
(p_cos (/ pi 2))
=> 0

但是我得到了:

> (p_cos (/ pi 2))
0.9122085048010974
> (p_cos 0)
0

任何人都可以向我解释为什么我的输出与预期值相差甚远吗?

我将基于无穷乘积公式的余弦近似值作为代码基础:

  

cos( x )= ∏ n = 1 n →∞ [1-(4 x 2 )/(π 2 (2 n -1) 2 )]

1 个答案:

答案 0 :(得分:0)

由于您基于此数学公式,因此:

  

cos( x )= ∏ n = 1 n →∞ [1-(4 x 2 )/(π 2 (2 n -1) 2 )]

您的p_cos_aux函数似乎正在处理公式中方括号内的内容。因此,您仍然需要将余弦定义为等于

cos( x )= ∏ n = 1 n →∞ (p_cos_aux x n)

如果您想让代码返回答案,则应该只对有限数量的n执行此操作。您可以使用递归或for循环执行此操作。在这种情况下,Racket的for/product循环很方便:

(for/product ([n (in-range 1 ...some-large-number...)])
  (p_cos_aux x n))

让我们尝试为大量输入100:

(define (p_cos x)
  (for/product ([n (in-range 1 100)])
    (p_cos_aux x n)))

尝试一下:

> (p_cos 0)
1
> (p_cos (* 1/4 pi))
0.707553324600212
> (p_cos (* 1/2 pi))
0.0
> (p_cos (* 3/4 pi))
-0.7111358730792002
> (p_cos pi)
-1.01015228426396
> (p_cos (* 5/4 pi))
-0.7183556654338034
> (p_cos (* 3/2 pi))
-0.0
> (p_cos (* 7/4 pi))
0.7293234913165205
> (p_cos (* 2 pi))
1.0412338930105425

这并不完美,但是您可以通过将100增加到更大的数字来获得更好的近似值。