不動點迭代(Fixed Point Iteration)

題目:不動點迭代(Fixed Point Iteration)

        本篇介紹不動點迭代(Fixed Point Iteration)。之所以學習不動點迭代是由於近來看到了FPC算法,即Fixed Point Continuation,有關FPC後面再詳述。

        從搜索到的資料來看,不動點迭代是一個很基本很常見的概念,具體出自哪一門基礎課不詳,反正之前我沒聽說過。

        不動點迭代可以求解方程f(x)=0在區間[a,b]內的根。

1、不動點(FixedPoint)

        首先來看一下什麼是不動點【1】:

        換句話說,函數φ的不動點是y=φ(x)與y=x的交點,下圖畫出了函數y=cos(x)與y=x在區間[0,π/2]的交點,即cos(x)的不動點【2】:

2、不動點迭代(Fixed Point Iteration)

        不動點迭代又稱爲簡單迭代(simple iteration)。下面來看一下不動點迭代【3】:

也就是說,爲了求解方程f(x)=0,首先將方程轉換爲x=g(x),然後初始化x0,循環迭代xi+1=g(xi),直到滿足收斂收件。

        這裏將方程f(x)=0轉換爲x=g(x)是很容易的,比如對於f(x)=x-cos(x),求解f(x)=0即爲求解x-cos(x)=0,即x=cos(x),因此g(x)=cos(x);再例如對於方程【4】

可以等價爲

還可以等價爲

也就是說,將方程f(x)=0轉換爲x=g(x)有不同的方式,因此對方程f(x)=0來說,g(x)也不是唯一的。

3、不動點迭代的收斂性

        這個迭代過程是很簡單的,但這裏有個關鍵性的問題:迭代收斂麼?即經過N次迭代後是否會收斂於不動點?

3.1 例子

        先看兩個例子,這裏有兩個方程【5】:

可以通過其它方法得到方程E1和E2的根:

畫出E1和E2曲線:

 

3.2 不動點迭代MATLAB程序

        爲了運用不動點迭代求E1和E2的根,我編寫了如下MATLAB程序: 

function [y] = FixedPointIter(x0,func,tol,MaxIter)
% Version: 1.0 written by jbb0523 @2016-08-21
    if nargin < 4
        MaxIter = 100;
    end
	if nargin < 3
        tol = 1e-3;
    end
    xn = x0;
    fprintf('Iter  0: %16.14f\n',x0);
    xnp1 = func(xn);
    fprintf('Iter  1: %16.14f\n',xnp1);
    criterion = abs(xnp1-xn);
    xn = xnp1;
    Iter = 1;
    while(criterion>tol)
        xnp1 = func(xn);
        criterion = abs(xnp1-xn);
        xn = xnp1;
        Iter = Iter + 1;
        fprintf('Iter %2.0d: %16.14f\n',Iter,xnp1);
        if Iter>=MaxIter
            break;
        end
    end
    y = xnp1;
end

3.3 例子測試與分析

        分別在CommandWindow中執行以下兩條命令:

FixedPointIter(0,@E1,1e-12,10);

FixedPointIter(3,@E2,1e-12,10);

        注意,以上兩條命令分別調用了E1和E2函數:

function [y] = E1(x)
    y = 1+0.5*sin(x);
end

function [y] = E2(x)
    y = 3+2*sin(x);
end

可對E1和E2分別執行10次不動點迭代:

        從迭代過程來看,對E1執行不動點迭代後收斂了,而對E2執行不動點迭代後明顯發散了。

        那麼什麼時候不動點迭代收斂,而又什麼時候不動點迭代發散呢?

        注意起始點的設定,對於E1來講,其根約爲1.4987,迭代時初始化爲0(這個初始點與根比較遠),而最終收斂到了約1.4987,而對於E2來講,其根約爲3.0945,迭代時初始化爲3(這個初始點與根很接近),但最終發散了。

        因此,這不能怪起始點不照顧E2……

        觀察E1和E2曲線,我們大概可以得到一個直覺,E1在不動點處曲線較爲平坦,而E2在不動點處曲線較爲陡峭。

3.4 不動點迭代收斂定理

        下面給出有關不動點迭代收斂性的定理【4】:

通俗點講,若要使不動點迭代收斂,則要求φ(x)在區間[a,b]上的函數值也在此區間內,另外還要求φ(x)的斜率絕對值不大於1。其證明過程比較複雜,有興趣的可以查閱一些相關文獻。

        應用此定理,可以來解釋兩個例子中爲什麼E1收斂而E2發散【5】:

        我們可以通過下圖來直觀的感覺一下不動點迭代收斂的過程【2】:

對於左圖,斜率小於零,迭代路徑是一圈一圈的縮小;對於右圖,斜率大於零,迭代路徑是直接折線式逼近不動點。

        我們再通過下圖來直觀的感覺一下不動點迭代發散的過程【2】:

對於左圖,斜率小於零,迭代路徑是一圈一圈的變大;對於右圖,斜率大於零,迭代路徑是直接折線式遠離不動點。

        注意看上圖時與迭代過程相結合才能看明白,先給定x0,得到x1=φ(x0),再得到x2=φ(x1),依此類推……

4、結束語

        其實本來是在看SpaRSA(後面再說),裏面有個Continuation,然後就查到了FPC,一直很好奇FPC爲什麼要Fixed Point Continuation,雖然FPC文獻中一直提到Fixed Point Iteration和Fixed Point Equation,但也也沒注意,後來看到了【6】,裏面再一次提到了Fixed Point Iteration,難道Fixed Point Iteration是一個數學問題麼?於是纔開始百度……

        壓縮感知凸優化類重構算法這個坑太大,每一個算法的背後都有一堆剪不斷理還亂的數學問題……

        繼續前行吧,還是那句話:路會越走越寬的……

5、參考文獻

【1】百度文庫:4.2Fixed-Point Iteration

【2】http://www.imperial.ac.uk/:NumericalMethods: Fixed Point Iteration

【3】mat.iitm.ac.in/:FIXEDPOINT ITERATION METHOD

【4】百度文庫:6.2不動點迭代法及其收斂定理

【5】https://uiowa.edu/:FIXEDPOINT ITERATION

【6】http://www.maths.lth.se/na/courses/FMN081/FMN081-06/lecture6.pdf

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