@@ -19,6 +19,39 @@ function solve(prob::NonlinearProblem{<:Number}, ::NewtonRaphson, args...; xatol
19
19
return NewtonSolution (x, MAXITERS_EXCEED)
20
20
end
21
21
22
+ function solve (prob:: NonlinearProblem{uType, iip, <:ForwardDiff.Dual{T,V,P}} , alg:: Bisection , args... ; kwargs... ) where {uType, iip, T, V, P}
23
+ prob_nodual = NonlinearProblem (prob. f, prob. u0, ForwardDiff. value (prob. p); prob. kwargs... )
24
+ sol = solve (prob_nodual, alg, args... ; kwargs... )
25
+ # f, x and p always satisfy
26
+ # f(x, p) = 0
27
+ # dx * f_x(x, p) + dp * f_p(x, p) = 0
28
+ # dx / dp = - f_p(x, p) / f_x(x, p)
29
+ f_p = (p) -> prob. f (sol. left, p)
30
+ f_x = (x) -> prob. f (x, ForwardDiff. value (prob. p))
31
+ d_p = ForwardDiff. derivative (f_p, ForwardDiff. value (prob. p))
32
+ d_x = ForwardDiff. derivative (f_x, sol. left)
33
+ partials = - d_p / d_x * ForwardDiff. partials (prob. p)
34
+ return BracketingSolution (ForwardDiff. Dual {T,V,P} (sol. left, partials), ForwardDiff. Dual {T,V,P} (sol. right, partials), sol. retcode)
35
+ end
36
+
37
+ # still WIP
38
+ function solve (prob:: NonlinearProblem{uType, iip, <:AbstractArray{<:ForwardDiff.Dual{T,V,P}, N}} , alg:: Bisection , args... ; kwargs... ) where {uType, iip, T, V, P, N}
39
+ p_nodual = ForwardDiff. value .(prob. p)
40
+ prob_nodual = NonlinearProblem (prob. f, prob. u0, p_nodual; prob. kwargs... )
41
+ sol = solve (prob_nodual, alg, args... ; kwargs... )
42
+ # f, x and p always satisfy
43
+ # f(x, p) = 0
44
+ # dx * f_x(x, p) + dp * f_p(x, p) = 0
45
+ # dx / dp = - f_p(x, p) / f_x(x, p)
46
+ f_p = (p) -> [ prob. f (sol. left, p) ]
47
+ f_x = (x) -> prob. f (x, p_nodual)
48
+ d_p = ForwardDiff. jacobian (f_p, p_nodual)
49
+ d_x = ForwardDiff. derivative (f_x, sol. left)
50
+ @. d_p = - d_p / d_x
51
+ @show ForwardDiff. partials .(prob. p)
52
+ return ForwardDiff. Dual {T,V,P} (sol. left, d_p * ForwardDiff. partials .(prob. p))
53
+ end
54
+
22
55
function solve (prob:: NonlinearProblem , :: Bisection , args... ; maxiters = 1000 , kwargs... )
23
56
f = Base. Fix2 (prob. f, prob. p)
24
57
left, right = prob. u0
0 commit comments