0001 function img= bs_nonlinearGN( inv_model, data )
0002
0003
0004
0005
0006
0007
0008
0009 fwd_model= inv_model.fwd_model;
0010
0011 img= eidors_obj('image','Solved by bs_nonlinearGN');
0012 img.fwd_model= fwd_model;
0013 sol= inv_model.nonlinearGN.init_backgnd * ...
0014 ones(size(fwd_model.coarse2fine,2),1);
0015
0016 RtR = calc_RtR_prior( inv_model );
0017 hp2 = calc_hyperparameter( inv_model )^2;
0018
0019 factor= 0; norm_d_data= inf;
0020
0021 for iter= 1:inv_model.parameters.max_iterations
0022 img.elem_data= sol;
0023 simdata= fwd_solve( img );
0024
0025 d_data= data - simdata.meas;
0026 prev_norm_d_data= norm_d_data; norm_d_data= norm(d_data);
0027 eidors_msg('bs_nonlinearGN: iter=%d diff=%f factor=%f', ...
0028 iter, norm_d_data, factor, 2);
0029
0030 if prev_norm_d_data - norm_d_data < inv_model.parameters.term_tolerance
0031 eidors_msg(' BREAK (Requested tolerance achieved)', 2);
0032 break;
0033 end
0034
0035 J = calc_jacobian( fwd_model, img);
0036 delta_sol = (J.'*J + hp2*RtR)\ (J.' * d_data);
0037
0038 factor = linesearch(img, data, sol, delta_sol, norm_d_data);
0039
0040 sol = sol + factor*delta_sol;
0041 end
0042
0043 img.elem_data= sol;
0044
0045
0046 function factor= linesearch(img, data, sol, delta_sol, norm_d_data)
0047 facts= linspace(0,2,20);
0048 norms= norm_d_data;
0049 for f= 1:length(facts);
0050 img.elem_data= sol + facts(f)*delta_sol;
0051 simdata= fwd_solve( img );
0052 norms(f)= norm(data - simdata.meas);
0053 end
0054 ff= find(norms==min(norms));
0055 factor= facts(ff(end));