@@ -53,7 +53,7 @@ function solve(prob::NonlinearProblem{<:Number, iip, <:AbstractArray{<:Dual{T,V,
53
53
end
54
54
55
55
# avoid ambiguities
56
- for Alg in [Bisection, Falsi ]
56
+ for Alg in [Bisection]
57
57
@eval function solve (prob:: NonlinearProblem{uType, iip, <:Dual{T,V,P}} , alg:: $Alg , args... ; kwargs... ) where {uType, iip, T, V, P}
58
58
sol, partials = scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
59
59
return BracketingSolution (Dual {T,V,P} (sol. left, partials), Dual {T,V,P} (sol. right, partials), sol. retcode)
@@ -110,3 +110,61 @@ function solve(prob::NonlinearProblem, ::Bisection, args...; maxiters = 1000, kw
110
110
111
111
return BracketingSolution (left, right, MAXITERS_EXCEED)
112
112
end
113
+
114
+ function solve (prob:: NonlinearProblem , :: Falsi , args... ; maxiters = 1000 , kwargs... )
115
+ f = Base. Fix2 (prob. f, prob. p)
116
+ left, right = prob. u0
117
+ fl, fr = f (left), f (right)
118
+
119
+ if iszero (fl)
120
+ return BracketingSolution (left, right, EXACT_SOLUTION_LEFT)
121
+ end
122
+
123
+ i = 1
124
+ if ! iszero (fr)
125
+ while i < maxiters
126
+ if nextfloat_tdir (left, prob. u0... ) == right
127
+ return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
128
+ end
129
+ mid = (fr * left - fl * right) / (fr - fl)
130
+ for i in 1 : 10
131
+ mid = max (left, prevfloat_tdir (mid, prob. u0... ))
132
+ end
133
+ if mid == right || mid == left
134
+ break
135
+ end
136
+ fm = f (mid)
137
+ if iszero (fm)
138
+ right = mid
139
+ break
140
+ end
141
+ if sign (fl) == sign (fm)
142
+ fl = fm
143
+ left = mid
144
+ else
145
+ fr = fm
146
+ right = mid
147
+ end
148
+ i += 1
149
+ end
150
+ end
151
+
152
+ while i < maxiters
153
+ mid = (left + right) / 2
154
+ (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
155
+ fm = f (mid)
156
+ if iszero (fm)
157
+ right = mid
158
+ fr = fm
159
+ elseif sign (fm) == sign (fl)
160
+ left = mid
161
+ fl = fm
162
+ else
163
+ right = mid
164
+ fr = fm
165
+ end
166
+ i += 1
167
+ end
168
+
169
+ return BracketingSolution (left, right, MAXITERS_EXCEED)
170
+ end
0 commit comments