How to specify the nonlinear solver algorithm for Shooting and MultipleShooting BVP solvers

SciML’s documentation suggests that the boundary value problem solvers Shooting() and MultipleShooting() should be able to use any of the NonlinearSolve.jl algorithms, but I haven’t been able to find a way to specify the nonlinear solver algorithm that doesn’t result in an error. Any suggestions?

1 Like

Can you share the code you tried and the full error message?

1 Like

The argument is nlsolve, i.e. Shooting(nlsolve = TrustRegion()).

But the bigger thing is, what is the error?

Here is a MWE, as usual based on SciML’s SimplePendulum example problem:

using BoundaryValueDiffEq
using Plots
using OrdinaryDiffEq
using NonlinearSolve #added to original example problem
const g = 9.81
L = 1.0
tspan = (0.0, pi / 2)
function simplependulum!(du, u, p, t)
    θ = u[1]
    dθ = u[2]
    du[1] = dθ
    du[2] = -(g / L) * sin(θ)
end

u₀_2 = [-1.6, -1.7] # the initial guess
function bc3!(residual, sol, p, t)
    residual[1] = sol(pi / 4)[1] + pi / 2 # use the interpolation here, since indexing will be wrong for adaptive methods
    residual[2] = sol(pi / 2)[1] - pi / 2
end
bvp3 = BVProblem(simplependulum!, bc3!, u₀_2, tspan)
sol3 = solve(bvp3, Shooting(Tsit5()); nlsolve = TrustRegion()) #modified from original example problem. Using Tsit5 rather than Vern7 and added nsolve = TrustRegion() per email from CR
plot(sol3)

And here is the error message:

        
ERROR: Unrecognized keyword arguments found.
The only allowed keyword arguments to `solve` are:
(:dense, :saveat, :save_idxs, :tstops, :tspan, :d_discontinuities, :save_everystep, :save_on, :save_start, :save_end, :initialize_save, :adaptive, :abstol, :reltol, :dt, :dtmax, :dtmin, :force_dtmin, :internalnorm, :controller, :gamma, :beta1, :beta2, :qmax, :qmin, :qsteady_min, :qsteady_max, :qoldinit, :failfactor, :calck, :alias_u0, :maxiters, :maxtime, :callback, :isoutofdomain, :unstable_check, :verbose, :merge_callbacks, :progress, :progress_steps, :progress_name, :progress_message, :progress_id, :timeseries_errors, :dense_errors, :weak_timeseries_errors, :weak_dense_errors, :wrap, :calculate_error, :initializealg, :alg, :save_noise, :delta, :seed, :alg_hints, :kwargshandle, :trajectories, :batch_size, :sensealg, :advance_to_tstop, :stop_at_next_tstop, :u0, :p, :default_set, :second_time, :prob_choice, :alias_jump, :alias_noise, :batch, :nlsolve_kwargs, :odesolve_kwargs, :linsolve_kwargs, :ensemblealg, :show_trace, :trace_level, :store_trace, :termination_condition, :alias, :fit_parameters)

See https://diffeq.sciml.ai/stable/basics/common_solver_opts/ for more details.

Unrecognized keyword arguments: [:nlsolve]



Some of the types have been truncated in the stacktrace for improved reading. To emit complete information
in the stack trace, evaluate `TruncatedStacktraces.VERBOSE[] = true` and re-run the code.

Stacktrace:
 [1] #checkkwargs#51
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:1240 [inlined]
 [2] checkkwargs
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:1237 [inlined]
 [3] #solve_call#36
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:646 [inlined]
 [4] solve_call
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:627 [inlined]
 [5] #solve_up#45
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:1205 [inlined]
 [6] solve_up
   @ C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:1183 [inlined]
 [7] solve(prob::BVProblem{…}, args::Shooting{…}; sensealg::Nothing, u0::Nothing, p::Nothing, wrap::Val{…}, kwargs::@Kwargs{…})
   @ DiffEqBase C:\Users\jbmcv\.julia\packages\DiffEqBase\qvEPa\src\solve.jl:1096
 [8] top-level scope

I had assumed that my code was at fault, but from what Chris wrote it looks like that maybe isn’t the case.

@ThermionicsGuy The solver shoud be Shooting(Tsit5(), nlsolve = TrustRegion())

see BoundaryValueDiffEqShooting · BoundaryValueDiffEq.jl

YES! That works. Thank you very much.