SICP ex1-30 ex1-31

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

雖然我們沒有利用原題的思想,但是我們順利發現原題思想漏洞,併成功解決問題

另外關於如何選取合適的方法還是等哪天有心情了再來想想吧= =

發佈了35 篇原創文章 · 獲贊 1 · 訪問量 8307
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章