验证newton二项式在指数为分数时的正确性
设形式为(1+0.1)^a,下面将讨论a为2/3和8/3时,直接计算法(采用以前用e做中间计算过程的方法)和newton直接展开,两者结果的比较;
下面写程序来证明:
(setq a 2 )
(setq b (/ 1.0 3))
(setq c 0.1)
(defun pow (num count)
(if (or (> count 1) (eq count 1) )
(* num
(pow num
(- count 1) ) )
1))
(defun slayer ( count)
(if (or (> count 1) (eq count 1) )
(* count
(slayer
(- count 1) ) )
1))
(defun slayerex (num count)
(if (or (> count 1) (eq count 1) )
(* num
(slayerex
(- num 1)
(- count 1) ) )
1))
(defun newton (n value)
(if (eq n 0)
1.0
(+ (newton (1- n)
value)
(/ (* 1.0
(pow value
n)
(slayerex (* a
b)
n))
(slayer n)))))
(defun expr (n value)
(if (eq n 0)
1.0
(+ (expr (1- n)
value)
(/ (* 1.0
(pow value
n))
(slayer n)))))
(defun formula (n value)
(expr n
(* (log (pow value
a))
b)))
(defun test (n)
(if (> n 0)
(progn
(print (newton n c))
(print 'compare)
(print (formula n (+ c 1)))
(test (- n 1)))
(print 'over)))
(test 10)
之所以能够这样做,是因为newton二项式中的指数分子值的变化没有n!形式的快,也就是说最终还是收敛的。
[35]> (test 10)
1.0656023
COMPARE
1.0656023
1.0656023
COMPARE
1.0656023
1.0656023
COMPARE
1.0656023
1.0656023
COMPARE
1.0656023
1.0656023
COMPARE
1.0656023
1.0656023
COMPARE
1.0656023
1.0656021
COMPARE
1.0656023
下面将a的值变为8实验下:
(setq a 8)
(test 10)
[37]> (test 10)
1.2893788
COMPARE
1.2893788
1.2893788
COMPARE
1.2893788
1.2893788
COMPARE
1.2893788
1.2893788
COMPARE
1.2893788
1.2893788
COMPARE
1.2893788
1.2893788
COMPARE
1.2893784
1.2893786
COMPARE
1.2893696
将C的值变为0.9有:
(setq c 0.9)
(test 10)
[44]> (test 10)
5.537819
COMPARE
5.537861
5.537963
COMPARE
5.5378013
5.53771
COMPARE
5.5374537
5.538184
COMPARE
5.535627
5.5372124
COMPARE
5.527088
5.53948
COMPARE
5.4921665
5.533
COMPARE
5.369749
如果将c变为0.99,a变为32,需要用(test 20)才能得到如下结果:
[53]> (test 20)
1540.871
COMPARE
1540.8262
1540.871
COMPARE
1540.7415
1540.871
COMPARE
1540.5106
1540.871
COMPARE
1539.9132
1540.871
COMPARE
1538.4481
1540.871
COMPARE