1
1
function SciMLBase. solve (prob:: NonlinearProblem{<:Number} , alg:: NewtonRaphson , args... ; xatol = nothing , xrtol = nothing , maxiters = 1000 , kwargs... )
2
2
f = Base. Fix2 (prob. f, prob. p)
3
3
x = float (prob. u0)
4
+ fx = float (prob. u0)
4
5
T = typeof (x)
5
6
atol = xatol != = nothing ? xatol : oneunit (T) * (eps (one (T)))^ (4 // 5 )
6
7
rtol = xrtol != = nothing ? xrtol : eps (one (T))^ (4 // 5 )
@@ -13,15 +14,15 @@ function SciMLBase.solve(prob::NonlinearProblem{<:Number}, alg::NewtonRaphson, a
13
14
fx = f (x)
14
15
dfx = FiniteDiff. finite_difference_derivative (f, x, alg. diff_type, eltype (x), fx)
15
16
end
16
- iszero (fx) && return NewtonSolution (x, DEFAULT)
17
+ iszero (fx) && return NewtonSolution (x, DEFAULT, fx )
17
18
Δx = dfx \ fx
18
19
x -= Δx
19
20
if isapprox (x, xo, atol= atol, rtol= rtol)
20
- return NewtonSolution (x, DEFAULT)
21
+ return NewtonSolution (x, DEFAULT, fx )
21
22
end
22
23
xo = x
23
24
end
24
- return NewtonSolution (x, MAXITERS_EXCEED)
25
+ return NewtonSolution (x, MAXITERS_EXCEED, fx )
25
26
end
26
27
27
28
function scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
50
51
51
52
function SciMLBase. solve (prob:: NonlinearProblem{<:Number, iip, <:Dual{T,V,P}} , alg:: NewtonRaphson , args... ; kwargs... ) where {iip, T, V, P}
52
53
sol, partials = scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
53
- return NewtonSolution (Dual {T,V,P} (sol. u, partials), sol. retcode)
54
+ return NewtonSolution (Dual {T,V,P} (sol. u, partials), sol. retcode, sol . resid )
54
55
end
55
56
function SciMLBase. solve (prob:: NonlinearProblem{<:Number, iip, <:AbstractArray{<:Dual{T,V,P}}} , alg:: NewtonRaphson , args... ; kwargs... ) where {iip, T, V, P}
56
57
sol, partials = scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
57
- return NewtonSolution (Dual {T,V,P} (sol. u, partials), sol. retcode)
58
+ return NewtonSolution (Dual {T,V,P} (sol. u, partials), sol. retcode, sol . resid )
58
59
end
59
60
60
61
# avoid ambiguities
61
62
for Alg in [Bisection]
62
63
@eval function SciMLBase. solve (prob:: NonlinearProblem{uType, iip, <:Dual{T,V,P}} , alg:: $Alg , args... ; kwargs... ) where {uType, iip, T, V, P}
63
64
sol, partials = scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
64
- return BracketingSolution (Dual {T,V,P} (sol. left, partials), Dual {T,V,P} (sol. right, partials), sol. retcode)
65
+ return BracketingSolution (Dual {T,V,P} (sol. left, partials), Dual {T,V,P} (sol. right, partials), sol. retcode, sol . resid )
65
66
end
66
67
@eval function SciMLBase. solve (prob:: NonlinearProblem{uType, iip, <:AbstractArray{<:Dual{T,V,P}}} , alg:: $Alg , args... ; kwargs... ) where {uType, iip, T, V, P}
67
68
sol, partials = scalar_nlsolve_ad (prob, alg, args... ; kwargs... )
68
- return BracketingSolution (Dual {T,V,P} (sol. left, partials), Dual {T,V,P} (sol. right, partials), sol. retcode)
69
+ return BracketingSolution (Dual {T,V,P} (sol. left, partials), Dual {T,V,P} (sol. right, partials), sol. retcode, sol . resid )
69
70
end
70
71
end
71
72
@@ -75,14 +76,14 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
75
76
fl, fr = f (left), f (right)
76
77
77
78
if iszero (fl)
78
- return BracketingSolution (left, right, EXACT_SOLUTION_LEFT)
79
+ return BracketingSolution (left, right, EXACT_SOLUTION_LEFT,fl )
79
80
end
80
81
81
82
i = 1
82
83
if ! iszero (fr)
83
84
while i < maxiters
84
85
mid = (left + right) / 2
85
- (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
86
+ (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT, fl )
86
87
fm = f (mid)
87
88
if iszero (fm)
88
89
right = mid
@@ -101,7 +102,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
101
102
102
103
while i < maxiters
103
104
mid = (left + right) / 2
104
- (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
105
+ (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT, fl )
105
106
fm = f (mid)
106
107
if iszero (fm)
107
108
right = mid
@@ -113,7 +114,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
113
114
i += 1
114
115
end
115
116
116
- return BracketingSolution (left, right, MAXITERS_EXCEED)
117
+ return BracketingSolution (left, right, MAXITERS_EXCEED,fl )
117
118
end
118
119
119
120
function SciMLBase. solve (prob:: NonlinearProblem , :: Falsi , args... ; maxiters = 1000 , kwargs... )
@@ -122,14 +123,14 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
122
123
fl, fr = f (left), f (right)
123
124
124
125
if iszero (fl)
125
- return BracketingSolution (left, right, EXACT_SOLUTION_LEFT)
126
+ return BracketingSolution (left, right, EXACT_SOLUTION_LEFT,fl )
126
127
end
127
128
128
129
i = 1
129
130
if ! iszero (fr)
130
131
while i < maxiters
131
132
if nextfloat_tdir (left, prob. u0... ) == right
132
- return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
133
+ return BracketingSolution (left, right, FLOATING_POINT_LIMIT, fx )
133
134
end
134
135
mid = (fr * left - fl * right) / (fr - fl)
135
136
for i in 1 : 10
@@ -156,7 +157,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
156
157
157
158
while i < maxiters
158
159
mid = (left + right) / 2
159
- (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT)
160
+ (mid == left || mid == right) && return BracketingSolution (left, right, FLOATING_POINT_LIMIT, fl )
160
161
fm = f (mid)
161
162
if iszero (fm)
162
163
right = mid
@@ -171,5 +172,5 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
171
172
i += 1
172
173
end
173
174
174
- return BracketingSolution (left, right, MAXITERS_EXCEED)
175
+ return BracketingSolution (left, right, MAXITERS_EXCEED,fl )
175
176
end
0 commit comments