Algorithm
DFMethods solves systems of nonlinear equations with a closed convex feasibility set, using a derivative-free projection family of methods. Each outer iteration is composed of seven steps. Different choices for each step produce different concrete algorithms; the package ships a default and exposes every step as a pluggable component (see Extending).
Problem class
Find $u^* \in X$ such that
\[F(u^*) = 0,\]
with $X \subset \mathbb{R}^n$ closed convex and $F : \mathbb{R}^n \to \mathbb{R}^n$ continuous. The algorithm uses no derivative information of $F$. Additional assumptions on $F$ (monotonicity-like conditions linking $F$ and the solution set) are needed for the convergence theorems; they are stated in the Convergence section below.
One outer iteration
Each call to the driver's step! performs the following six operations.
Inertial extrapolation.
\[w_k = x_k + \theta_k (x_k - x_{k-1}),\]
with $\theta_k$ produced by the chosen
AbstractInertialRule. WithNoInertial, $w_k = x_k$.Function evaluation. Compute $F(w_k)$. Stopping criteria registered on the
:post_linesearchevent may also evaluate convergence on $F(w_k)$ when their semantics call for it.Search direction. Compute $d_k$ via the chosen
AbstractSearchDirection. For most convergence theorems in this family, the rule must produce a sufficient-descent direction with bounded norm:\[-F(w_k)^\top d_k \geq c \|F(w_k)\|^2, \qquad \|d_k\| \leq \bar c\, \|F(w_k)\|,\]
for fixed $c, \bar c > 0$.
Line search. Find a step size $\alpha_k > 0$ via the chosen line-search algorithm (any
LineSearch.AbstractLineSearchAlgorithmfrom LineSearch.jl, including the built-ins below). The defaultResidualNormBacktrackperforms Armijo backtracking with $\gamma_k = \|F(z_k)\|$ inside the descent test; see Extending §1 for the contract.Trial point. Form $z_k = w_k + \alpha_k d_k$ and evaluate $F(z_k)$. The default convergence criterion
AbsResidualTolfires here when $\|F(z_k)\| \leq \epsilon$.Iterate update. Produce $x_{k+1}$ via the chosen
AbstractIterateUpdatestrategy:SolodovSvaiterProjection(default) constructs the separating hyperplane $H_k = \{x : F(z_k)^\top(x - z_k) \leq 0\}$ and sets\[x_{k+1} = \tilde P_{X \cap H_k}\!\bigl(w_k - \lambda_k F(z_k);\ \epsilon_k\bigr),\]
with $\lambda_k = F(z_k)^\top(w_k - z_k) / \|F(z_k)\|^2$ and $\epsilon_k = \tfrac{1}{2}\zeta^2 \|\lambda_k F(z_k)\|^2$.DirectUpdatesets $x_{k+1} = P_X(z_k)$.HalpernUpdate(β)sets $x_{k+1} = P_X\!\bigl(\beta\, x_0 + (1-\beta)\, z_k\bigr)$ (with $\beta$ a scalar or a schedule $k \mapsto \beta(k)$).
See Extending §3 for the contract on custom strategies.
Pluggable components
| Component | Abstract type | Built-in instances |
|---|---|---|
| Search direction | AbstractSearchDirection | SpectralThreeTerm |
| Line search | LineSearch.AbstractLineSearchAlgorithm | ConstantBacktrack, ResidualNormBacktrack, AdaptiveClampedBacktrack |
| Inertial rule | AbstractInertialRule | Inertial, NoInertial |
| Iterate update | AbstractIterateUpdate | SolodovSvaiterProjection, DirectUpdate, HalpernUpdate |
| Stopping / observers | AbstractCallback | AbsResidualTol, MaxIters, HistoryCallback, LoggingCallback, … |
The constraint set is a property of the problem, not the algorithm — see Constraint Sets.
Each line-search rule supplies its own $\gamma_k$ inside the descent condition of step 4:
| Line search | $\gamma_k$ |
|---|---|
ConstantBacktrack | $\gamma_k \equiv 1$ |
ResidualNormBacktrack | $\gamma_k = |F(z_k)|$ |
AdaptiveClampedBacktrack | clamped adaptive variant |
Default configuration
DFProjection() # all defaultsDFProjection{SpectralThreeTerm, ResidualNormBacktrack, Inertial, AnyOf{Tuple{AbsResidualTol, MaxIters}}, SolodovSvaiterProjection, Vector{AbstractCallback}}(SpectralThreeTerm(0.1, 1.0, 1.0e-10, 1.0e30), ResidualNormBacktrack(0.01, 0.6, 50), Inertial(0.25), 1.0e-6, 0.0, 2000, Inf, AnyOf{Tuple{AbsResidualTol, MaxIters}}((AbsResidualTol(1.0e-6), MaxIters(2000))), true, 0.5, 500, 50, SolodovSvaiterProjection(1.0), AbstractCallback[])equivalent to:
DFProjection(;
direction = SpectralThreeTerm(; r = 0.1, alpha_bar = 1.0),
linesearch = ResidualNormBacktrack(; σ = 0.01, ρ = 0.6),
inertial = Inertial(0.25),
iterate_update = SolodovSvaiterProjection(),
abstol = 1e-6,
maxiters = 2000,
ζ = 0.5,
)DFProjection{SpectralThreeTerm, ResidualNormBacktrack, Inertial, AnyOf{Tuple{AbsResidualTol, MaxIters}}, SolodovSvaiterProjection, Vector{AbstractCallback}}(SpectralThreeTerm(0.1, 1.0, 1.0e-10, 1.0e30), ResidualNormBacktrack(0.01, 0.6, 50), Inertial(0.25), 1.0e-6, 0.0, 2000, Inf, AnyOf{Tuple{AbsResidualTol, MaxIters}}((AbsResidualTol(1.0e-6), MaxIters(2000))), true, 0.5, 500, 50, SolodovSvaiterProjection(1.0), AbstractCallback[])Convergence
A representative convergence theorem holds under the following assumptions:
\[F\]
is continuous, with $F(x)^\top (x - u^*) \geq 0$ for some solution $u^*$ and all $x \in \mathbb{R}^n$ (a property automatically satisfied whenever $F$ is monotone or pseudo-monotone);\[X\]
is closed convex;- the search direction satisfies the sufficient-descent and boundedness conditions of step 3 with fixed constants $c, \bar c > 0$;
- the line-search $\gamma_k$ is bounded below by a positive constant on bounded subsets of $X$.
Under these assumptions the iterates produced by step! converge to a solution of $F(u) = 0$ in $X$. A representative unified convergence result covering this family of configurations is given in Ibrahim, Alshahrani, Al-Homidan 2026, Theorem 3.1; component-specific convergence results (Solodov–Svaiter projection, spectral-CG directions, Halpern anchoring, etc.) appear in the respective originating works.
The library does not enforce these assumptions at runtime. Iteration proceeds regardless of whether they are satisfied. Users supplying custom components are responsible for verifying that the conditions still hold. The Extending page (§8) discusses empirical consequences of violating them — notably the sublinear behavior of PRP-style search directions on problems with a degenerate Jacobian at the solution.