SciML / NonlinearSolve.jl

High-performance and differentiation-enabled nonlinear solvers (Newton methods), bracketed rootfinding (bisection, Falsi), with sparsity and Newton-Krylov support.
https://docs.sciml.ai/NonlinearSolve/stable/
MIT License
216 stars 39 forks source link

Analytical Jacobian is not being used in the 3.13 version of NonlinearSolve #451

Open RayleighLord opened 3 days ago

RayleighLord commented 3 days ago

This is a duplicate from here, but I thought it might be better to ask here in GitHub.

This question came up when I did some tests related to this post.

Imagine I have the code

using NonlinearSolve

function f(u, p)
    return u^2 - 2
end

function df(u, p)
    println("Hey")
    return 2u
end

fn = NonlinearFunction(f, jac=df)
prob = NonlinearProblem(fn, 1.0)
sol = solve(prob, NewtonRaphson(; concrete_jac=true))

Running this code does not print "Hey" to the terminal, so I guess that automatic differentiation is being used to compute the jacobian instead of the given function. I noticed this behavior because in the post that I mentioned, there was an incompatible interaction between AD and QuadGK that was present even if you provide the analytical jacobian.

Is this intended behavior? How could I provide the analytical jacobian to a problem? Also, does it need to be given to NonlinearFunction always and cannot be an optional parameter to NonlinearProblem?

At least in a quick review of the documentation I did not see a clear explanation on how to provide analytical jacobians.

PD: I am using the version

  [8913a72c] NonlinearSolve v3.13.1
afossa commented 1 day ago

This bug apparently affects only scalar functions. See the thread