ex1-30
本题要求比较brute-force method 以及 golden method 计算单峰函数 的极大值所需要的函数值计算次数
我们先计算brute-force method
时间为2log2 (L/T) 其中L为初始区间长,T为容错区间长
我们再计算golden method
时间为log 1/(1- (golden-ratio)^2) (L/T)
化简后我们得到
2log (5^(1/2) +1)(L/T)
我们可以发现golden method 快于 brute-force
ex1-31
利用f(x) f(f(x))...的思路寻找fixed-point
(define (fixed-point f guess-value) (let ((distance (abs (- guess-value (f guess-value))))) (if (< distance 0.01) guess-value (fixed-point f (f guess-value)))))
比较简单,只是,这里有个问题,例如我取f(x)=x*x,我取guess-value为10 那么这个差值将会越来越大,显然是不合理的
那么我们尝试一下如果下一个distance比该distance更大那么我们将参数减半
(define (fixed-point f guess-value) (let ((fx (f guess-value))) (let ((distance (abs (- guess-value fx))) (next-distance (abs (- fx (f fx))))) (if (< distance 0.01) guess-value (if (< distance next-distance) (fixed-point f fx) (fixed-point f (/ guess-value 2)))))))
看起来思路还可以,我们用x^2这个函数进行验证,我们用5来验证,
5^2=25
25^2=625
取2.5进行下一步
2.5^2=6.25
6.25^=..
取1.25
取.625
停到这里我们不计算了
两种可能都是离1越来越远
所以我们的答案是错的!
看来要选取一个合适的方式挺麻烦的.
这条路走不通我们换种思考方式,我们可以看到distance=f(x)-x 那么我们构造一个新的函数g(x)=f(x)-x
这样我们只要求0点就可以了(取guess两侧一个足够大的范围构造ab),0点求法参考textbook本章前面一个例子
虽然我们没有利用原题的思想,但是我们顺利发现原题思想漏洞,并成功解决问题
另外关于如何选取合适的方法还是等哪天有心情了再来想想吧= =