1
1
# Sadly `Broyden` is taken up by SimpleNonlinearSolve.jl
2
2
"""
3
3
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 )
5
5
6
6
An implementation of `Broyden` with resetting and line search.
7
7
@@ -16,6 +16,8 @@ An implementation of `Broyden` with resetting and line search.
16
16
used here directly, and they will be converted to the correct `LineSearch`. It is
17
17
recommended to use [LiFukushimaLineSearch](@ref) -- a derivative free linesearch
18
18
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`.
19
21
- `init_jacobian`: the method to use for initializing the jacobian. Defaults to using the
20
22
identity matrix (`Val(:identitiy)`). Alternatively, can be set to `Val(:true_jacobian)`
21
23
to use the true jacobian as initialization.
@@ -33,30 +35,33 @@ An implementation of `Broyden` with resetting and line search.
33
35
max_resets:: Int
34
36
reset_tolerance
35
37
linesearch
38
+ inv_alpha
36
39
end
37
40
38
- function __alg_print_modifiers (:: GeneralBroyden{IJ, UR} ) where {IJ, UR}
41
+ function __alg_print_modifiers (alg :: GeneralBroyden{IJ, UR} ) where {IJ, UR}
39
42
modifiers = String[]
40
43
IJ != = :identity && push! (modifiers, " init_jacobian = :$(IJ) " )
41
44
UR != = :good_broyden && push! (modifiers, " update_rule = :$(UR) " )
45
+ alg. inv_alpha != 1 && push! (modifiers, " alpha = $(1 / alg. inv_alpha) " )
42
46
return modifiers
43
47
end
44
48
45
49
function set_ad (alg:: GeneralBroyden{IJ, UR, CJ} , ad) where {IJ, UR, CJ}
46
50
return GeneralBroyden {IJ, UR, CJ} (ad, alg. max_resets, alg. reset_tolerance,
47
- alg. linesearch)
51
+ alg. linesearch, alg . inv_alpha )
48
52
end
49
53
50
54
function 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 ,
52
56
update_rule = Val (:good_broyden ))
53
57
UR = _unwrap_val (update_rule)
54
58
@assert UR ∈ (:good_broyden , :bad_broyden )
55
59
IJ = _unwrap_val (init_jacobian)
56
60
@assert IJ ∈ (:identity , :true_jacobian )
57
61
linesearch = linesearch isa LineSearch ? linesearch : LineSearch (; method = linesearch)
58
62
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)
60
65
end
61
66
62
67
@concrete mutable struct GeneralBroydenCache{iip, IJ, UR} < :
@@ -109,7 +114,7 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg_::GeneralBroyd
109
114
alg = alg_
110
115
@bb du = similar (u)
111
116
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 )
113
118
end
114
119
115
120
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,
162
167
if IJ === :true_jacobian
163
168
cache. J⁻¹ = inv (jacobian!! (cache. J⁻¹, cache))
164
169
else
165
- cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹)
170
+ cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹, cache . alg . inv_alpha )
166
171
end
167
172
cache. resets += 1
168
173
else
@@ -189,7 +194,7 @@ function perform_step!(cache::GeneralBroydenCache{iip, IJ, UR}) where {iip, IJ,
189
194
end
190
195
191
196
function __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 )
193
198
cache. resets = 0
194
199
return nothing
195
200
end
0 commit comments