|
| 1 | + |
| 2 | +% TIKHONOV_OP2D_BF Finds optimal lambda and alhpa for Tikhonov solver. |
| 3 | +% Author: Arash Naseri, Timothy Sipkens, 2020-02-28 |
| 4 | +%=========================================================================% |
| 5 | + |
| 6 | +function [x,lambda,alpha,out,chi] = tikhonov_op2d_bf(A,b,C,d,span1,span2,order,n,x_ex,xi,solver) |
| 7 | + |
| 8 | + |
| 9 | +%-- Parse inputs ---------------------------------------------------------% |
| 10 | +if ~exist('order','var'); order = []; end |
| 11 | +if ~exist('xi','var'); xi = []; end |
| 12 | +if ~exist('x_ex','var'); x_ex = []; end |
| 13 | +if ~exist('solver','var'); solver = []; end |
| 14 | +%-------------------------------------------------------------------------% |
| 15 | + |
| 16 | + |
| 17 | +%-- Compute credence, fit, and Bayes factor ------------------------------% |
| 18 | +% Initially meshing the domain of (lambda, alpha ) to roughly find the |
| 19 | +% location of global extremum of B |
| 20 | +lambda = logspace(log10(span1(1)),log10(span1(1)),3); |
| 21 | +alpha = logspace(log10(span2(1)),log10(span2(1)),3); |
| 22 | +[lambda_mat,alpha_mat] = meshgrid(lambda,alpha); |
| 23 | +param = [lambda_mat(:),alpha_mat(:)]; % set of lambda and alpha to consider |
| 24 | +x_length = size(A,2); |
| 25 | + |
| 26 | +Lpr0 = invert.tikhonov_lpr(order,n,x_length); % get Tikhonov matrix |
| 27 | + |
| 28 | +tools.textbar(0); |
| 29 | +for ii=length(param):-1:1 % reverse loop to pre-allocate |
| 30 | + out(ii).lambda = param(ii,1); % store regularization parameter |
| 31 | + out(ii).alpha = param(ii,2); % store regularization parameter |
| 32 | + |
| 33 | + %-- Perform inversion --% |
| 34 | + [out(ii).x,~,Lpr0] = invert.tikhonov(... |
| 35 | + [param(ii,2).*A;C],[param(ii,2).*b;d],param(ii,1),Lpr0,[],xi,solver); |
| 36 | + %-- Store ||Ax-b|| and Euclidean error --% |
| 37 | + if ~isempty(x_ex); out(ii).chi = norm(out(ii).x-x_ex); end |
| 38 | + out(ii).Axb = norm(A*out(ii).x-b); |
| 39 | + |
| 40 | + %-- Compute credence, fit, and Bayes factor --% |
| 41 | + out(ii).x = invert.tikhonov([param(ii,2)*A;C],[param(ii,2)*b;d],... |
| 42 | + param(ii,1),Lpr0,[],xi,solver); |
| 43 | + [out(ii).B,out(ii).F,out(ii).C] = ... |
| 44 | + optimize.bayesf_b([param(ii,2)*A;C],[param(ii,2)*b;d],... |
| 45 | + out(ii).x,Lpr0,param(ii,1)); |
| 46 | + tools.textbar((length(param)-ii+1)/length(param)); |
| 47 | +end |
| 48 | + |
| 49 | +%-- Record a rough estimate of the solution --% |
| 50 | +[~,ind_min] = max([output.B]); % get optimal w.r.t. Bayes factor |
| 51 | +out(1).ind_min = ind_min; |
| 52 | +%-------------------------------------------------------------------------% |
| 53 | + |
| 54 | + |
| 55 | +%-- Add fminsearch step to optimize parameter set --------------------% |
| 56 | +disp('Optimizing Tikhonov regularization:'); |
| 57 | +fun = @(lambda) log(-1*optimize.bayesf_b([lambda(2)*A;C],[lambda(2)*b;d],invert.tikhonov... |
| 58 | + ([lambda(2)*A;C],[lambda(2)*b;d],lambda(1),Lpr0,[],xi,solver),Lpr0,lambda(1))); |
| 59 | + |
| 60 | +y0 = [out(ind_min).lambda out(ind_min).alpha]; % initial guess for fminsearch |
| 61 | +options = optimset('TolFun',10^-8,'TolX',10^-8,'Display','iter'); |
| 62 | +y1 = fminsearch(fun,y0,options); % get optimal lambda and alpha |
| 63 | + |
| 64 | +lambda = y1(1); % assign output variables |
| 65 | +alpha = y1(2); |
| 66 | +disp('Complete.'); |
| 67 | +%---------------------------------------------------------------------% |
| 68 | + |
| 69 | + |
| 70 | +x = invert.tikhonov(... |
| 71 | + [alpha*A;C],[alpha*b;d],lambda,Lpr0,[],xi,solver); |
| 72 | +chi = norm(x-x_ex); |
| 73 | + |
| 74 | + |
| 75 | +end |
0 commit comments