Contents
inAuto03decAlpha
Internal function of autoparam3, autoparam3alpha.
breakfor = 0; % breakfor is used because it is only allowed in the same file as its corresponding FOR or WHILE statement.
Decision
% 1. and 2.: Find an $\alpha$ called |a| that fulfills the discrepancy principle % and a higher $\alpha$ called |b| that does not. if i == 1 if dp == 1 dpfirst = 1; else dpfirst = 0; end end if startbis == 0 if dpfirst == 1 if dp == 1 alpha(i+1) = 10*alpha(i); fprintf('-- Try a bigger alpha: %g\n',alpha(i+1)); else % dp == 0 a = alpha(i-1); da = disAlphaBeta(i-1); % discrepancy of chosen start a b = alpha(i); db = disAlphaBeta(i); % discrepancy of chosen start b fprintf('-- Start a and b was found: a = %g, b = %g\n',a,b); disp('-- Start Bisection method') startbis = 1; c = a + (b-a)/2; % new alpha in the middle of a and b alpha(i+1) = c; % Result: a < c < b (This statement is always true.) end else % dpfirst == 0 if dp == 0 alpha(i+1) = alpha(i)/10; fprintf('-- Try a smaller alpha: %g\n',alpha(i+1)); else % dp == 1 a = alpha(i); da = disAlphaBeta(i); % discrepancy of chosen start a b = alpha(i-1); db = disAlphaBeta(i-1); % discrepancy of chosen start b fprintf('-- Start a and b was found: a = %g, b = %g\n',a,b); disp('-- Start Bisection method') startbis = 1; c = a + (b-a)/2; % new alpha in the middle of a and b alpha(i+1) = c; % Result: a < c < b (This statement is always true.) end end % 3. Bisection method elseif startbis == 1 dc = disAlphaBeta(i); % acb = [a c b; da dc db] % only for output disp(' ') fprintf('a = %g, c = %g, b = %g\n',a,c,b); fprintf('da = %g, dc = %g, db = %g\n',da,dc,db); disp(' ') if dp == 1 % discrepancy principle fulfilled a = c; da = dc; % Choose c as new a to be with new a UNDER the discrepancy principle border else b = c; db = dc; % Choose c as new b to be with new b OVER the discrepancy principle border if abs(dc-da) <= 1/10*delta fprintf('Automatic parameter choice stopped after %0d iterations.\n',i) fprintf('Reason: |dis(c)-dis(a)| <= 1/10*delta.\n') stopind = i; % Result is 'a' because it fulfills the discrepancy principle breakfor = 1; % was: break; elseif (c-a)/a <= 0.01 fprintf('Automatic parameter choice stopped after %0d iterations.\n',i) fprintf('Reason: (c-a)/a <= 0.01.\n') stopind = i; % Result is 'a' because it fulfills the discrepancy principle breakfor = 1; % was: break; end end if breakfor == 0 c = a + (b-a)/2; % new alpha in the middle of a and b alpha(i+1) = c; end end if i == N fprintf('Automatic parameter choice stopped after %0d iterations (max. number reached).\n',i) stopind = N; end