一 不动点是什么?
不动点,其实定义比较简单,对于一些方程,例如f(x)=cosx,那么令cosx=x的点就是函数的不动点,说白了,就是y=x这条直线与函数曲线的交点。这个不动点有什么用呢?请继续往下看。
二 不动点迭代法的实现
不动点迭代法,是求方程的迭代方法。为什么要迭代的求,直接法不好吗?直接法显然比较好,但是存在弊端,比如函数形式较复杂时,求解器不容易直接求得。利用不动点的性质,可以将函数的求解问题转化为不动点方程,从而使用有限次迭代求得方程的解。
其实不动点迭代的代码相对简单而且易懂:
x0=3;
x=x0;
k=10;
ezplot(@(x,f)f-((x-1).^2+1)) %画出函数图像
%构造的不动点方程为:x=2-x,斜率不行,构造其他的本次是两边同时加x^2
axis([-5,5,-3,10]) %固定坐标轴
hold on
for i=1:k %迭代k次
x=(2-x0+1*x0^2)/(1*x0+1); %-2*x为梯度反方向,step为步长,!最速下降法!
f_current=(x-1)^2+1;
f_error=abs((x-1)^2-(x0-1)^2);
plot(x,f_current,'ro','markersize',7) %标记当前的位置
drawnow;pause(0.2);
x0=x;
if f_error<0.000001
break;
end
end
上述代码是利用FPI求解函数的极小值。我们知道,该函数的极值在驻点处,也就是一阶导数为0的地方,求导得。其实一眼就看出来的解,这里只是作为说明,以简单的例子说明一般问题。到这一步了,如何构造FPI呢?其实只需将x剥离出来,也就是:
但是FPI收敛的条件是:
因此,我们需要对迭代方程进行改造。我们在方程两侧加上一项x^2:
这样,得到的FPI即可满足要求。为什么加x^2?其实我也是偶然凑出来的。
三 不动点迭代法的作用
受FPI算法思想的影响,可以创造出一些有趣的算法,用于求类似的方程或方程组的解。
其实之前也不了解该方法,只是看书的时候遇见了一个IRLS-based Iteration shrinkage算法,里面用到了不动点迭代法的思想,加深理解。
书中的问题也是寻找方程组的驻点:
其实使用共轭梯度法或者直接法也能求出解,作为一种新的想法,Adeyemi and Davies将方程两侧均加入了cx,使用构造不动点方程:
将x归纳后,一部分移至一侧,加入迭代索引:
最终:
其中W是对角矩阵,因此其逆就等于是将W的对角元素取倒数即可。但是该方法有个痛点,也就是一旦W对角元素为0,那么它就永远为0了,算法可能就会陷入尴尬的境地。