Source code for pyoscode

import sys
import os
import _pyoscode
import numpy

[docs]def solve(ts, ws, gs, ti, tf, x0, dx0, t_eval=[], logw=False, logg=False, order=3, rtol=1e-4, atol=0.0, h=None, full_output="", even_grid=False, check_grid=False): """Solve a differential equation with the RKWKB method. Parameters ---------- ts: numpy.ndarray [float] or list [float] An array of real numbers representing the values of the independent variable at which the frequency and friction term are evaluated. ws: numpy.ndarray [complex] or list [complex] An array-like object of real or complex numbers, representing the values of frequency w at the points given in ts. gs: numpy.ndarray [complex] or list [complex] An array-like object of real or complex numbers representing the values of the friction term g at the points given in ts. ti,tf: float Start and end of integration range. x0, dx0: complex Initial values of the dependent variable and its derivative. t_eval: numpy.ndarray [float] or list [float] An array of times where the solution is to be returned. logw, logg: boolean, optional If true, the array of frequencies and friction values, respectively, will be exponentiated (False, False by default). order: int, optional Order of WKB approximation to use, 3 (the highest value) by default. rtol, atol: float, optional Relative and absolute tolerance of the solver, 1e-4 and 0 by default. Note that atol at the moment is not implemented. h: float, optional Size of the initial step, 1 by default. full_output: str , optional If given, the return dictionary will be written to a file with the supplied name. even_grid: boolean, optional False by default. Set this to True if the ts array is evenly spaced for faster interpolation. check_grid: boolean, optional False by default. If True, the fineness of the ws, gs grids will be checked based on how accurate linear interpolation would be on them, and a warning will be issued if this accuracy is deemed too low. It's a good idea to set this to True when solving an equation for the first time. Returns ------- A dictionary with the following keywords and values: sol: list [complex] A list containing the solution evaluated at timepoints listed under the 't' keyword. dsol: list [complex] A list containint the first deriv ative of the solution evaluated at timepoints listed under the 't' keyword. t: list [float] Contains the values of the independent variable where the solver stepped, i.e. evaluated the solution at. This is not determined by the user, rather these are the internal steps the solver naturally takes when integrating. types: list [float] A list of True/False values corresponding to the step types the solver chose at the timepoints listed under the keyword 't'. If True, the step was WKB, and RK otherwise. x_eval: list [complex] Values of the solution at the points specified in t_eval. dx_eval: list [complex] Values of the derivative of the solution at the points specified in t_eval. cts_rep: list [list [complex]] List containing a list of the polynomial coefficients needed to construct a continuous representation of the solution within each internal step the algorithm takes. """ # Set direction of integration if initial stepsize, h, not given if h==None: h = numpy.sign(tf - ti) # Handle the case of ti = tf if h==0: h=1 # Run oscode from module library resdict = _pyoscode.solve(ts, ws, gs, ti, tf, x0, dx0, t_eval=t_eval, logw=logw, logg=logg, order=order, rtol=rtol, atol=atol, h=h, full_output=full_output, even_grid=even_grid, check_grid=check_grid) return resdict
[docs]def solve_fn(w, g, ti, tf, x0, dx0, t_eval=[], order=3, rtol=1e-4, atol=0.0, h=None, full_output=""): """ Solves the differential equation x'' + 2g(t)x' + w^2(t)y = 0 for y(t) and y'(t) on an interval (ti, tf) given initial conditions [x(ti), x'(ti)] and function handles w(t), g(t). Parameters ---------- w: callable(t) Computes the frequency at point t, may return a complex number. g: callable(t) Computes the damping term at point t, may return a complex number. ti,tf: float Start and end of integration range. x0, dx0: complex Initial values of the dependent variable and its derivative. t_eval: numpy.ndarray [float] or list [float] An array of times where the solution is to be returned. order: int, optional Order of WKB approximation to use, 3 (the highest value) by default. rtol, atol: float, optional Relative and absolute tolerance of the solver, 1e-4 and 0 by default. Note that atol at the moment is not implemented. h: float, optional Size of the initial step, 1 by default. full_output: str , optional If given, the return dictionary will be written to a file with the supplied name. Returns ------- A dictionary with the following keywords and values: sol: list [complex] A list containing the solution evaluated at timepoints listed under the 't' keyword. dsol: list [complex] A list containint the first deriv ative of the solution evaluated at timepoints listed under the 't' keyword. t: list [float] Contains the values of the independent variable where the solver stepped, i.e. evaluated the solution at. This is not determined by the user, rather these are the internal steps the solver naturally takes when integrating. types: list [float] A list of True/False values corresponding to the step types the solver chose at the timepoints listed under the keyword 't'. If True, the step was WKB, and RK otherwise. x_eval: list [complex] Values of the solution at the points specified in t_eval. dx_eval: list [complex] Values of the derivative of the solution at the points specified in t_eval. cts_rep: list [list [complex]] List containing a list of the polynomial coefficients needed to construct a continuous representation of the solution within each internal step the algorithm takes. """ # Set direction of integration if initial stepsize, h, not given if h==None: h = numpy.sign(tf - ti) # Handle the case of ti = tf if h==0: h=1 # Run oscode from module library resdict = _pyoscode.solve_fn(w, g, ti, tf, x0, dx0, t_eval=t_eval, order=order, rtol=rtol, atol=atol, h=h, full_output=full_output) return resdict