L i&hddlZddlmZddlmZmZmZddlm Z m Z Gdde Z Gdd e Z y) N)ode) validate_tolvalidate_first_stepwarn_extraneous) OdeSolver DenseOutputc VeZdZdZddej ddddddf fd ZdZd ZxZ S) LSODAaAdams/BDF method with automatic stiffness detection and switching. This is a wrapper to the Fortran solver from ODEPACK [1]_. It switches automatically between the nonstiff Adams method and the stiff BDF method. The method was originally detailed in [2]_. Parameters ---------- fun : callable Right-hand side of the system: the time derivative of the state ``y`` at time ``t``. The calling signature is ``fun(t, y)``, where ``t`` is a scalar and ``y`` is an ndarray with ``len(y) = len(y0)``. ``fun`` must return an array of the same shape as ``y``. See `vectorized` for more information. t0 : float Initial time. y0 : array_like, shape (n,) Initial state. t_bound : float Boundary time - the integration won't continue beyond it. It also determines the direction of the integration. first_step : float or None, optional Initial step size. Default is ``None`` which means that the algorithm should choose. min_step : float, optional Minimum allowed step size. Default is 0.0, i.e., the step size is not bounded and determined solely by the solver. max_step : float, optional Maximum allowed step size. Default is np.inf, i.e., the step size is not bounded and determined solely by the solver. rtol, atol : float and array_like, optional Relative and absolute tolerances. The solver keeps the local error estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a relative accuracy (number of correct digits), while `atol` controls absolute accuracy (number of correct decimal places). To achieve the desired `rtol`, set `atol` to be smaller than the smallest value that can be expected from ``rtol * abs(y)`` so that `rtol` dominates the allowable error. If `atol` is larger than ``rtol * abs(y)`` the number of correct digits is not guaranteed. Conversely, to achieve the desired `atol` set `rtol` such that ``rtol * abs(y)`` is always smaller than `atol`. If components of y have different scales, it might be beneficial to set different `atol` values for different components by passing array_like with shape (n,) for `atol`. Default values are 1e-3 for `rtol` and 1e-6 for `atol`. jac : None or callable, optional Jacobian matrix of the right-hand side of the system with respect to ``y``. The Jacobian matrix has shape (n, n) and its element (i, j) is equal to ``d f_i / d y_j``. The function will be called as ``jac(t, y)``. If None (default), the Jacobian will be approximated by finite differences. It is generally recommended to provide the Jacobian rather than relying on a finite-difference approximation. lband, uband : int or None Parameters defining the bandwidth of the Jacobian, i.e., ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Setting these requires your jac routine to return the Jacobian in the packed format: the returned array must have ``n`` columns and ``uband + lband + 1`` rows in which Jacobian diagonals are written. Specifically ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format is used in `scipy.linalg.solve_banded` (check for an illustration). These parameters can be also used with ``jac=None`` to reduce the number of Jacobian elements estimated by finite differences. vectorized : bool, optional Whether `fun` may be called in a vectorized fashion. False (default) is recommended for this solver. If ``vectorized`` is False, `fun` will always be called with ``y`` of shape ``(n,)``, where ``n = len(y0)``. If ``vectorized`` is True, `fun` may be called with ``y`` of shape ``(n, k)``, where ``k`` is an integer. In this case, `fun` must behave such that ``fun(t, y)[:, i] == fun(t, y[:, i])`` (i.e. each column of the returned array is the time derivative of the state corresponding with a column of ``y``). Setting ``vectorized=True`` allows for faster finite difference approximation of the Jacobian by methods 'Radau' and 'BDF', but will result in slower execution for this solver. Attributes ---------- n : int Number of equations. status : string Current status of the solver: 'running', 'finished' or 'failed'. t_bound : float Boundary time. direction : float Integration direction: +1 or -1. t : float Current time. y : ndarray Current state. t_old : float Previous time. None if no steps were made yet. nfev : int Number of evaluations of the right-hand side. njev : int Number of evaluations of the Jacobian. References ---------- .. [1] A. C. Hindmarsh, "ODEPACK, A Systematized Collection of ODE Solvers," IMACS Transactions on Scientific Computation, Vol 1., pp. 55-64, 1983. .. [2] L. Petzold, "Automatic selection of methods for solving stiff and nonstiff systems of ordinary differential equations", SIAM Journal on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148, 1983. NggMbP?gư>Fc Tt|t| ||||| |d}n t|||}||jz}|t j k(rd}n|dkr td|dkr tdt|| |j\}} t|j| }|jd|| |||| | |j|||j|jj d<|jj |jj"d<||_y)Nrz`max_step` must be positive.z`min_step` must be nonnegative.lsoda)rtolatolmax_stepmin_step first_steplbanduband)rsuper__init__r directionnpinf ValueErrorrnrfunset_integratorset_initial_valuet_bound _integratorrwork call_args _lsoda_solver)selfrt0y0r rrrrrjacrr vectorized extraneoussolver __class__s `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/scipy/integrate/_ivp/lsoda.pyrzLSODA.__init__vs#  # b"gz:  J,ZWEJdnn$ rvv H ];< < a<>? ?!$dff5 dTXXs#gDth'/J$)  8   R('+ll  #*0*<*<*B*B$$Q'#c "|j}|j}|jd}d|jd<|j|j|j xsd|j |j|j|j|j\|_|_||jd<|jrK|j|_|j |_ |jd|_|jd|_yy)Ncy)Nr3r.r-z"LSODA._step_impl..sr. )TN)FzUnexpected istate in LSODA.)r$r!r#runfr(_ytr f_params jac_params successfulyiworknjevnlu)r%r+ integratoritasks r- _step_implzLSODA._step_impls##'' $$Q'"# Q(nn HHfjj2\FIIvxx LL&//6+<+<> 68#( Q    XXDFYYDF"((,DI!''+DH7r.c|jjj}|jjj}|d}|d}t j |dd|dz|j zz|j |dzfdj}|d|kr|dddfxx||d z |zzcc<t|j|j|||S) N rF)order ) r$r!r>r"rreshapercopyLsodaDenseOutputt_oldr9)r%r>r"rIhyhs r-_dense_output_implzLSODA._dense_output_impls""..44""..44b  "I ZZbuqyDFF&:!:;+388< 9u  q"uI!eBi-E1 1I DFFAubAAr.) __name__ __module__ __qualname____doc__rrrrCrS __classcell__r,s@r-r r s6m\9=s&&t$D!$F8. Br.r c$eZdZfdZdZxZS)rOc|t|||||_||_t j |dz|_y)Nr)rrrQrRrarangep)r%rPr9rQrIrRr,s r-rzLsodaDenseOutput.__init__s4 "519%r.c|jdk(r*||jz |jz |jz}n0||jz |jz |jdddfz}t j |j |S)Nr)ndimr9rQr]rdotrR)r%r9xs r- _call_implzLsodaDenseOutput._call_implsh 66Q;dff*&4661Adff*&466!T'?:Avvdggq!!r.)rTrUrVrrbrXrYs@r-rOrOs & "r.rO) numpyrscipy.integratercommonrrrbaserr r rOr3r.r-rgs1FF(IBIIBX "{ "r.