SICP ex1-30 ex1-31

来源:互联网 发布:python 退火算法 编辑:程序博客网 时间:2024/05/29 04:48

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本章前面一个例子

虽然我们没有利用原题的思想,但是我们顺利发现原题思想漏洞,并成功解决问题

另外关于如何选取合适的方法还是等哪天有心情了再来想想吧= =

0 0
原创粉丝点击