landweber

odl.solvers.iterative.iterative.landweber(op, x, rhs, niter, omega=None, projection=None, callback=None)[source]

Optimized implementation of Landweber's method.

Solves the inverse problem:

A(x) = rhs
Parameters:
opOperator

Operator in the inverse problem. op.derivative(x).adjoint must be well-defined for x in the operator domain.

xop.domain element

Element to which the result is written. Its initial value is used as starting point of the iteration, and its values are updated in each iteration step.

rhsop.range element

Right-hand side of the equation defining the inverse problem.

niterint

Number of iterations.

omegapositive float, optional

Relaxation parameter in the iteration. Default: 1 / op.norm(estimate=True) ** 2

projectioncallable, optional

Function that can be used to modify the iterates in each iteration, for example enforcing positivity. The function should take one argument and modify it in-place.

callbackcallable, optional

Object executing code per iteration, e.g. plotting each iterate.

Notes

This method calculates an approximate least-squares solution of the inverse problem of the first kind

\mathcal{A} (x) = y,

for a given y\in \mathcal{Y}, i.e. an approximate solution x^* to

\min_{x\in \mathcal{X}} \| \mathcal{A}(x) - y \|_{\mathcal{Y}}^2

for a (Frechet-) differentiable operator \mathcal{A}: \mathcal{X} \to \mathcal{Y} between Hilbert spaces \mathcal{X} and \mathcal{Y}. The method starts from an initial guess x_0 and uses the iteration

x_{k+1} = x_k -
          \omega \ \partial \mathcal{A}(x)^* (\mathcal{A}(x_k) - y),

where \partial \mathcal{A}(x) is the Frechet derivative of \mathcal{A} at x and \omega is a relaxation parameter. For linear problems, a choice 0 < \omega < 2/\lVert \mathcal{A}^2\rVert guarantees convergence, where \lVert\mathcal{A}\rVert stands for the operator norm of \mathcal{A}.

Users may also optionally provide a projection to project each iterate onto some subset. For example enforcing positivity.

This implementation uses a minimum amount of memory copies by applying re-usable temporaries and in-place evaluation.

The method is also described in a Wikipedia article.