另外一种算pi值的方法(加快收敛)
前面的方法计算30项只能精确到小数点后第3位数字,下面将它优化:
(x-1/2)^2+y^2=1/4
Go
y=(sqrt (1/4 - (x-1/2)^2 ) )
Go
y=(1/2* sqrt (1 - (2x-1)^2 ) )
当x取0,1/4时候,有如下关系成立:
这样有A=1*/2*1/2*pi/6 - 1/2*1/4*(sqrt 3)/4 (R=1/2)
pi=6* { A+ 1/2*1/4*(sqrt 3)/4}
A=1/4*{ x - 0.5/3*1!*{(x) }^3 +0.5*(0.5-1)/5*2!*{-(x/a) }^5 +0.5*(0.5-1)*(0.5-2)/7*3!*{-(x/a)^2}^7 } ... }
expr 为积分后的表达式。
(defun pow (n count)
(if (> count 0)
(* n
(pow n
(1- count)))
1))
(defun slayer (n count)
(if (> count 0)
(* n
(slayer (1- n)
(1- count)))
1))
(defun expr (n x)
(if (eq n 1)
x
(+ (expr (1- n) x)
(/
(* (pow -1 (1- n))
(pow x
(- (* 2 n)
1))
(slayer 0.5
(1- n)))
(* (- (* 2 n)
1)
(slayer (1- n)
(1- n)))))))
(defun wrap (value)
(+ value
(/ (sqrt 3)
32)))
(* 24
(wrap (- (* 0.25 (expr 30 (- 0.5 1 )))
(* 0.25 (expr 30 (- 0 1 ))))))
这里计算到30项结果并没有变化,只是换了方式。