SplitNewton
Bounded, SPLIT Newton with pseudo-transient continuation and backtracking
Good for ill-conditioned problems where there are two different sets of systems
Particular applications include
- Fast-Slow Reaction-Diffusion systems
- CFD - Pressure-Velocity coupling
What does 'split' mean?
The system is divided into multiple segments, and for ease of communication, let’s refer to the first segment of variables as "outer" and the remaining as "inner".
-
Holding the outer variables fixed, Newton iteration is performed recursively for the inner variables, using the sub-Jacobian associated with them, until convergence is reached.
-
One Newton step is then performed for the outer variables, while the inner variables are kept fixed, using the sub-Jacobian for the outer subsystem.
-
This process is repeated, alternating between solving the inner and outer subsystems, until the convergence criterion for the entire system (similar to standard Newton) is met.
Example:
Consider a system of 5 variables, with the split locations at indices [1, 4]. This results in the following segments:
a1(variables from 0 to 1)a2 a3 a4(variables from 1 to 4)a5(variable at index 4)
-
First, the innermost segment
a5is solved recursively using Newton's method while holding the variablesa1anda2 a3 a4) fixed. This step is repeated until the convergence criterion fora5is met. -
Next, one Newton step is taken for the segment
a2 a3 a4, witha5held fixed. This step is followed by solvinga5again till convergence. -
This alternating process repeats: solving for
a5until convergence, then one step fora2 a3 a4, and so on, until all subsystems converge.
Finally, one Newton step is performed for a1, with the other segments fixed. This completes one cycle of the split Newton process.
How to install and execute?
Just run
pip install splitnewton
There is an examples folder that contains a test function and driver program
How good is this?
Consider the test problem
$\lambda_{a} = 10^{6}$, $\lambda_{b} = 10^{2}$ with the second system, $\lambda_{c} = 10^{-1}$ $\lambda_{d} = 10^{-4}$ and third system, $\lambda_{c} = 10^{-6}$ $\lambda_{d} = 10^{-8}$
and using logspace for variation in $\lambda_{i}$
$$ F(u) = \lambda_{a} u^{4}{1} + ... + \lambda{b} u^{4}{\lfloor N/3 \rfloor} + \lambda{c} u^{4}{\lceil N/3 \rceil} + ... + \lambda{d} u^{4}{\lfloor 2N/3 \rfloor} + \lambda{e} u^{4}{\lceil 2N/3 \rceil} + ... + \lambda{f} u^{4}_{N}$$
$$ J(u) = 3 \times \begin{bmatrix} \lambda_a & \dots & 0 & 0 & \dots & 0 & 0 & \dots & 0 \ \vdots & \ddots & \vdots & \vdots & \ddots & \vdots & \vdots & \ddots & \vdots \ 0 & \dots & \lambda_b & 0 & \dots & 0 & 0 & \dots & 0 \ 0 & \dots & 0 & \lambda_c & \dots & 0 & 0 & \dots & 0 \ \vdots & \ddots & \vdots & \vdots & \ddots & \vdots & \vdots & \ddots & \vdots \ 0 & \dots & 0 & 0 & \dots & \lambda_d & 0 & \dots & 0 \ 0 & \dots & 0 & 0 & \dots & 0 & \lambda_e & \dots & 0 \ \vdots & \ddots & \vdots & \vdots & \ddots & \vdots & \vdots & \ddots & \vdots \ 0 & \dots & 0 & 0 & \dots & 0 & 0 & \dots & \lambda_f \end{bmatrix} \cdot u^2 $$
For N=5000 (with no backtracking and pseudo-transient continuation),
| Method | Time | Iterations |
|---|---|---|
| Split Newton | 34 seconds | 33 |
| Newton | not converged > 1 min | NA |
How to test?
You can run tests with the pytest framework using python -m pytest
The coverage reports can be generated with pytest-cov plugin using python -m pytest --cov=splitnewton
Whom to contact?
Please direct your queries to gpavanb1 for any questions.
Citing
If you are using SplitNewton in any scientific work, please make sure to cite as follows
@software{pavan_b_govindaraju_2025_14782293,
author = {Pavan B Govindaraju},
title = {gpavanb1/SplitNewton: v0.3.1},
month = jan,
year = 2025,
publisher = {Zenodo},
version = {v0.3.1},
doi = {10.5281/zenodo.14782293},
url = {https://doi.org/10.5281/zenodo.14782293},
}
Release files for SplitNewton 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| SplitNewton-0.3.1.tar.gz | 6.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| SplitNewton-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.8 kB
Release files / SplitNewton-0.3.1.tar.gz
| Download URL | SplitNewton-0.3.1.tar.gz |
|---|---|
| Size | 6.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9a397bc659ac681fb7b04002620579df46ad108f04a0ff1e5bbecf57851c0295
|
|
BLAKE2b-256 checksum How to use checksums |
4db0e2679e62e01e8480c4a954c60737edfe232cec5d960c121844d5763726e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.1
|
Release files / SplitNewton-0.3.1-py3-none-any.whl
| Download URL | SplitNewton-0.3.1-py3-none-any.whl |
|---|---|
| Size | 7.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
27597f37492b5acaf3b515ed7604c67e47c3c5f887154da3215ca047279a8802
|
|
BLAKE2b-256 checksum How to use checksums |
a19d5c092e5e77743ad9a412c4b8a5e808563ea034ae812abcc099fe59dde76c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.1
|