diff --git a/src/example_5_1.m b/src/example_5_1.m index 089fc0e4063053814e81c310b68e2ed4f630fb41..5cd5c454a03420bac6eadf8679047efefc80522d 100644 --- a/src/example_5_1.m +++ b/src/example_5_1.m @@ -1,4 +1,4 @@ -%% Example 5.1 (Splitting only) for varying size: +%% Example 5.1 (Splitting only) for varying distance: clear all close all @@ -26,7 +26,7 @@ R = [3.5, 5]; % radii of circles containing source components znut = [26;-3]; v = [-2;-1]/norm([-2;-1]); -dist = [15 20 25 30 35 40]; +dist = [10 15 20 25 30 35 40 45]; zkite = zeros(2,length(dist)); nr_rep = length(dist); @@ -54,8 +54,8 @@ end % Numerical reconstruction with least squares approach: -tol = 1e-5; -kmax = 100; +tol = 1e-8; +kmax = 300; Anut = cell(1,nr_rep); Akite = cell(1,nr_rep); @@ -77,14 +77,8 @@ for iteri = 1:nr_rep clear A z - relerrnut(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); - relerrkite(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); -end - -disp('Table 5.1 (left): Relative errors of far field operator splitting with least squares approach for varying distance:') -fprintf(' |c_1-c_2| epsilon_nut epsilon_kite\n') -for iteri = 1:nr_rep - fprintf(' %d %.3f %.3f\n', dist(iteri), round(relerrnut(iteri),3), round(relerrkite(iteri),3)) + relerrnut1_cg(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); + relerrkite1_cg(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); end % Numerical reconstruction with l1xl1-minimization: @@ -106,15 +100,31 @@ for iteri = 1:nr_rep clear A z - relerrnut(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); - relerrkite(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); + relerrnut1_fista(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); + relerrkite1_fista(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); end -disp('Table 5.1 (left): Relative errors of far field operator splitting with l1xl1-minimization for varying distance:') -fprintf(' |c_1-c_2| epsilon_nut epsilon_kite\n') -for iteri = 1:nr_rep - fprintf(' %d %.3f %.3f\n', dist(iteri), round(relerrnut(iteri),3), round(relerrkite(iteri),3)) -end +% Plot relative errors: + +figure() + +semilogy(dist, relerrnut1_cg, 'r--o', dist, relerrkite1_cg, 'b--*', dist, relerrnut1_fista, 'r-o', dist, relerrkite1_fista, 'b-*', 'LineWidth', 1.2) + +title('Relative errors for varying distance', 'Interpreter', 'latex') +xlabel('$|c_1-c_2|$', 'Interpreter', 'latex') +ylabel('$\epsilon_{\mathrm{rel}}$', 'Interpreter', 'latex') + +legend({'$\epsilon_{\mathrm{rel}}^1$ using cg','$\epsilon_{\mathrm{rel}}^2$ using cg', '$\epsilon_{\mathrm{rel}}^1$ using FISTA', '$\epsilon_{\mathrm{rel}}^2$ using FISTA'}, 'Interpreter','latex', 'Location','northeast') + +xlim([dist(1) dist(end)]) +ylim([10^(-2) 1]) + +grid on + +ax = gca; +ax.FontSize = 16; + +print ../figures/errors_vary_distance.eps -depsc % Plot of geometry: @@ -134,7 +144,7 @@ hold on % Other kites: for iteri = 1:nr_rep - if iteri~=3 + if iteri~=7 zhelp = zkite(:,iteri); paramshelp = [1 .5 zhelp.' 135 3]; @@ -150,7 +160,7 @@ for iteri = 1:nr_rep end % Special kite: -zhelp = zkite(:,3); +zhelp = zkite(:,7); paramshelp = [1 .5 zhelp.' 135 3]; [x_kite,~,~,~] = kurve(100, 'kite', paramshelp); @@ -165,10 +175,13 @@ hold on title('Geometry and a priori information for varying distance', 'Interpreter', 'Latex') grid on -axis equal +axis([-20 35.5 -30 10]) + +text(26.2,-1.8,'$D_1$','Color','blue','FontSize',16, 'Interpreter','latex') +text(-11.7,-19.5,'$D_2$','Color','blue','FontSize',16, 'Interpreter','latex') ax = gca; -ax.FontSize = 12; +ax.FontSize = 16; print ../figures/geometry_vary_distance.eps -depsc @@ -195,7 +208,9 @@ noiselevel = 0.05; % Vary Size of one scatterer: R_kite = 5; -R_nut = [2 3.5 5 6.5 8 9.5]/3.2; +R_nut = [2 3.5 5 6.5 8 9.5]; + +scaling_nut = R_nut*3/3.4; znut = [26;-3]; v = [-2;-1]/norm([-2;-1]); @@ -211,8 +226,8 @@ Fkite = cell(1,nr_rep); Fall = cell(1,nr_rep); for iteri = 1:nr_rep - params = [(R_nut(iteri)^2*1) (R_nut(iteri)^2*.5) znut.' 45 3; 1 .5 [zkite-[.5;-.5]].' 135 3]; - + params = [1 .5 znut.' 45 scaling_nut(iteri); 1 .5 [zkite-[.5;-.5]].' 135 3]; + [Fnut{iteri}, ~, ~] = evaluateFarfieldNystrom({'nut'}, params(1,:), q(1), k, sampling.nxhat, 0); [Fkite{iteri}, ~, ~] = evaluateFarfieldNystrom({'kite'}, params(2,:), q(2), k, sampling.nxhat, 0); [Fall{iteri}, ~, ~] = evaluateFarfieldNystrom({'nut', 'kite'}, params, q, k, sampling.nxhat, 0); @@ -225,8 +240,8 @@ end % Numerical reconstruction: -tol = 1e-3; -kmax = 100; +tol = 1e-8; +kmax = 300; Anut = cell(1,nr_rep); Akite = cell(1,nr_rep); @@ -237,9 +252,9 @@ indOfInterest = sub2ind([nr_of_scatterers,nr_of_scatterers],1:nr_of_scatterers,1 for iteri = 1:nr_rep z = [znut, zkite]; - R = [R_nut(iteri)*3.2, R_kite]; + R = [R_nut(iteri), R_kite]; - [A, ~, ~] = CG_secondOrder(G{iteri}, sampling, k, P_Omega, z, R, kmax, tol); + [A, nr_of_iterations, Res] = CG_secondOrder(G{iteri}, sampling, k, P_Omega, z, R, kmax, tol); Aall{iteri} = A{2} + A{3} + A{4} + A{5}; A = {A{1},A{indOfInterest+1}}; @@ -249,14 +264,8 @@ for iteri = 1:nr_rep clear A z - relerrnut(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); - relerrkite(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); -end - -disp('Table 5.1 (right): Relative errors of far field operator splitting with least squares approach for varying size of the nut:') -fprintf(' R_nut epsilon_nut epsilon_kite\n') -for iteri = 1:nr_rep - fprintf(' %.1f %.3f %.3f\n', R_nut(iteri)*3.2, round(relerrnut(iteri),3), round(relerrkite(iteri),3)) + relerrnut2_cg(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); + relerrkite2_cg(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); end % Numerical reconstruction with l1xl1-minimization: @@ -278,17 +287,32 @@ for iteri = 1:nr_rep clear A z - relerrnut(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); - relerrkite(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); + relerrnut2_fista(iteri) = norm(Anut{iteri}-Fnut{iteri})/norm(Fnut{iteri}); + relerrkite2_fista(iteri) = norm(Akite{iteri}-Fkite{iteri})/norm(Fkite{iteri}); end -disp('Table 5.1 (right): Relative errors of far field operator splitting with l1xl1-minimization for varying size of the nut:') -fprintf(' R_nut epsilon_nut epsilon_kite\n') -for iteri = 1:nr_rep - fprintf(' %.1f %.3f %.3f\n', R_nut(iteri)*3.2, round(relerrnut(iteri),3), round(relerrkite(iteri),3)) -end +% Plot relative errors: -% Plot of geometry: +figure() + +semilogy(R_nut, relerrnut2_cg, 'r--o', R_nut, relerrkite2_cg, 'b--*', R_nut, relerrnut2_fista, 'r-o', R_nut, relerrkite2_fista, 'b-*', 'LineWidth', 1.2) + +title('Relative errors for varying size', 'Interpreter', 'latex') +xlabel('$R_1$', 'Interpreter', 'latex') +ylabel('$\epsilon_{\mathrm{rel}}$', 'Interpreter', 'latex') + +legend({'$\epsilon_{\mathrm{rel}}^1$ using cg','$\epsilon_{\mathrm{rel}}^2$ using cg', '$\epsilon_{\mathrm{rel}}^1$ using FISTA', '$\epsilon_{\mathrm{rel}}^2$ using FISTA'}, 'Interpreter','latex', 'Location','southeast') + +xlim([R_nut(1) R_nut(end)]) + +grid on + +ax = gca; +ax.FontSize = 16; + +print ../figures/errors_vary_radius.eps -depsc + +%% Plot of geometry: figure() @@ -306,31 +330,36 @@ hold on % Other nuts: for iteri = 1:nr_rep - paramshelp = [(R_nut(iteri)^2*1) (R_nut(iteri)^2*.5) znut.' 45 3]; - + paramshelp = [1 .5 znut.' 45 scaling_nut(iteri)]; + [x_nut,~,~,~] = kurve(100,'nut', paramshelp); x_nut = [x_nut;x_nut(1,:)]; plot(x_nut(:,1),x_nut(:,2),'LineWidth', 1.5, 'Color', [0.678 0.847 0.902]) hold on - plot(3.2*R_nut(iteri)*cos(d)+znut(1),3.2*R_nut(iteri)*sin(d)+znut(2),'LineStyle', '--', 'LineWidth', 1, 'Color', [.5 .5 .5]) + plot(R_nut(iteri)*cos(d)+znut(1),R_nut(iteri)*sin(d)+znut(2),'LineStyle', '--', 'LineWidth', 1, 'Color', [.5 .5 .5]) end % Special nut: -paramshelp = [(R_nut(3)^2*1) (R_nut(3)^2*.5) znut.' 45 3]; - +% paramshelp = [(R_nut(3)^2*1) (R_nut(3)^2*.5) znut.' 45 3]; +paramshelp = [1 .5 znut.' 45 scaling_nut(3)]; + [x_nut,~,~,~] = kurve(100,'nut', paramshelp); x_nut = [x_nut;x_nut(1,:)]; plot(x_nut(:,1),x_nut(:,2),'LineWidth', 1.5, 'Color', 'blue') hold on -plot(3.2*R_nut(3)*cos(d)+znut(1),3.2*R_nut(3)*sin(d)+znut(2),'LineStyle', '--', 'LineWidth', 1.2, 'Color', 'black') +% plot(3.2*R_nut(3)*cos(d)+znut(1),3.2*R_nut(3)*sin(d)+znut(2),'LineStyle', '--', 'LineWidth', 1.2, 'Color', 'black') +plot(R_nut(3)*cos(d)+znut(1),R_nut(3)*sin(d)+znut(2),'LineStyle', '--', 'LineWidth', 1.2, 'Color', 'black') hold on scatter(znut(1), znut(2),100,'Marker','+','LineWidth', 1.2,'MarkerEdgeColor', 'black') -title('Geometry and a priori information for varying size of nut', 'Interpreter', 'Latex') +title('Geometry and a priori information for varying size', 'Interpreter', 'Latex') grid on -axis equal +axis([-20 35.5 -30 10]) + +text(26.2,-1.8,'$D_1$','Color','blue','FontSize',16, 'Interpreter','latex') +text(-12.5,-19.5,'$D_2$','Color','blue','FontSize',16, 'Interpreter','latex') ax = gca; -ax.FontSize = 12; +ax.FontSize = 16; print ../figures/geometry_vary_radius.eps -depsc \ No newline at end of file