題目:不動點迭代(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