Julian-style inverse-problem solvers with multiple dispatch: pick a problem,
pick an algorithm, call solve.
- Linear: plain LSQ, weighted LSQ, Tikhonov (L2 + smoothness), NNLS, bounded, L1 / LASSO.
- Bayesian linear (Rodgers): QR-stable and normal-equation forms with full posterior diagnostics (averaging kernel, gain matrix, DOFs, Shannon info).
- Nonlinear: Gauss–Newton and Levenberg–Marquardt iteration around user-supplied or AD-computed Jacobians.
- Regularization-parameter selection: L-curve, GCV, discrepancy principle.
Designed for repeated solves with pre-allocated workspaces — minimal allocations in hot loops.
using Pkg
Pkg.add(url="https://github.com/cfranken/OptimalEstimation.jl")using OptimalEstimation, LinearAlgebra
n, m = 200, 8
K, y, xₐ = randn(n, m), randn(n), zeros(m)
Sₐ, Sₑ = Diagonal(fill(1.0, m)), Diagonal(fill(0.05^2, n))
prob = BayesianLinearProblem(K, y, xₐ, Sₐ, Sₑ)
sol = solve(prob, RodgersQR())
@show sol.x̂ # state
@show degrees_of_freedom(sol) # tr(A)
@show information_content(sol) # bitsF!(out, x) = (@. out = x[1] * exp(-x[2] * t); out)
prob = NonlinearProblem(F!, y, xₐ, Sₐ, Sₑ; jacobian=FiniteDiffJacobian())
sol = solve(prob, LevenbergMarquardt())For full documentation and examples, see the docs.