Source code for pynleq2
# -*- coding: utf-8 -*-
from __future__ import (absolute_import, division, print_function)
import numpy as np
from .nleq2 import nleq2
[docs]def solve(func, jacfunc, guess, maxiter=100):
"""
Solves a system of nonlinear equations using the NLEQ2 Fortran code
Parameters
----------
func: callback
signature (xvector, ifail) -> (fvector, ifail)
jacfunc: callback
signature
"""
guess = np.asarray(guess, dtype=np.float64)
x0 = guess.copy()
s_scale = guess.copy()
N = len(x0)
iwk = np.zeros((N+52), 'i')
rwk_len = N*(N + max(N, 10) + 15) + 61
rwk = np.zeros(rwk_len, 'd')
iopt = np.zeros(50, 'i')
rtol = np.finfo(np.float64).eps*10*N
iopt[2] = 1 # User supplied jacobian
iopt[11] = 6
iopt[13] = 6
iopt[15] = 6
iopt[30] = 4
iopt[31] = 1
iwk[30] = maxiter
ierr = 0
idx = 0
while True:
res, s_scale, rtol, iopt, ierr = nleq2(func, jacfunc, x0, s_scale,
rtol, iopt, iwk, rwk)
if ierr == 0:
break # success
elif ierr == 21:
print('negative rtol')
break
elif ierr == 2:
print('nitmax reached')
break
idx += 1
return res, ierr