Skip to content

Conversation

@sjdaines
Copy link

@sjdaines sjdaines commented Aug 4, 2023

If using method = :newton with linesearch=LineSearches.Static(), adds an option to supply a function to modify Newton steps eg to restrict step length or to restrict to a region. This makes it possible to include problem-specific constraints (eg from a physical or chemical system) to increase robustness.

Adds an additional argument apply_step! (default value (x, x_old, newton_step)->(x .= x_old .+ newton_step)) to
define the function used to update the x value after the Newton iteration.

For example, apply_step! = (x, x_old, newton_step)->(x .= x_old .+ newton_step; x .= max.(x, 1e-80))
will enforce a constraint x[i] >= 1e-80 to maintain positive concentrations for a chemical kinetics problem.

sjdaines and others added 2 commits August 3, 2023 14:28
If using `method=:newton` with `linesearch=LineSearches.Static()` (the default linesearch), an additional argument
`project_region!` (default value `(x)->(nothing)`) can be used to define a function to modify the proposed new
`x` value after each Newton iteration.

For example, `project_region! = (x) -> (x .= max.(x, 1e-80))` will enforce a constraint `x[i] >= 1e-80`.
If `method = :newton` and `linesearch=LineSearches.Static()` (the default),
an additional argument `apply_step!` (default value `(x, x_old, newton_step)->(x .= x_old .+ newton_step)`)
can be used to define a function to modify the proposed new `x` value after the Newton iteration.
eg
    `apply_step! = (x, x_old, newton_step)->(x .= x_old .+ newton_step; x .= max.(x, 1e-80))`
will enforce a constraint `x[i] >= 1e-80`.
@sjdaines sjdaines changed the title Add a naive project_region! option for Newton method Add apply_step! option for Newton method Oct 12, 2023
@nichollsh
Copy link

+1 for this - it would be fantastic!

From updated README.md:

If the optional parameter `always_step = false` (the default), no Newton iteration is performed
if the solution is already converged for the supplied initial `x` values,  and the supplied initial `x` is returned
in the `zero` field of `SolverResults`. If `always_step = true`, a Newton step is performed
before testing for convergence.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants