编码衍射模型 LM 子问题的预条件(截断)共轭梯度算法
考虑LM 方程对应的无约束二次优化问题:
利用预条件共轭梯度法进行近似求解。 为了记号的方便,在下文我们用 表示问题的自变量,
表示共轭梯度法中的残差变量。预条件共轭梯度法在共轭梯度法的基础上,引入
。 因此,对于问题
采用预条件共轭梯度法等于使用共轭梯度法求解如下问题
预条件共轭梯度法的迭代格式为(其中记 )
目录
初始化和迭代准备
输入信息:当前迭代点 ,采样信号矩阵
,观测模长
,最大迭代次数 ite_max 和判断精度的标志 acu 。 输出信息:返回LM 方程的解
(记为 solu )和包含迭代信息的结构体 info, info.ite 记录迭代次数, info.prod 记录矩阵向量积的次数。
function [solu, info] = CG_CDP( z, A, y, ite_max, acu )
[n,L]=size(A); l=norm(z)^2; m=n*L;
计算信号 的在衍射变换下的结果:
。 注意到 MATLAB 函数 fft 对于矩阵输入,对其每一列计算一维的离散傅里叶变换。
rsd=fft(conj(A).*(z*ones(1,L)));
计算 。注意到对于编码衍射模型,
。
,
,
作为预条件中的两个参数。
mu=sqrt(sum(sum((abs(rsd).^2-y).^2))/2/m); a=1/(l+mu); b=-3/(2*(l+mu)*(4*l+mu));
由 Wirtinger 导数,有
计算矩阵 t,其 元素为
t=(abs(rsd).^2-y).*rsd;
计算梯度 。
g=mean(A.*ifft(t),2);
初始化。这里使用预优矩阵,计算$Mx^0=g^0$,其中 。
xk=a*g+b*(2*real(z'*g))*z;
,这里的推导和下文迭代主循环中一致,省略。
t1=abs(rsd).^2.*fft(conj(A).*(xk*ones(1,L))); t2=n*rsd.^2.*ifft(A.*(conj(xk)*ones(1,L))); s1=mean(A.*ifft(t1),2); s2=mean(A.*ifft(t2),2); s=s1+s2+mu*xk;
残差的初始化:$r^0=g^0-(\Phi(x^0)+\mu I)x^0$。
rk=g-s;
在 acu 为1的情况下采用更精确的 LM 方法,取 ; 否则,采取
。
if acu == 1 cri = min(0.1,min(0.1*norm(g),norm(g)^2)); else cri = min(0.1,0.1*norm(g)); end
迭代次数记为 0。以 为收敛判断依据。
K=0; C=norm(rk);
迭代循环
当 小于阈值或者迭代次数超过限制时,停止迭代。
while K<ite_max && C>cri
从预条件方程中解得 ,有
。这里我们取
, 可以推出
。注意到这里的
不是迭代变量,而是迭代的初始值。
zk=a*rk+b*(2*real(z'*rk))*z; K=K+1;
初次迭代,取 ,
。
if K==1 pk=zk; rho=2*real(rk'*zk); else
令 ,
。
rho1=rho;
rho=2*real(rk'*zk);
beta=rho/rho1;
pk=zk+beta*pk;
end
t1=abs(rsd).^2.*fft(conj(A).*(pk*ones(1,L))); s1=mean(A.*ifft(t1),2); t2=n*rsd.^2.*ifft(A.*(conj(pk)*ones(1,L))); s2=mean(A.*ifft(t2),2);
计算高斯-牛顿矩阵
考虑到共轭,我们只取上半部分,令 ,
,则有
。
预条件共轭梯度法的步长 。
s=s1+s2+mu*pk; alpha=rho/(2*real(pk'*s));
共轭梯度法的迭代步, ,
。
xk=xk+alpha*pk; rk=rk-alpha*s; % 以 $r^k$ 的模长作为停机判断依据。 C=norm(rk); end
退出迭代时,记录当前迭代步、矩阵向量积次数。返回 为解。
info.ite=K; info.prod=6+4*info.ite; solu=xk;
end
参考页面
此页面被 编码衍射模型的 LM 算法 调用。
此页面的源代码请见: CG_CDP.m。
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
著作权所有 (C) 2020 文再文、刘浩洋、户将