1.36
练习 1.36 请修改 fixed-point,使它能打印出计算中产生的近似值序列,用练习 1.22 展示的 newline 和 display 基本过程。而后通过找出的不动点的方式,确定的一个根(请利用 Scheme 的基本过程 log,它计算自然对数值)。请比较一下采用平均阻尼和不用平均阻尼的计算步数。(注意,你不能用猜测 1 去启动 fixed-point,因为这将导致除以 log(1)=0。)
令 ,要找出不动点,可以通过从某个初始猜测出发,反复地应用 f:
f(x), f(f(x)), f(f(f(x))), ...
直到值的变化不大时,就可以找到它的一个不动点。
不使用平均阻尼技术
(define tolerance 0.00001)
(define (fixed-point f x)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (iteration f x count)
(display count)
(display " guess x = ")
(display x)
(newline)
(if (close-enough? x (f x))
x
(iteration f (f x) (+ count 1))))
(iteration f x 0))
(fixed-point (lambda (x) (/ (log 1000) (log x))) 100)
0 guess x = 100
1 guess x = 1.4999999999999998
2 guess x = 17.036620761802723
3 guess x = 2.4362841528268704
4 guess x = 7.757391404878408
5 guess x = 3.3718636013068974
6 guess x = 5.683217478018266
7 guess x = 3.97564638093712
8 guess x = 5.004940305230897
9 guess x = 4.2893976408423535
10 guess x = 4.743860707684508
11 guess x = 4.437003894526853
12 guess x = 4.6361416205906485
13 guess x = 4.503444951269147
14 guess x = 4.590350549476868
15 guess x = 4.532777517802648
16 guess x = 4.570631779772813
17 guess x = 4.545618222336422
18 guess x = 4.562092653795064
19 guess x = 4.551218723744055
20 guess x = 4.558385805707352
21 guess x = 4.553657479516671
22 guess x = 4.55677495241968
23 guess x = 4.554718702465183
24 guess x = 4.556074615314888
25 guess x = 4.555180352768613
26 guess x = 4.555770074687025
27 guess x = 4.555381152108018
28 guess x = 4.555637634081652
29 guess x = 4.555468486740348
30 guess x = 4.555580035270157
31 guess x = 4.555506470667713
32 guess x = 4.555554984963888
33 guess x = 4.5555229906097905
34 guess x = 4.555544090254035
35 guess x = 4.555530175417048
4.555530175417048
1 guess x = 1.4999999999999998
2 guess x = 17.036620761802723
3 guess x = 2.4362841528268704
4 guess x = 7.757391404878408
5 guess x = 3.3718636013068974
6 guess x = 5.683217478018266
7 guess x = 3.97564638093712
8 guess x = 5.004940305230897
9 guess x = 4.2893976408423535
10 guess x = 4.743860707684508
11 guess x = 4.437003894526853
12 guess x = 4.6361416205906485
13 guess x = 4.503444951269147
14 guess x = 4.590350549476868
15 guess x = 4.532777517802648
16 guess x = 4.570631779772813
17 guess x = 4.545618222336422
18 guess x = 4.562092653795064
19 guess x = 4.551218723744055
20 guess x = 4.558385805707352
21 guess x = 4.553657479516671
22 guess x = 4.55677495241968
23 guess x = 4.554718702465183
24 guess x = 4.556074615314888
25 guess x = 4.555180352768613
26 guess x = 4.555770074687025
27 guess x = 4.555381152108018
28 guess x = 4.555637634081652
29 guess x = 4.555468486740348
30 guess x = 4.555580035270157
31 guess x = 4.555506470667713
32 guess x = 4.555554984963888
33 guess x = 4.5555229906097905
34 guess x = 4.555544090254035
35 guess x = 4.555530175417048
4.555530175417048
使用平均阻尼技术
(define tolerance 0.00001)
(define (fixed-point f x)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (iteration f x count)
(display count)
(display " guess x = ")
(display x)
(newline)
(if (close-enough? x (f x))
x
(iteration f (f x) (+ count 1))))
(iteration f x 0))
(fixed-point (lambda (x) (/ (+ x (/ (log 1000) (log x))) 2)) 100)
0 guess x = 100
1 guess x = 50.75
2 guess x = 26.254540457118523
3 guess x = 14.184200419676754
4 guess x = 8.394404144501411
5 guess x = 5.820596485719324
6 guess x = 4.871165879985272
7 guess x = 4.6169793776123935
8 guess x = 4.566308737263073
9 guess x = 4.557379626448907
10 guess x = 4.555849935202987
11 guess x = 4.555589214071988
12 guess x = 4.555544815820955
4.555544815820955
1 guess x = 50.75
2 guess x = 26.254540457118523
3 guess x = 14.184200419676754
4 guess x = 8.394404144501411
5 guess x = 5.820596485719324
6 guess x = 4.871165879985272
7 guess x = 4.6169793776123935
8 guess x = 4.566308737263073
9 guess x = 4.557379626448907
10 guess x = 4.555849935202987
11 guess x = 4.555589214071988
12 guess x = 4.555544815820955
4.555544815820955
结论
可以看出,使用了平均阻尼技术之后,计算步数比不使用平均阻尼技术的计算步数少了三分之二左右!