Skip to content

Commit 7f2610b

Browse files
committed
Added tikhonov_op2d_bf.m
This is a contribution from @ArashNaseri, with minor nomenclaute updates. + Bug fixes in a couple other optimize functions.
1 parent 38bfe22 commit 7f2610b

File tree

3 files changed

+78
-3
lines changed

3 files changed

+78
-3
lines changed

+optimize/exp_dist_op.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
disp('Optimizing exponential distance regularization:');
4848
tools.textbar(0);
49-
for ii=length(lambda):-1:1
49+
for ii=length(lambda):-1:1 % reverse loop to pre-allocate
5050
%-- Store case parameters ----------------------%
5151
output(ii).lambda = lambda(ii);
5252
output(ii).lm = sqrt(Gd(1,1));

+optimize/tikhonov_op.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
disp('Optimizing Tikhonov regularization:');
4848
tools.textbar(0);
49-
for ii=length(lambda):-1:1
49+
for ii=length(lambda):-1:1 % reverse loop to pre-allocate
5050
output(ii).lambda = lambda(ii); % store regularization parameter
5151

5252
%-- Perform inversion --%
@@ -68,7 +68,7 @@
6868
if ~isempty(x_ex) % if exact solution is supplied
6969
[~,ind_min] = min([output.chi]);
7070
else
71-
ind_min = [];
71+
[~,ind_min] = max([output.B]);
7272
end
7373
lambda = output(ind_min).lambda;
7474
x = output(ind_min).x;

+optimize/tikhonov_op2d_bf.m

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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

Comments
 (0)