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 :
where
The first term in the above equation measures the misfit between the data and the synthetic response that would have been observed because of
Obviously, there are multiple ways to solve this non-linear equation. We provide the following few natively:
Occam1D : Occam's inversion: a practical algorithm for generating smooth models from electromagnetic sounding data: A very robust algorithm to obtain smooth models.
Optimisers from
NonlinearSolve.jl. Popular ones in geophysical community include:Gauss Newton
Levenberg Marquardt
Newton Raphson
Optimisers from
OptimizationOptim.jlviaOptimization.jl. Popular ones in geophysical community include:Conjugate Gradient
Gradient Descent
LBFGS
Simulated Annealing
Particle Swarm
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.