Skip to content

Deterministic Inversion

Brief introduction

Inverse problems in geophysics are notoriously ill-posed with non-unique solutions. This page goes over some essentials you might require for performing deterministic inversion of the geophysical datasets.

To be on the same page, the goal is to solve the following optimization problem :

\argminm[f(m)d]TCd[f(m)d]+μ(mm0)TCm(mm0)

where m denotes the model parameters, d is the data to be inverted for, Cd is the data covariance matrix, composed of errors in data and Cm is model covariance matrix, constructed using prior assumptions about the model, μ is the regularization coefficient, and m0 is some model you want to bias you results towards.

The first term in the above equation measures the misfit between the data and the synthetic response that would have been observed because of m. The second term is used to stabilize and/or constrain the solutions better. Very frequently, Cm is constructed using the derivative matrix but it can be anything, e.g. a weight matrix to bias some parts of the models towards m0.

Obviously, there are multiple ways to solve this non-linear equation. We provide the following few natively:

All the inversion capabilities are accessed using inverse! function, which we cover in the next pages.

Note

Do note that the inversion only takes care of the parameter denoted by m, even though there might be other parameters, e.g. for Rayleigh wave models, we invert of shear wave velocity even though the model also requires p-wave velocities and densities.

AD backend (TODO)

The current strategy to provide AD (Automatic Differentiation) backend is a bit inconsistent because of how different packages deal with it. While using, Occam and solvers from Optimization.jl, make use of ad_type keyword. For solvers from NonlinearSolve.jl, you would need to pass the backend into the solver itself. In the tutorial page for solvers from NonlinearSolve.jl, we solve by explicitly providing the Finite Difference backend.

Finite Difference backend (provided via DifferentiationInterface.AutoFiniteDiff()) is also the default for all the inverse methods for stability reasons, though AutoForwardDiff() for forward-mode differentiation might work as well. AutoEnzyme(; mode = Enzyme.Reverse) should work for most problems except surface waves, because the nature of forward modeling involves solving another equation.