对于作业,我必须编写一个函数,该函数表示余弦函数的乘积近似值,该函数将递归直到当前乘积和新计算乘积之间的差小于阈值。
(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 )]
答案 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
增加到更大的数字来获得更好的近似值。