编码衍射模型的 LM 算法
考虑非线性最小二乘问题:
其中 为非线性映射。
LM 方法本质上是一种信赖域型的方法。在信赖域方法中,每一步求下面的子问题
其中 为 处的雅可比矩阵。 LM 方法通过引入正则化将信赖域半径的约束罚到目标函数中,求解如下LM 方程
对于编码衍射模型中,我们有
其中 为真实信号。
目录
初始化和迭代准备
输入信息:迭代初始点 ,观测模长 ,采样信号 ,原始数据 和停机准则 stop_cri 。 输出信息: 迭代得到的解 (其为真实信号 的恢复),包含迭代信息的结构体 info 。
- info.eff:每一步迭代的相对误差
- info.time:每一步迭代的 cpu 时间
- info.prod:矩阵向量积的次数
- info.ite:总迭代次数
- info.state:标记是否收敛
function [ z, info ] = LM_C( z0, y, A, x, acu, stop_cri )
参数设定,最大迭代次数 50(25) 次,并计时。
利用截断共轭梯度法求解LM方程,设定截断共轭梯度法的最大迭代次数。
T=cputime; ite_max=50; if acu==1 ite_max=25; end if acu==1 CG_ite_max=50; else CG_ite_max=5; end
初始化,迭代次数置零,以 为迭代初始点。
ite=0; z=z0;
将向量化的采集信号 转化为 的矩阵。
[n,L]=size(A); m=n*L; y=reshape(y,n,L);
相对误差 :
其中 为 与 之间的夹角。当 时,该相对误差为 。
relerr=norm(x-exp(-1i*angle(trace(x'*z)))*z,'fro')/norm(x,'fro');
初始化输出信息, info.err 记录当前迭代步对应的相对误差, info.time 记录每一迭代步的 cpu 时间, info.prod 表示矩阵和向量乘积的次数。
info.err=relerr; info.time=[0]; info.prod=[0]; prod=0;
迭代主体
达到收敛条件:相对误差 小于阈值 stop_cri ,或者迭代次数超过最大迭代次数 ite_max 限制,停止迭代。
while relerr>stop_cri && ite<ite_max
利用共轭梯度法进行近似求解得到 。进行一步迭代 。
[solu,in]=CG_CDP(z,A,y,CG_ite_max,acu); z=z-solu(1:n);
迭代步数加一,更新迭代信息,记录当前步的相对误差、cpu 时间、矩阵向量积次数。
ite=ite+1; relerr=norm(x-exp(-1i*angle(trace(x'*z)))*z,'fro')/norm(x,'fro'); info.err=[info.err,relerr]; info.time=[info.time,cputime-T]; prod=prod+in.prod; info.prod=[info.prod,prod]; end
当迭代退出时,记录总迭代步。并以 info.state 记录退出原因(是否达到收敛而退出迭代)。
info.ite=ite; if ite==ite_max info.state=0; else info.state=1; end
end
参考页面
我们在页面 实例:编码衍射模型 中展示该算法的一个应用,并将其与其它算法进行比较。算法使用预条件共轭梯度法求解LM方程, 参考 编码衍射模型 LM 子问题的预条件共轭梯度算法。
此页面的源代码请见: LM_C.m。
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
著作权所有 (C) 2020 文再文、刘浩洋、户将