查看: 137|回复: 0|关注: 0

[已答复] 共轭梯度算法为什么无法收敛

[复制链接]

新手

11 麦片

财富积分


050


6

主题

20

帖子

0

最佳答案
  • 关注者: 1
发表于 2019-11-7 21:23:19 | 显示全部楼层 |阅读模式
我在用FR共轭梯度算法来做“相位恢复”的迭代优化求解问题,函数与梯度的求解挺麻烦的,里面有傅里叶变换。不知道为什么无法收敛呢,感觉始终在原地打转。优化代码如下:


a=[1,1,1,1,1,1]';     %假设Zernike系数初始值
maxK=5000;   %最大迭代次数5000
rho=0.5;sigma=0.4;
K=0;  epsilon=1e-4;
n=length(a);
while(K<maxK)
   %计算光瞳函数和g21
   phase_set=a(1,1)*Z4+a(2,1)*Z5+a(3,1)*Z6+a(4,1)*Z7+a(5,1)*Z8+a(6,1)*Z9; %假设相位初始值
   p=exp(1i*(phase_set+phase_len));                      %光瞳函数
   Indx=find(isnan(p));                 %找出NAN位置
   p(Indx)=0;                           %p中的NAN设为0
   g21=G2(p,lamda,f,s,d1,d2,g1);         %焦后面光场

   % 计算梯度
   g2w=(abs(g2).*g21)./abs(g21)-g21;
   gpw=Ang_Spec(g2w,lamda,-(f+d2),s);
   gpw_conj=conj(gpw);
   g=grad_z(p,Z4,Z5,Z6,Z7,Z8,Z9,gpw_conj); %梯度
   E_old=err_or(g21,g2);
   itern=K-(n+1)*floor(K/(n+1));
   itern=itern+1;
  %计算搜索方向
   if(itern==1)  
        D=-g;  
       else
          beta=(g'*g)/(g0'*g0);        
           D=-g+beta*D0;  gD=g'*D;
            if(gD>=0.0)
               D=-g;  
            end
       end
    if(norm(g)<epsilon), break; end   %检验终止条件
    m=0; mk=0;
    while(m<20)   %Armijo搜索
        a_new=a+rho^m*D;
        phase_new=a_new(1,1)*Z4+a_new(2,1)*Z5+a_new(3,1)*Z6+a_new(4,1)*Z7+a_new(5,1)*Z8+a_new(6,1)*Z9; %新相位
        p_new=exp(1i*(phase_new+phase_len));                      %光瞳函数
        Indx=find(isnan(p_new));                 %找出NAN位置
        p_new(Indx)=0;                              %p中的NAN设为0
        g21_new=G2(p_new,lamda,f,s,d1,d2,g1);         %焦后面光场
        E_new=err_or(g21_new,g2);

        if (E_new<=E_old+sigma*rho^m*g'*D)
            mk=m; break;
        end
        m=m+1;
    end
    a=a+rho^mk*D;
    g0=g;  D0=D;
    K=K+1;
end

A=a';
phase_set=A(1,1)*Z4+A(1,2)*Z5+A(1,3)*Z6+A(1,4)*Z7+A(1,5)*Z8+A(1,6)*Z9; %恢复相位
figure(14)
imshow(phase_set,[]);title('复原相位');


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表