前言
电磁逆散射问题是指利用测量的散射场数据重构探测区域内散射体的电性能参数空间分布。由于逆散射问题内在的非线性和病态性,通常采用迭代优化方法求解该问题。
SOM算法
由于公式粘贴到此处总是出错,这里采用截图的方式展示,请大家多多包涵。
具体实现步骤
SOM算法部分代码
L = 15;
[Gs_U,Gs_S,Gs_V] = svd(Gs);%奇异值分解
%% 感应电流主要部分的计算
alpha_po = Gs_U(:,1:L)'*E_s./repmat(diag(Gs_S(1:L,1:L)),1,Ni); % L x Ni
J_po = Gs_V(:,1:L)*alpha_po; % M^2 x Ni感应电流源,感应电流的主要部分
epsono_r = ones(M,M);
epsono_r((x-0.3).^2+(y-0.6).^2<=0.2^2) = epsono_r_c;
epsono_r((x+0.3).^2+(y-0.6).^2<=0.2^2) = epsono_r_c;
epsono_r((x).^2+(y+0.2).^2>=0.3^2 & (x).^2+(y+0.2).^2<=0.6^2) = epsono_r_c;
chai0 = -1i*k0/imp*(epsono_r-ones(M,M));%计算每个网格的电磁波响应,并储存在chai0矩阵中
%% Loop循环
Gs_V_ne = Gs_V(:,(L+1):end); % M^2 x (M^2-L)%后 M-L列
%初始化向量
alpha_ne = zeros(M^2-L,Ni);
alpha_neo = zeros(M^2-L,Ni);
rho = zeros(M^2-L,Ni);
grad = zeros(M^2-L,Ni);
B = repmat(reshape(chai,M^2,1),1,Ni).*(E_inc+Gd(J_po,Z,M))-J_po; % M^2 x Ni
del_dat = Gs*(Gs_V_ne*alpha_ne)+Gs*J_po-E_s; % Ns x Ni数据方程残差
del_sta = Gs_V_ne*alpha_ne - repmat(reshape(chai,M^2,1),1,Ni).*Gd(Gs_V_ne*alpha_ne,Z,M)-B; % M^2 x Ni状态方程残差
E_po = E_inc+Gd(J_po,Z,M); % M^2 x Ni电场
E_s_norm_sq = sum(abs(E_s).^2,1); % 1 x Ni
J_po_norm_sq = sum(abs(J_po).^2,1); % 1 x Ni
for n = 1:50
grad = (Gs*Gs_V_ne)'*(del_dat)./repmat(E_s_norm_sq,M^2-L,1)+(Gs_V_ne'*(del_sta) - Gs_V_ne'*Gd(repmat(conj(chai(:)),1,Ni).*(del_sta),conj(Z),M))./repmat(J_po_norm_sq,M^2-L,1); % (M^2-L) x Ni
if n > 1
rho = grad+repmat(real(sum(conj(grad-grado).*grad,1))./sum(abs(grado).^2,1),M^2-L,1).*rhoo; %搜索方向
end
if n == 1
rho = grad; % (M^2-L) x Ni
end
num = -sum(conj(Gs*(Gs_V_ne*rho)).*del_dat,1)./E_s_norm_sq-sum(conj((Gs_V_ne*rho - repmat(reshape(chai,M^2,1),1,Ni).*Gd(Gs_V_ne*rho,Z,M))).*del_sta,1)./J_po_norm_sq; % 1 x Ni
den = sum(abs(Gs*(Gs_V_ne*rho)).^2,1)./E_s_norm_sq+sum(abs((Gs_V_ne*rho - repmat(reshape(chai,M^2,1),1,Ni).*Gd(Gs_V_ne*rho,Z,M))).^2,1)./J_po_norm_sq; % 1 x Ni
alpha_ne = alpha_neo+repmat(num./den,M^2-L,1).*rho; % (M^2-L) x Ni
J = J_po+Gs_V_ne*alpha_ne; % M^2 x Ni更新感应电流
Et = E_inc + Gd(J,Z,M); % M^2 x Ni更新第m个总场
chai_num = sum(conj(Et).*J./repmat(J_po_norm_sq,M^2,1),2); % M^2 x 1
chai_den = sum(conj(Et).*Et./repmat(J_po_norm_sq,M^2,1),2); % M^2 x 1
chai = chai_num./chai_den; % M^2 x 1目标函数
chai(imag(chai)>0) = 0; % M^2 x 1
chai = 1i*imag(chai);
grado = grad; % (M^2-L) x Ni
alpha_neo = alpha_ne; % (M^2-L) x Ni
rhoo = rho; % (M^2-L) x Ni
B = repmat(reshape(chai,M^2,1),1,Ni).*(E_po)-J_po; % M^2 x Ni
del_dat = Gs*(Gs_V_ne*alpha_ne)+Gs*J_po-E_s; % Ns x Ni
del_sta = Gs_V_ne*alpha_ne - repmat(reshape(chai,M^2,1),1,Ni).*Gd(Gs_V_ne*alpha_ne,Z,M)-B;
objectf1 = sum(sum((abs(del_dat)).^2,1)./E_s_norm_sq,2); % 1 x 1
objectf2 = sum(sum((abs(del_sta)).^2,1)./J_po_norm_sq,2);% 1 x 1
f(n) = objectf1+objectf2; % 1 x 1 objective function总残差
p = real(chai/(-1i*k0/imp))+ones(M^2,1); % M^2 x 1
q = real(chai0(:)/(-1i*k0/imp))+ones(M^2,1); % M^2 x 1
g(n) = norm(q-p)/norm(q); % 1 x 1 relative error相对误差
chai_storage(:,n) = chai(:); % the updated contrast in each step更新对比度
end
chai = reshape(chai,M,M);