11# Sadly `Broyden` is taken up by SimpleNonlinearSolve.jl
22"""
33 GeneralBroyden(; max_resets = 3, linesearch = nothing, reset_tolerance = nothing,
4- init_jacobian::Val = Val(:identity), autodiff = nothing)
4+ init_jacobian::Val = Val(:identity), autodiff = nothing, alpha = 1.0 )
55
66An implementation of `Broyden` with resetting and line search.
77
@@ -16,6 +16,8 @@ An implementation of `Broyden` with resetting and line search.
1616 used here directly, and they will be converted to the correct `LineSearch`. It is
1717 recommended to use [LiFukushimaLineSearch](@ref) -- a derivative free linesearch
1818 specifically designed for Broyden's method.
19+ - `alpha_initial`: If `init_jacobian` is set to `Val(:identity)`, then the initial
20+ Jacobian inverse is set to be `(αI)⁻¹`. Defaults to `1.0`.
1921 - `init_jacobian`: the method to use for initializing the jacobian. Defaults to using the
2022 identity matrix (`Val(:identitiy)`). Alternatively, can be set to `Val(:true_jacobian)`
2123 to use the true jacobian as initialization.
@@ -33,30 +35,33 @@ An implementation of `Broyden` with resetting and line search.
3335 max_resets:: Int
3436 reset_tolerance
3537 linesearch
38+ inv_alpha
3639end
3740
38- function __alg_print_modifiers (:: GeneralBroyden{IJ, UR} ) where {IJ, UR}
41+ function __alg_print_modifiers (alg :: GeneralBroyden{IJ, UR} ) where {IJ, UR}
3942 modifiers = String[]
4043 IJ != = :identity && push! (modifiers, " init_jacobian = :$(IJ) " )
4144 UR != = :good_broyden && push! (modifiers, " update_rule = :$(UR) " )
45+ alg. inv_alpha != 1 && push! (modifiers, " alpha = $(1 / alg. inv_alpha) " )
4246 return modifiers
4347end
4448
4549function set_ad (alg:: GeneralBroyden{IJ, UR, CJ} , ad) where {IJ, UR, CJ}
4650 return GeneralBroyden {IJ, UR, CJ} (ad, alg. max_resets, alg. reset_tolerance,
47- alg. linesearch)
51+ alg. linesearch, alg . inv_alpha )
4852end
4953
5054function GeneralBroyden (; max_resets = 3 , linesearch = nothing , reset_tolerance = nothing ,
51- init_jacobian:: Val = Val (:identity ), autodiff = nothing ,
55+ init_jacobian:: Val = Val (:identity ), autodiff = nothing , alpha = 1.0 ,
5256 update_rule = Val (:good_broyden ))
5357 UR = _unwrap_val (update_rule)
5458 @assert UR ∈ (:good_broyden , :bad_broyden )
5559 IJ = _unwrap_val (init_jacobian)
5660 @assert IJ ∈ (:identity , :true_jacobian )
5761 linesearch = linesearch isa LineSearch ? linesearch : LineSearch (; method = linesearch)
5862 CJ = IJ === :true_jacobian
59- return GeneralBroyden {IJ, UR, CJ} (autodiff, max_resets, reset_tolerance, linesearch)
63+ return GeneralBroyden {IJ, UR, CJ} (autodiff, max_resets, reset_tolerance, linesearch,
64+ 1 / alpha)
6065end
6166
6267@concrete mutable struct GeneralBroydenCache{iip, IJ, UR} < :
@@ -109,7 +114,7 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg_::GeneralBroyd
109114 alg = alg_
110115 @bb du = similar (u)
111116 uf, fu_cache, jac_cache = nothing , nothing , nothing
112- J⁻¹ = __init_identity_jacobian (u, fu)
117+ J⁻¹ = __init_identity_jacobian (u, fu, alg . inv_alpha )
113118 end
114119
115120 reset_tolerance = alg. reset_tolerance === nothing ? sqrt (eps (real (eltype (u)))) :
@@ -162,7 +167,7 @@ function perform_step!(cache::GeneralBroydenCache{iip, IJ, UR}) where {iip, IJ,
162167 if IJ === :true_jacobian
163168 cache. J⁻¹ = inv (jacobian!! (cache. J⁻¹, cache))
164169 else
165- cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹)
170+ cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹, cache . alg . inv_alpha )
166171 end
167172 cache. resets += 1
168173 else
@@ -189,7 +194,7 @@ function perform_step!(cache::GeneralBroydenCache{iip, IJ, UR}) where {iip, IJ,
189194end
190195
191196function __reinit_internal! (cache:: GeneralBroydenCache ; kwargs... )
192- cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹)
197+ cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹, cache . alg . inv_alpha )
193198 cache. resets = 0
194199 return nothing
195200end
0 commit comments