@@ -42,28 +42,8 @@ function SciMLBase.__solve(prob::NonlinearProblem,
4242 maxiters = 1000 , kwargs... )
4343 f = Base. Fix2 (prob. f, prob. p)
4444 x = float (prob. u0)
45- # Defining all derivative expressions in one place before the iterations
4645 if isa (x, AbstractArray)
47- if alg_autodiff (alg)
48- n = length (x)
49- a_dfdx (x) = ForwardDiff. jacobian (f, x)
50- a_d2fdx (x) = ForwardDiff. jacobian (a_dfdx, x)
51- A = Array {Union{Nothing, Number}} (nothing , n, n)
52- # fx = f(x)
53- else
54- n = length (x)
55- f_dfdx (x) = FiniteDiff. finite_difference_jacobian (f, x, diff_type (alg), eltype (x))
56- f_d2fdx (x) = FiniteDiff. finite_difference_jacobian (f_dfdx, x, diff_type (alg), eltype (x))
57- A = Array {Union{Nothing, Number}} (nothing , n, n)
58- end
59- elseif isa (x, Number)
60- if alg_autodiff (alg)
61- sa_dfdx (x) = ForwardDiff. derivative (f, x)
62- sa_d2fdx (x) = ForwardDiff. derivative (sa_dfdx, x)
63- else
64- sf_dfdx (x) = FiniteDiff. finite_difference_derivative (f, x, diff_type (alg), eltype (x))
65- sf_d2fdx (x) = FiniteDiff. finite_difference_derivative (sf_dfdx, x, diff_type (alg), eltype (x))
66- end
46+ n = length (x)
6747 end
6848 T = typeof (x)
6949
@@ -85,34 +65,30 @@ function SciMLBase.__solve(prob::NonlinearProblem,
8565 if alg_autodiff (alg)
8666 if isa (x, Number)
8767 fx = f (x)
88- dfx = sa_dfdx ( x)
89- d2fx = sa_d2fdx ( x)
68+ dfx = ForwardDiff . derivative (f, x)
69+ d2fx = ForwardDiff . derivative (x -> ForwardDiff . derivative (f, x), x)
9070 else
9171 fx = f (x)
92- dfx = a_dfdx ( x)
93- d2fx = reshape ( a_d2fdx (x), (n,n,n)) # A 3-dim Hessian Tensor
72+ dfx = ForwardDiff . jacobian (f, x)
73+ d2fx = ForwardDiff . jacobian (x -> ForwardDiff . jacobian (f, x), x) # n^2 by n matrix
9474 ai = - (dfx \ fx)
95- for j in 1 : n
96- tmp = transpose (d2fx[:, :, j] * ai)
97- A[j, :] = tmp
98- end
75+ A = reshape (d2fx * ai, (n, n))
9976 bi = (dfx) \ (A * ai)
10077 ci = (ai .* ai) ./ (ai .+ (0.5 .* bi))
10178 end
10279 else
10380 if isa (x, Number)
10481 fx = f (x)
105- dfx = sf_dfdx (x)
106- d2fx = sf_d2fdx (x)
82+ dfx = FiniteDiff. finite_difference_derivative (f, x, diff_type (alg), eltype (x))
83+ d2fx = FiniteDiff. finite_difference_derivative (x -> FiniteDiff. finite_difference_derivative (f, x), x,
84+ diff_type (alg), eltype (x))
10785 else
10886 fx = f (x)
109- dfx = f_dfdx (x)
110- d2fx = reshape (f_d2fdx (x), (n,n,n)) # A 3-dim Hessian Tensor
87+ dfx = FiniteDiff. finite_difference_jacobian (f, x, diff_type (alg), eltype (x))
88+ d2fx = FiniteDiff. finite_difference_jacobian (x -> FiniteDiff. finite_difference_jacobian (f, x), x,
89+ diff_type (alg), eltype (x))
11190 ai = - (dfx \ fx)
112- for j in 1 : n
113- tmp = transpose (d2fx[:, :, j] * ai)
114- A[j, :] = tmp
115- end
91+ A = reshape (d2fx * ai, (n, n))
11692 bi = (dfx) \ (A * ai)
11793 ci = (ai .* ai) ./ (ai .+ (0.5 .* bi))
11894 end
0 commit comments