今天繼續看numerical optimization這本書,在看第六章,實用牛頓法。
6.1 提到「不準確」的牛頓法。意思是每次確定迭代方向都要解方程,很慢,實際上也不一定要解出非常精確的迭代方向。於是嘗試用一些迭代解法(例如,共軛梯度法)去解 h*x + g = 0這個方程。
6.2 提到通過共軛梯度法解 ax = b 找搜尋方向p = x的具體做法。
一旦發現乙個點x有 x^t * a * x <= 0此時a非正定,若當前為第一次迭代,以此迭代方向更新牛頓法,否則,以上一次迭代方向更新。前一種情況實際等價於最速下降法。
初始位置x0可以設定為0,也可以設定為上一幀的搜尋方向。兩種方法差不多。
此法不需要顯式的h(共軛梯度法每次更新迭代方向需要的都只是h*某個向量),只需要h * p。因此節省了計算h的時間。
具體的修改方法有:修改cholesky分解,gershgorin修改,對稱不定矩陣修改。具體的演算法以後研究。
當前想解決的問題是,完全證實之前迭代失敗是由於收斂到區域性極值。
想到的具體做法是,對於之前的例子,把有方向和無方向引數的迭代結果分別記錄下來,以後在有方向引數的情形下,看看在無方向的解附近,牛頓迭代是否能夠收斂。
經過試驗,確定牛頓法確實收斂到區域性極值。具體做法是,在有方向引數的迭代過程中,載入無方向引數最終的迭代結果,看迭代是否收斂到無方向的結果。
有方向的收斂函式值為231.68。
載入無方向結果後,收斂函式值為111.98,與無方向引數的模擬方法收斂值一樣。
說明在有方向引數的情況下,231.68並不是全域性最小值。
出現收斂到區域性極值的原因為變數太多。下一步嘗試不再求解內部點的位置(用外部點的權重表示),或把內部點的位置按靜態平衡條件解算,不考慮加速度。
需要改進牛頓法的一維搜尋
發現乙個問題,一旦牛頓法的一維搜尋失敗,函式不降反公升。需要修改 從避免被吸引到hessian非正定的區域性極值點。同時發現昨天做的模型模擬的時候有限差商導數步長設太小了,提高導數步長之後 設成0.05 牛頓法收斂速度明顯加快 往往第一次迭代把梯度長度從幾十萬降到1k左右,第二次迭代進一步降到幾十,...
牛頓法與二分法的比較 matlab實現
剛學完牛頓迭代法,為了驗證收斂的速率,用matlab做了比較 首先是牛頓迭代法 比較牛頓迭代法 function x,i newtonmethod x0,f,ep,nmax x0 初值,f 測試函式,ep 精度,nmax 迭代的最大次數 i 1 x 1 x0 while i nmax g1,g2 f...
我看google與sohu的輸入法之爭
可能正值csdn剛剛聚會完畢,竟然沒看到有關google拼音輸入法使用sohu詞庫的報道.我用的不是拼音輸入法,所以,對於事實本身也沒有再去核實,但從google的官方宣告來看,似乎確有其事.而現在,sohu到底要如何對待已經道了歉的google尚不可知,但以常理論,人家道了歉,換了詞庫,也算是給足...