bs_nonlinearGN

PURPOSE ^

NONLINEARGN Non-Linear EIT Inverse

SYNOPSIS ^

function img= bs_nonlinearGN( inv_model, data )

DESCRIPTION ^

 NONLINEARGN Non-Linear EIT Inverse
 img        => output image (or vector of images)
 inv_model  => inverse model struct
 data       => measurement data
 $Id: bs_nonlinearGN.html 2819 2011-09-07 16:43:11Z aadler $
 Modified by Bartosz Sawicki

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function img= bs_nonlinearGN( inv_model, data )
0002 % NONLINEARGN Non-Linear EIT Inverse
0003 % img        => output image (or vector of images)
0004 % inv_model  => inverse model struct
0005 % data       => measurement data
0006 % $Id: bs_nonlinearGN.html 2819 2011-09-07 16:43:11Z aadler $
0007 % Modified by Bartosz Sawicki
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 % Test several different factors to see which minimizes best
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));

Generated on Tue 09-Aug-2011 11:38:31 by m2html © 2005