minTolIn

Inner tolerance principle to stop the primal-dual algorithm.

Contents

Syntax

ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti)
ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti,dispDepth)

Description

ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti) computes the inner tolerance ThetaiOut. See "More About" for details. ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti,dispDepth) does the same but allows to control the displayed messages by dispDepth.

To use it in context of computational framework set seti.useTolIn = 1.

Example

See minPda.html to see the usage in computational framework.

Here we give a small example.

init;
seti.ThetaStart = 0.925
seti.ThetaMax = 0.95
seti.TolGamma = 0.90
ThetaiOut = seti.ThetaStart;
seti.nOut = 30; % maximal number of outer iterations
pdaNv = zeros(1,seti.nOut);
iOut = 1;
seti.incNb = 2;  % number of transmitters
seti.measNb = 5; % number of receivers
FFq = rand(seti.measNb, seti.incNb);
seti.tau = 2.5;
seti.delta = 0.01;
seti.FmeasDelta = rand(seti.measNb,seti.incNb);
seti.pNorm = 2; % pNorm..., see normws.m
seti.dSMeas = 1; % see setMeasPnts.m
ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti)

Input Arguments

Parameters for inner tolerance, see Section "More About". We give values of parameters, which worked fine in [2].

Other parameters in struct seti:

Some more parameters in struct seti are given in the Example above.

Optional Input Argument

Output Arguments

More About

The primal-dual algorithm is the inner iteration in the computational framework. The inner tolerance principle is applied to stop this inner iteration within itself.

This method is described in paragraph "Stopping strategy 2" of Section 4.10 in [2] and bases on the inexact stopping rule for a Newton-like method in Chapter 7.5.3 in [1]. We give a brief introduction here.

Notation

Scheme

Algorithm: Compute inner tolerance $\Theta_m$

$\tilde{\Theta}_{m} = \Theta_\mathrm{start}$

With notation: $N_\mathrm{in}^{(m-2)}$ and $N_\mathrm{in}^{(m-1)}$ : number of steps in inner iteration for the two previous outer iterations.

$\tilde{\Theta}_{m} =   1-\left( 1-\Theta_{m-1} \right)   N_\mathrm{in}^{(m-2)}/N_\mathrm{in}^{(m-1)}   \quad \mathrm{ if\ } N_\mathrm{in}^{(m-1)} \geq N_\mathrm{in}^{(m-2)},$

$\tilde{\Theta}_{m} =   \gamma_\mathrm{tol}\, \Theta_{m-1} \quad \mathrm{ otherwise}.$

$\Theta_m = \Theta_{\max}\, \max \left\{   \tau\,\delta/\mathrm{dis}_\mathrm{nonlin}^{(m)},\tilde{\Theta}_{m}   \right\}, \quad m \in \bf{N}.$

References

See Also

Code

function ThetaiOut = minTolIn(ThetaiOut,pdaNv,iOut,FFq,seti,varargin)

if nargin == 6
    dispDepth = varargin{1};
else
    dispDepth = 0;
end

seti.useTolInFix = 0; % default: 0
% Do not use option tolInFix because it needs more outer iterations...
if seti.useTolInFix
    ThetaiOut = seti.ThetaStart;
else

    ThetaMax = seti.ThetaMax;
    gamma = seti.TolGamma;

    % Compute help tolerances \hat{Theta}_i = ThetaHati
    if iOut > 2
        if pdaNv(iOut-1) >= pdaNv(iOut-2)
            ThetaHati = 1-pdaNv(iOut-2)/pdaNv(iOut-1)*(1-ThetaiOut);
        else
            ThetaHati = gamma*ThetaiOut;
        end
    else
        ThetaHati = seti.ThetaStart; % start...
    end

    disPri = seti.tau*seti.delta/((normws(FFq-seti.FmeasDelta,seti)/normws(seti.FmeasDelta,seti)));
    ThetaiOut = ThetaMax*max(disPri,ThetaHati); % Rieder p. 265

    %fprintf('        disPri = %1.2g | ThetaHati = %1.2g | ThetaiOut = %1.2g \n',disPri,ThetaHati,ThetaiOut)

    if dispDepth >= 4
        disp('----- inner tolerance principle -----')
        if iOut > 2
            fprintf('r_{n-1} = %g | r_{n-2} = %g',pdaNv(iOut-1),pdaNv(iOut-2));
        end
        fprintf(' | ThetaHati = %g | disPri = %g | ThetaiOut = %g\n',ThetaHati,disPri,ThetaiOut);
        disp('-------------------------------------')
    end
end

end