我们首先理解解平方根的公式是怎么来的,以及不动点的几何含义,这有助于我们写出过程
首先我们要求平方根有公式:
y
=
x
y
2
=
x
y
=
x
y
也
就
是
以
下
变
化
式
:
y
=
>
x
/
y
x
就
是
我
们
的
被
开
方
数
,
我
们
把
他
换
成
a
,
把
换
成
x
变
量
x
=
>
a
/
x
y=\sqrt{x}\\ y^2 = x\\ y=\frac{x}{y}\\ 也就是以下变化式:\\ y=>x/y\\ x就是我们的被开方数,我们把他换成a,把换成x变量\\ x=>a/x\\
y=xy2=xy=yx也就是以下变化式:y=>x/yx就是我们的被开方数,我们把他换成a,把换成x变量x=>a/x
求不动点的几何意义其实就是求y=a/x和y=x两个函数的相交点,下图是当a=2时y=a/x的函数和y=x函数曲线图,可以看到两个函数的相交点刚好是1.414,也就是根2的值。
另外不动点还可以理解为求x=a/x方程的解,也就是方程x-a/x=0的根。如果我们设g(x)=x-a/x,也就是求g(x)=0时的x值,几何意义就是函数g(x)与x轴的焦点,下图为g(x)的曲线。
同样的立方根和四次方根的变换式,我们就能得到
x
=
>
a
/
x
2
x
=
>
a
/
x
3
x=>a/x^2\\ x=>a/x^3\\
x=>a/x2x=>a/x3
我们用同样的方式看他们两个的函数图形,与y=x的相交点是1.26和1.189,是2的立方根和四次方根。
但是为什么我们不能直接用这个变换找到不动点呢?因为这个迭代是不收敛的,也就是说,收敛是集合的概念,也就是下面的数列不收敛的。
{
f
(
x
)
,
f
(
f
(
x
)
)
,
f
(
f
(
f
(
x
)
)
)
,
f
(
f
(
f
(
f
(
x
)
)
)
)
,
f
(
f
(
f
(
f
(
f
(
x
)
)
)
)
)
,
.
.
.
.
.
.
.
}
我
们
用
x
i
简
化
数
列
{
f
(
x
1
)
,
f
(
x
2
)
,
f
(
x
3
)
,
f
(
x
4
)
,
f
(
x
5
)
,
f
(
x
6
)
,
.
.
.
.
.
.
.
,
f
(
x
n
)
}
我
们
只
要
证
明
∣
f
(
x
1
)
−
f
(
x
2
)
∣
<
∣
f
(
x
2
)
−
f
(
x
3
)
∣
∣
f
(
x
2
)
−
f
(
x
3
)
∣
<
∣
f
(
x
3
)
−
f
(
x
4
)
∣
∣
f
(
x
3
)
−
f
(
x
4
)
∣
<
∣
f
(
x
4
)
−
f
(
x
5
)
∣
.
.
.
.
∣
f
(
x
n
−
1
)
−
f
(
x
n
)
∣
<
∣
f
(
x
n
)
−
f
(
x
n
+
1
)
∣
就
能
证
明
数
列
是
收
敛
的
,
但
是
f
(
x
)
=
a
/
x
的
这
个
函
数
∣
f
(
x
n
−
1
)
−
f
(
x
n
)
∣
=
∣
f
(
x
n
)
−
f
(
x
n
+
1
)
∣
因
此
它
是
不
收
敛
的
,
也
就
是
发
散
的
。
\{f(x),f(f(x)),f(f(f(x))),f(f(f(f(x)))),f(f(f(f(f(x))))),.......\}\\ 我们用x_i简化数列\\ \{f(x_1),f(x_2),f(x_3),f(x_4),f(x_5),f(x_6),.......,f(x_n)\}\\ 我们只要证明\\ |f(x_1)-f(x_2)|<|f(x_2)-f(x_3)|\\ |f(x_2)-f(x_3)|<|f(x_3)-f(x_4)|\\ |f(x_3)-f(x_4)|<|f(x_4)-f(x_5)|\\ ....\\ |f(x_{n-1})-f(x_{n})|<|f(x_n)-f(x_{n+1})|\\ 就能证明数列是收敛的,但是f(x)=a/x的这个函数\\ |f(x_{n-1})-f(x_{n})|=|f(x_n)-f(x_{n+1})|\\ 因此它是不收敛的,也就是发散的。
{f(x),f(f(x)),f(f(f(x))),f(f(f(f(x)))),f(f(f(f(f(x))))),.......}我们用xi简化数列{f(x1),f(x2),f(x3),f(x4),f(x5),f(x6),.......,f(xn)}我们只要证明∣f(x1)−f(x2)∣<∣f(x2)−f(x3)∣∣f(x2)−f(x3)∣<∣f(x3)−f(x4)∣∣f(x3)−f(x4)∣<∣f(x4)−f(x5)∣....∣f(xn−1)−f(xn)∣<∣f(xn)−f(xn+1)∣就能证明数列是收敛的,但是f(x)=a/x的这个函数∣f(xn−1)−f(xn)∣=∣f(xn)−f(xn+1)∣因此它是不收敛的,也就是发散的。
现在我们按照题目整理过程
#lang racket
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) 0.00001))
(define (convergence? v0 v1 v2)
(>= (/ (abs (- v1 v2)) (abs (- v0 v1))) 0.999999))
(define (try guess)
(let ((next (f guess)))
(if (or (close-enough? guess next) (convergence? guess next (f next)))
(convergence? guess next (f next))
(try next ))))
(try first-guess))
(define (compose f g)
(lambda (x)
(f (g x))))
(define (repeated f n)
(if (= n 1)
f
(compose f (repeated f (- n 1)))))
(define (average x y) (/ (+ x y) 2))
(define (average-damp f)
(lambda (x) (average x (f x))))
(define (average-damp-n-times f n)
((repeated average-damp n) f))
(define (expt x n)
(if (= n 1) x
((repeated (lambda(y) (* y x)) (- n 1)) x)))
(define (n-th-root x n damp-n)
(fixed-point (average-damp-n-times
(lambda (y) (/ x (expt y (- n 1))))
damp-n) 1.0))
(define (find-damp-n x n)
(define (iter m)
(if (n-th-root x n m)
(iter (+ m 1))
(begin
(display n)
(display "-th-root,need ")
(display m)
(display " times average damp")
m )))
(iter 1))
(find-damp-n 2 4)
(find-damp-n 2 5)
(find-damp-n 2 6)
(find-damp-n 2 7)
(find-damp-n 2 8)
(find-damp-n 2 9)
(find-damp-n 2 10)
(find-damp-n 2 11)
运行结果
4-th-root,need 2 times average damp2
5-th-root,need 2 times average damp2
6-th-root,need 2 times average damp2
7-th-root,need 2 times average damp2
8-th-root,need 3 times average damp3
9-th-root,need 3 times average damp3
10-th-root,need 3 times average damp3
11-th-root,need 3 times average damp3
根据结果可以推测,应该是需要log(n)次平均阻尼才能收敛
4次方根,需进行2次平均阻尼才能收敛
5次方根,需进行2次平均阻尼才能收敛
6次方根,需进行2次平均阻尼才能收敛
7次方根,需进行2次平均阻尼才能收敛
8次方根,需进行3次平均阻尼才能收敛
9次方根,需进行3次平均阻尼才能收敛
10次方根,需进行3次平均阻尼才能收敛
11次方根,需进行3次平均阻尼才能收敛