Source code for naginterfaces.library.inteq

# -*- coding: utf-8 -*-
r"""
Module Summary
--------------
Interfaces for the NAG Mark 27.3 `inteq` Chapter.

``inteq`` - Integral Equations

This module is concerned with the numerical solution of integral equations.
Provision will be made for most of the standard types of equation (see `Background to the Problems <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05intro.html#background>`__).
The following are, however, specifically excluded:

(a) Equations arising in the solution of partial differential equations by integral equation methods. In cases where the prime purpose of an algorithm is the solution of a partial differential equation it will normally be included in submodule :mod:`~naginterfaces.library.pde`.

(#) Calculation of inverse integral transforms. This problem falls within the scope of submodule :mod:`~naginterfaces.library.sum`.

Functionality Index
-------------------

**Fredholm equation of second kind**

  linear

    nonsingular discontinuous or 'split' kernel: :meth:`fredholm2_split`

    nonsingular smooth kernel: :meth:`fredholm2_smooth`

**Volterra equation of first kind**

  nonlinear

    weakly-singular

      convolution equation (Abel): :meth:`abel1_weak`

**Volterra equation of second kind**

  nonlinear

    nonsingular

      convolution equation: :meth:`volterra2`

    weakly-singular

      convolution equation (Abel): :meth:`abel2_weak`

**Weight generating functions**

  weights for general solution of Volterra equations: :meth:`volterra_weights`

  weights for general solution of Volterra equations with weakly-singular kernel: :meth:`abel_weak_weights`

For full information please refer to the NAG Library document

https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05intro.html
"""

# NAG Copyright 2017-2021.

from __future__ import absolute_import

from math import sqrt

from ..library import machine

[docs]def fredholm2_split(lamda, a, b, k1, k2, g, n, ind, data=None): r""" ``fredholm2_split`` solves a linear, nonsingular Fredholm equation of the second kind with a split kernel. .. _d05aa-py2-py-doc: For full information please refer to the NAG Library document for d05aa https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05aaf.html .. _d05aa-py2-py-parameters: **Parameters** **lamda** : float The value of the parameter :math:`\lambda` of the integral equation. **a** : float :math:`a`, the lower limit of integration. **b** : float :math:`b`, the upper limit of integration. **k1** : callable retval = k1(x, s, data=None) :math:`\mathrm{k1}` must evaluate the kernel :math:`k\left(x, s\right) = k_1\left(x, s\right)` of the integral equation for :math:`a\leq s\leq x`. **Parameters** **x** : float The values of :math:`x` and :math:`s` at which :math:`k_1\left(x, s\right)` is to be evaluated. **s** : float The values of :math:`x` and :math:`s` at which :math:`k_1\left(x, s\right)` is to be evaluated. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of the kernel :math:`k\left(x, s\right) = k_1\left(x, s\right)` evaluated at :math:`\mathrm{x}` and :math:`\mathrm{s}`. **k2** : callable retval = k2(x, s, data=None) :math:`\mathrm{k2}` must evaluate the kernel :math:`k\left(x, s\right) = k_2\left(x, s\right)` of the integral equation for :math:`x < s\leq b`. **Parameters** **x** : float The values of :math:`x` and :math:`s` at which :math:`k_2\left(x, s\right)` is to be evaluated. **s** : float The values of :math:`x` and :math:`s` at which :math:`k_2\left(x, s\right)` is to be evaluated. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of the kernel :math:`k\left(x, s\right) = k_2\left(x, s\right)` evaluated at :math:`\mathrm{x}` and :math:`\mathrm{s}`. **g** : callable retval = g(x, data=None) :math:`\mathrm{g}` must evaluate the function :math:`g\left(x\right)` for :math:`a\leq x\leq b`. **Parameters** **x** : float The values of :math:`x` at which :math:`g\left(x\right)` is to be evaluated. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`g\left(x\right)` evaluated at :math:`\mathrm{x}`. **n** : int The number of terms in the Chebyshev series required to approximate :math:`f\left(x\right)`. **ind** : int Determines the forms of the kernel, :math:`k\left(x, s\right)`, and the function :math:`g\left(x\right)`. :math:`\mathrm{ind} = 0` :math:`k\left(x, s\right)` is not centro-symmetric (or no account is to be taken of centro-symmetry). :math:`\mathrm{ind} = 1` :math:`k\left(x, s\right)` is centro-symmetric and :math:`g\left(x\right)` is odd. :math:`\mathrm{ind} = 2` :math:`k\left(x, s\right)` is centro-symmetric and :math:`g\left(x\right)` is even. :math:`\mathrm{ind} = 3` :math:`k\left(x, s\right)` is centro-symmetric but :math:`g\left(x\right)` is neither odd nor even. **data** : arbitrary, optional User-communication data for callback functions. **Returns** **f** : float, ndarray, shape :math:`\left(\mathrm{n}\right)` The approximate values :math:`f_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{n}`, of :math:`f\left(x\right)` evaluated at the first :math:`\mathrm{n}` of :math:`m+1` Chebyshev points :math:`x_i`, (see :ref:`Notes <d05aa-py2-py-notes>`). If :math:`\mathrm{ind} = 0` or :math:`3`, :math:`m = \mathrm{n}-1`. If :math:`\mathrm{ind} = 1`, :math:`m = 2\times \mathrm{n}`. If :math:`\mathrm{ind} = 2`, :math:`m = 2\times \mathrm{n}-1`. **c** : float, ndarray, shape :math:`\left(\mathrm{n}\right)` The coefficients :math:`c_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{n}`, of the Chebyshev series approximation to :math:`f\left(x\right)`. If :math:`\mathrm{ind} = 1` this series contains polynomials of odd order only and if :math:`\mathrm{ind} = 2` the series contains even order polynomials only. .. _d05aa-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{n} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{a} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{b} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{b} > \mathrm{a}`. (`errno` :math:`2`) A failure has occurred due to proximity of an eigenvalue. .. _d05aa-py2-py-notes: **Notes** ``fredholm2_split`` solves an integral equation of the form .. math:: f\left(x\right)-\lambda \int_a^bk\left(x, s\right)f\left(s\right){ds} = g\left(x\right) for :math:`a\leq x\leq b`, when the kernel :math:`k` is defined in two parts: :math:`k = k_1` for :math:`a\leq s\leq x` and :math:`k = k_2` for :math:`x < s\leq b`. The method used is that of El--Gendi (1969) for which, it is important to note, each of the functions :math:`k_1` and :math:`k_2` must be defined, smooth and nonsingular, for all :math:`x` and :math:`s` in the interval :math:`\left[a, b\right]`. An approximation to the solution :math:`f\left(x\right)` is found in the form of an :math:`n` term Chebyshev series :math:`{\sum^\prime}_{{i = 1}}^nc_iT_i\left(x\right)`, where :math:`{}^{\prime }` indicates that the first term is halved in the sum. The coefficients :math:`c_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,n`, of this series are determined directly from approximate values :math:`f_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,n`, of the function :math:`f\left(x\right)` at the first :math:`n` of a set of :math:`m+1` Chebyshev points: .. math:: x_i = \frac{1}{2}\left(a+b+\left(b-a\right)\cos\left[\left(i-1\right)\pi /m\right]\right)\text{, }\quad i = 1,2,\ldots,m+1\text{.} The values :math:`f_i` are obtained by solving simultaneous linear algebraic equations formed by applying a quadrature formula (equivalent to the scheme of Clenshaw and Curtis (1960)) to the integral equation at the above points. In general :math:`m = n-1`. However, if the kernel :math:`k` is centro-symmetric in the interval :math:`\left[a, b\right]`, i.e., if :math:`k\left(x, s\right) = k\left({a+b-x}, {a+b-s}\right)`, then the function is designed to take advantage of this fact in the formation and solution of the algebraic equations. In this case, symmetry in the function :math:`g\left(x\right)` implies symmetry in the function :math:`f\left(x\right)`. In particular, if :math:`g\left(x\right)` is even about the mid-point of the range of integration, then so also is :math:`f\left(x\right)`, which may be approximated by an even Chebyshev series with :math:`m = 2n-1`. Similarly, if :math:`g\left(x\right)` is odd about the mid-point then :math:`f\left(x\right)` may be approximated by an odd series with :math:`m = 2n`. .. _d05aa-py2-py-references: **References** Clenshaw, C W and Curtis, A R, 1960, `A method for numerical integration on an automatic computer`, Numer. Math. (2), 197--205 El--Gendi, S E, 1969, `Chebyshev solution of differential, integral and integro-differential equations`, Comput. J. (12), 282--287 """ raise NotImplementedError
[docs]def fredholm2_smooth(k, g, lamda, a, b, odorev, ev, n, data=None): r""" ``fredholm2_smooth`` solves any linear nonsingular Fredholm integral equation of the second kind with a smooth kernel. .. _d05ab-py2-py-doc: For full information please refer to the NAG Library document for d05ab https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05abf.html .. _d05ab-py2-py-parameters: **Parameters** **k** : callable retval = k(x, s, data=None) :math:`\mathrm{k}` must compute the value of the kernel :math:`k\left(x, s\right)` of the integral equation over the square :math:`a\leq x\leq b`, :math:`a\leq s\leq b`. **Parameters** **x** : float The values of :math:`x` and :math:`s` at which :math:`k\left(x, s\right)` is to be calculated. **s** : float The values of :math:`x` and :math:`s` at which :math:`k\left(x, s\right)` is to be calculated. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of the kernel :math:`k\left(x, s\right)` evaluated at :math:`\mathrm{x}` and :math:`\mathrm{s}`. **g** : callable retval = g(x, data=None) :math:`\mathrm{g}` must compute the value of the function :math:`g\left(x\right)` of the integral equation in the interval :math:`a\leq x\leq b`. **Parameters** **x** : float The value of :math:`x` at which :math:`g\left(x\right)` is to be calculated. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`g\left(x\right)` evaluated at :math:`\mathrm{x}`. **lamda** : float The value of the parameter :math:`\lambda` of the integral equation. **a** : float :math:`a`, the lower limit of integration. **b** : float :math:`b`, the upper limit of integration. **odorev** : bool Indicates whether it is known that the solution :math:`f\left(x\right)` is odd or even about the mid-point of the range of integration. If :math:`\mathrm{odorev}` is :math:`\mathbf{True}` then an odd or even solution is sought depending upon the value of :math:`\mathrm{ev}`. **ev** : bool Is ignored if :math:`\mathrm{odorev}` is :math:`\mathbf{False}`. Otherwise, if :math:`\mathrm{ev}` is :math:`\mathbf{True}`, an even solution is sought, whilst if :math:`\mathrm{ev}` is :math:`\mathbf{False}`, an odd solution is sought. **n** : int The number of terms in the Chebyshev series which approximates the solution :math:`f\left(x\right)`. **data** : arbitrary, optional User-communication data for callback functions. **Returns** **f** : float, ndarray, shape :math:`\left(\mathrm{n}\right)` The approximate values :math:`f_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{n}`, of the function :math:`f\left(x\right)` at the first :math:`\mathrm{n}` of :math:`m+1` Chebyshev points (see :ref:`Notes <d05ab-py2-py-notes>`), where .. rst-class:: nag-rules-none nag-align-left +-------------------------+------------------------------------------------------------------------------------+ |:math:`m = 2\mathrm{n}-1`|if :math:`\mathrm{odorev} = \mathbf{True}` and :math:`\mathrm{ev} = \mathbf{True}`. | +-------------------------+------------------------------------------------------------------------------------+ |:math:`m = 2\mathrm{n}` |if :math:`\mathrm{odorev} = \mathbf{True}` and :math:`\mathrm{ev} = \mathbf{False}`.| +-------------------------+------------------------------------------------------------------------------------+ |:math:`m = \mathrm{n}-1` |if :math:`\mathrm{odorev} = \mathbf{False}`. | +-------------------------+------------------------------------------------------------------------------------+ **c** : float, ndarray, shape :math:`\left(\mathrm{n}\right)` The coefficients :math:`c_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{n}`, of the Chebyshev series approximation to :math:`f\left(x\right)`. When :math:`\mathrm{odorev}` is :math:`\mathbf{True}`, this series contains polynomials of even order only or of odd order only, according to :math:`\mathrm{ev}` being :math:`\mathbf{True}` or :math:`\mathbf{False}` respectively. .. _d05ab-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{n} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{a} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{b} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{b} > \mathrm{a}`. (`errno` :math:`2`) A failure has occurred due to proximity of an eigenvalue. .. _d05ab-py2-py-notes: **Notes** ``fredholm2_smooth`` uses the method of El--Gendi (1969) to solve an integral equation of the form .. math:: f\left(x\right)-\lambda \int_a^bk\left(x, s\right)f\left(s\right){ds} = g\left(x\right) for the function :math:`f\left(x\right)` in the range :math:`a\leq x\leq b`. An approximation to the solution :math:`f\left(x\right)` is found in the form of an :math:`n` term Chebyshev series :math:`{\sum^\prime}_{{i = 1}}^nc_iT_i\left(x\right)`, where :math:`{}^{\prime }` indicates that the first term is halved in the sum. The coefficients :math:`c_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,n`, of this series are determined directly from approximate values :math:`f_{\textit{i}}`, for :math:`\textit{i} = 1,2,\ldots,n`, of the function :math:`f\left(x\right)` at the first :math:`n` of a set of :math:`m+1` Chebyshev points .. math:: x_i = \frac{1}{2}\left(a+b+\left(b-a\right)\times \cos\left[\left(i-1\right)\times \pi /m\right]\right)\text{, }\quad i = 1,2,\ldots,m+1\text{.} The values :math:`f_i` are obtained by solving a set of simultaneous linear algebraic equations formed by applying a quadrature formula (equivalent to the scheme of Clenshaw and Curtis (1960)) to the integral equation at each of the above points. In general :math:`m = n-1`. However, advantage may be taken of any prior knowledge of the symmetry of :math:`f\left(x\right)`. Thus if :math:`f\left(x\right)` is symmetric (i.e., even) about the mid-point of the range :math:`\left(a, b\right)`, it may be approximated by an even Chebyshev series with :math:`m = 2n-1`. Similarly, if :math:`f\left(x\right)` is anti-symmetric (i.e., odd) about the mid-point of the range of integration, it may be approximated by an odd Chebyshev series with :math:`m = 2n`. .. _d05ab-py2-py-references: **References** Clenshaw, C W and Curtis, A R, 1960, `A method for numerical integration on an automatic computer`, Numer. Math. (2), 197--205 El--Gendi, S E, 1969, `Chebyshev solution of differential, integral and integro-differential equations`, Comput. J. (12), 282--287 """ raise NotImplementedError
[docs]def volterra2(ck, cg, cf, method, iorder, alim, tlim, nmesh, tol, thresh, lwk, data=None): r""" ``volterra2`` computes the solution of a nonlinear convolution Volterra integral equation of the second kind using a reducible linear multi-step method. .. _d05ba-py2-py-doc: For full information please refer to the NAG Library document for d05ba https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html .. _d05ba-py2-py-parameters: **Parameters** **ck** : callable retval = ck(t, data=None) :math:`\mathrm{ck}` must evaluate the kernel :math:`k\left(t\right)` of the integral equation `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`k` at the specified point. **cg** : callable retval = cg(s, y, data=None) :math:`\mathrm{cg}` must evaluate the function :math:`g\left(s, {y\left(s\right)}\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html#eqn1>`__. **Parameters** **s** : float :math:`s`, the value of the independent variable. **y** : float The value of the solution :math:`y` at the point :math:`\mathrm{s}`. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`g` at the specified points. **cf** : callable retval = cf(t, data=None) :math:`\mathrm{cf}` must evaluate the function :math:`f\left(t\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`f` at the specified point. **method** : str, length 1 The type of method which you wish to employ. :math:`\mathrm{method} = \texttt{'A'}` For Adams' type formulae. :math:`\mathrm{method} = \texttt{'B'}` For backward differentiation formulae. **iorder** : int The order of the method to be used. **alim** : float :math:`a`, the lower limit of the integration interval. **tlim** : float The final point of the integration interval, :math:`T`. **nmesh** : int The number of equidistant points at which the solution is sought. **tol** : float The relative accuracy required in the computed values of the solution. **thresh** : float The threshold value for use in the evaluation of the estimated relative errors. For two successive meshes the following condition must hold at each point of the coarser mesh .. math:: \frac{{\left\lvert Y_1-Y_2\right\rvert }}{{\mathrm{max}\left(\left\lvert Y_1\right\rvert, \left\lvert Y_2\right\rvert, \left\lvert \mathrm{thresh}\right\rvert \right)}}\leq \mathrm{tol}\text{,} where :math:`Y_1` is the computed solution on the coarser mesh and :math:`Y_2` is the computed solution at the corresponding point in the finer mesh. If this condition is not satisfied then the step size is halved and the solution is recomputed. Note: :math:`\mathrm{thresh}` can be used to effect a relative, absolute or mixed error test. If :math:`\mathrm{thresh} = 0.0` then pure relative error is measured and, if the computed solution is small and :math:`\mathrm{thresh} = 1.0`, absolute error is measured. **lwk** : int The dimension of the array :math:`\mathrm{work}`. **data** : arbitrary, optional User-communication data for callback functions. **Returns** **yn** : float, ndarray, shape :math:`\left(\mathrm{nmesh}\right)` :math:`\mathrm{yn}[\textit{i}-1]` contains the most recent approximation of the true solution :math:`y\left(t\right)` at the specified point :math:`t = \mathrm{alim}+\textit{i}\times \textit{H}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{nmesh}`, where :math:`\textit{H} = \left(\mathrm{tlim}-\mathrm{alim}\right)/\mathrm{nmesh}`. **errest** : float, ndarray, shape :math:`\left(\mathrm{nmesh}\right)` :math:`\mathrm{errest}[\textit{i}-1]` contains the most recent approximation of the relative error in the computed solution at the point :math:`t = \mathrm{alim}+\textit{i}\times \textit{H}`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{nmesh}`, where :math:`\textit{H} = \left(\mathrm{tlim}-\mathrm{alim}\right)/\mathrm{nmesh}`. **work** : float, ndarray, shape :math:`\left(\mathrm{lwk}\right)` If :math:`\mathrm{errno}` = 5 or 6, :math:`\mathrm{work}[0]` contains the size of :math:`\mathrm{lwk}` required for the algorithm to proceed further. .. _d05ba-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{method} = \texttt{'A'}` and :math:`\mathrm{iorder} = 2`. Constraint: if :math:`\mathrm{method} = \texttt{'A'}`, :math:`3\leq \mathrm{iorder}\leq 6`. (`errno` :math:`1`) On entry, :math:`\mathrm{tol} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\sqrt{\text{machine precision}}\leq \mathrm{tol}\leq 1.0`. (`errno` :math:`1`) On entry, :math:`\mathrm{alim} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{tlim} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{tlim} > \mathrm{alim}`. (`errno` :math:`1`) On entry, :math:`\mathrm{alim} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{alim}\geq 0.0`. (`errno` :math:`1`) On entry, :math:`\mathrm{method} = \texttt{'B'}` and :math:`\mathrm{iorder} = 6`. Constraint: if :math:`\mathrm{method} = \texttt{'B'}`, :math:`2\leq \mathrm{iorder}\leq 5`. (`errno` :math:`1`) On entry, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`2\leq \mathrm{iorder}\leq 6`. (`errno` :math:`1`) On entry, :math:`\mathrm{method} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{method} = \texttt{'A'}` or :math:`\texttt{'B'}`. (`errno` :math:`2`) On entry, :math:`\mathrm{method} = \texttt{'A'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'A'}`, :math:`\mathrm{nmesh}\geq \mathrm{iorder}-1`. (`errno` :math:`2`) On entry, :math:`\mathrm{method} = \texttt{'B'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'B'}`, :math:`\mathrm{nmesh}\geq \mathrm{iorder}`. (`errno` :math:`3`) On entry, :math:`\mathrm{lwk} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{lwk}\geq 10\times \mathrm{nmesh}+6`; that is, :math:`\langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`4`) The solution is not converging. See `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html#fcomments>`__. **Warns** **NagAlgorithmicWarning** (`errno` :math:`5`) The workspace which has been supplied is too small for the required accuracy. The number of extrapolations, so far, is :math:`\langle\mathit{\boldsymbol{value}}\rangle`. If you require one more extrapolation extend the size of workspace to: :math:`\mathrm{lwk} = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`6`) The workspace which has been supplied is too small for the required accuracy. The number of extrapolations, so far, is :math:`\langle\mathit{\boldsymbol{value}}\rangle`. If you require one more extrapolation extend the size of workspace to: :math:`\mathrm{lwk} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _d05ba-py2-py-notes: **Notes** ``volterra2`` computes the numerical solution of the nonlinear convolution Volterra integral equation of the second kind .. math:: y\left(t\right) = f\left(t\right)+\int_a^tk\left(t-s\right)g\left(s, {y\left(s\right)}\right){ds}\text{, }\quad a\leq t\leq T\text{.} It is assumed that the functions involved in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05baf.html#eqn1>`__ are sufficiently smooth. The function uses a reducible linear multi-step formula selected by you to generate a family of quadrature rules. The reducible formulae available in ``volterra2`` are the Adams--Moulton formulae of orders :math:`3` to :math:`6`, and the backward differentiation formulae (BDF) of orders :math:`2` to :math:`5`. For more information about the behaviour and the construction of these rules we refer to Lubich (1983) and Wolkenfelt (1982). The algorithm is based on computing the solution in a step-by-step fashion on a mesh of equispaced points. The initial step size which is given by :math:`\left(T-a\right)/N`, :math:`N` being the number of points at which the solution is sought, is halved and another approximation to the solution is computed. This extrapolation procedure is repeated until successive approximations satisfy a user-specified error requirement. The above methods require some starting values. For the Adams' formula of order greater than :math:`3` and the BDF of order greater than :math:`2` we employ an explicit Dormand--Prince--Shampine Runge--Kutta method (see Shampine (1986)). The above scheme avoids the calculation of the kernel, :math:`k\left(t\right)`, on the negative real line. .. _d05ba-py2-py-references: **References** Lubich, Ch, 1983, `On the stability of linear multi-step methods for Volterra convolution equations`, IMA J. Numer. Anal. (3), 439--465 Shampine, L F, 1986, `Some practical Runge--Kutta formulas`, Math. Comput. (46(173)), 135--150 Wolkenfelt, P H M, 1982, `The construction of reducible quadrature rules for Volterra integral and integro-differential equations`, IMA J. Numer. Anal. (2), 131--152 """ raise NotImplementedError
[docs]def abel2_weak(ck, cf, cg, initwt, tlim, nmesh, comm, iorder=4, tolnl=sqrt(machine.precision()), data=None): r""" ``abel2_weak`` computes the solution of a weakly singular nonlinear convolution Volterra--Abel integral equation of the second kind using a fractional Backward Differentiation Formulae (BDF) method. .. _d05bd-py2-py-doc: For full information please refer to the NAG Library document for d05bd https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html .. _d05bd-py2-py-parameters: **Parameters** **ck** : callable retval = ck(t, data=None) :math:`\mathrm{ck}` must evaluate the kernel :math:`k\left(t\right)` of the integral equation `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`k\left(t\right)` evaluated at :math:`\mathrm{t}`. **cf** : callable retval = cf(t, data=None) :math:`\mathrm{cf}` must evaluate the function :math:`f\left(t\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`f\left(t\right)` evaluated at :math:`\mathrm{t}`. **cg** : callable retval = cg(s, y, data=None) :math:`\mathrm{cg}` must evaluate the function :math:`g\left(s, {y\left(s\right)}\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__. **Parameters** **s** : float :math:`s`, the value of the independent variable. **y** : float The value of the solution :math:`y` at the point :math:`\mathrm{s}`. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`g\left(s, {y\left(s\right)}\right)` evaluated at :math:`\mathrm{s}` and :math:`\mathrm{y}`. **initwt** : str, length 1 If the fractional weights required by the method need to be calculated by the function then set :math:`\mathrm{initwt} = \texttt{'I'}` (**I**\ nitial call). If :math:`\mathrm{initwt} = \texttt{'S'}` (**S**\ ubsequent call), the function assumes the fractional weights have been computed on a previous call and are stored in :math:`\mathrm{comm}`\ ['work']. **tlim** : float The final point of the integration interval, :math:`\textit{T}`. **nmesh** : int :math:`N`, the number of equispaced points at which the solution is sought. **comm** : dict, communication object, modified in place Communication structure. `On initial entry`: need not be set. **iorder** : int, optional :math:`p`, the order of the BDF method to be used. **tolnl** : float, optional The accuracy required for the computation of the starting value and the solution of the nonlinear equation at each step of the computation (see `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#fcomments>`__). **data** : arbitrary, optional User-communication data for callback functions. **Returns** **yn** : float, ndarray, shape :math:`\left(\mathrm{nmesh}\right)` :math:`\mathrm{yn}[\textit{i}-1]` contains the approximate value of the true solution :math:`y\left(t\right)` at the point :math:`t = \left(\textit{i}-1\right)\times h`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{nmesh}`, where :math:`h = \mathrm{tlim}/\left(\mathrm{nmesh}-1\right)`. .. _d05bd-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{tolnl} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{tolnl} > 10\times \text{machine precision}`. (`errno` :math:`1`) On entry, :math:`\mathrm{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{nmesh} = 2^m+2\times \mathrm{iorder}-1`, for some :math:`m`. (`errno` :math:`1`) On entry, :math:`\mathrm{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{nmesh}\geq 2\times \mathrm{iorder}+1`. (`errno` :math:`1`) On entry, :math:`\textit{lwk} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{lwk}\geq \left(2\times \mathrm{iorder}+6\right)\times \mathrm{nmesh}+8\times \mathrm{iorder}^2-16\times \mathrm{iorder}+1`; that is, :math:`\langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`1`) On entry, :math:`\mathrm{tlim} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraints: :math:`\mathrm{tlim} > 10\times \text{machine precision}`. (`errno` :math:`1`) On entry, :math:`\mathrm{initwt} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraints: :math:`\mathrm{initwt} = \texttt{'I'}` or :math:`\texttt{'S'}`. (`errno` :math:`1`) On entry, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`4\leq \mathrm{iorder}\leq 6`. (`errno` :math:`2`) An error occurred when trying to compute the starting values. (`errno` :math:`3`) An error occurred when trying to compute the solution at a specific step. .. _d05bd-py2-py-notes: **Notes** ``abel2_weak`` computes the numerical solution of the weakly singular convolution Volterra--Abel integral equation of the second kind .. math:: y\left(t\right) = f\left(t\right)+\frac{1}{\sqrt{\pi }}\int_0^t\frac{{k\left(t-s\right)}}{{\sqrt{t-s}}}g\left(s, {y\left(s\right)}\right){ds}\text{, }\quad 0\leq t\leq T\text{.} Note the constant :math:`\frac{1}{\sqrt{\pi }}` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__. It is assumed that the functions involved in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__ are sufficiently smooth. The function uses a fractional BDF linear multi-step method to generate a family of quadrature rules (see :meth:`abel_weak_weights`). The BDF methods available in ``abel2_weak`` are of orders :math:`4`, :math:`5` and :math:`6` (:math:`\text{} = p` say). For a description of the theoretical and practical background to these methods we refer to Lubich (1985) and to Baker and Derakhshan (1987) and Hairer `et al.` (1988) respectively. The algorithm is based on computing the solution :math:`y\left(t\right)` in a step-by-step fashion on a mesh of equispaced points. The size of the mesh is given by :math:`T/\left(N-1\right)`, :math:`N` being the number of points at which the solution is sought. These methods require :math:`2p-1` (including :math:`y\left(0\right)`) starting values which are evaluated internally. The computation of the lag term arising from the discretization of `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bdf.html#eqn1>`__ is performed by fast Fourier transform (FFT) techniques when :math:`N > 32+2p-1`, and directly otherwise. The function does not provide an error estimate and you are advised to check the behaviour of the solution with a different value of :math:`N`. An option is provided which avoids the re-evaluation of the fractional weights when ``abel2_weak`` is to be called several times (with the same value of :math:`N`) within the same program unit with different functions. .. _d05bd-py2-py-references: **References** Baker, C T H and Derakhshan, M S, 1987, `FFT techniques in the numerical solution of convolution equations`, J. Comput. Appl. Math. (20), 5--24 Hairer, E, Lubich, Ch and Schlichte, M, 1988, `Fast numerical solution of weakly singular Volterra integral equations`, J. Comput. Appl. Math. (23), 87--98 Lubich, Ch, 1985, `Fractional linear multistep methods for Abel--Volterra integral equations of the second kind`, Math. Comput. (45), 463--469 """ raise NotImplementedError
[docs]def abel1_weak(ck, cf, cg, initwt, tlim, yn, comm, iorder=4, tolnl=sqrt(machine.precision()), data=None): r""" ``abel1_weak`` computes the solution of a weakly singular nonlinear convolution Volterra--Abel integral equation of the first kind using a fractional Backward Differentiation Formulae (BDF) method. .. _d05be-py2-py-doc: For full information please refer to the NAG Library document for d05be https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html .. _d05be-py2-py-parameters: **Parameters** **ck** : callable retval = ck(t, data=None) :math:`\mathrm{ck}` must evaluate the kernel :math:`k\left(t\right)` of the integral equation `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`k\left(t\right)` evaluated at :math:`\mathrm{t}`. **cf** : callable retval = cf(t, data=None) :math:`\mathrm{cf}` must evaluate the function :math:`f\left(t\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__. **Parameters** **t** : float :math:`t`, the value of the independent variable. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`f\left(t\right)` evaluated at :math:`\mathrm{t}`. **cg** : callable retval = cg(s, y, data=None) :math:`\mathrm{cg}` must evaluate the function :math:`g\left(s, {y\left(s\right)}\right)` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__. **Parameters** **s** : float :math:`s`, the value of the independent variable. **y** : float The value of the solution :math:`y` at the point :math:`\mathrm{s}`. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : float The value of :math:`g\left(s, {y\left(s\right)}\right)` evaluated at :math:`\mathrm{s}` and :math:`\mathrm{y}`. **initwt** : str, length 1 If the fractional weights required by the method need to be calculated by the function then set :math:`\mathrm{initwt} = \texttt{'I'}` (**I**\ nitial call). If :math:`\mathrm{initwt} = \texttt{'S'}` (**S**\ ubsequent call), the function assumes the fractional weights have been computed by a previous call and are stored in :math:`\mathrm{comm}`\ ['work']. **tlim** : float The final point of the integration interval, :math:`\textit{T}`. **yn** : float, array-like, shape :math:`\left(\textit{nmesh}\right)` :math:`\mathrm{yn}[0]` must contain the value of :math:`y\left(t\right)` at :math:`t = 0` (see `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#fcomments>`__). **comm** : dict, communication object, modified in place Communication structure. `On initial entry`: need not be set. **iorder** : int, optional :math:`p`, the order of the BDF method to be used. **tolnl** : float, optional The accuracy required for the computation of the starting value and the solution of the nonlinear equation at each step of the computation (see `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#fcomments>`__). **data** : arbitrary, optional User-communication data for callback functions. **Returns** **yn** : float, ndarray, shape :math:`\left(\textit{nmesh}\right)` :math:`\mathrm{yn}[\textit{i}-1]` contains the approximate value of the true solution :math:`y\left(t\right)` at the point :math:`t = \left(\textit{i}-1\right)\times h`, for :math:`\textit{i} = 1,2,\ldots,\textit{nmesh}`, where :math:`h = \mathrm{tlim}/\left(\textit{nmesh}-1\right)`. .. _d05be-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{tolnl} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{tolnl} > 10\times \text{machine precision}`. (`errno` :math:`1`) On entry, :math:`\textit{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{nmesh} = 2^m+2\times \mathrm{iorder}-1`, for some :math:`m`. (`errno` :math:`1`) On entry, :math:`\textit{nmesh} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{nmesh}\geq 2\times \mathrm{iorder}+1`. (`errno` :math:`1`) On entry, :math:`\textit{lwk} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{lwk}\geq \left(2\times \mathrm{iorder}+6\right)\times \textit{nmesh}+8\times \mathrm{iorder}^2-16\times \mathrm{iorder}+1`; that is, :math:`\langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`1`) On entry, :math:`\mathrm{tlim} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{tlim} > 10\times \text{machine precision}` (`errno` :math:`1`) On entry, :math:`\mathrm{initwt} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{initwt} = \texttt{'I'}` or :math:`\texttt{'S'}`. (`errno` :math:`1`) On entry, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`4\leq \mathrm{iorder}\leq 6`. (`errno` :math:`2`) An error occurred when trying to compute the starting values. (`errno` :math:`3`) An error occurred when trying to compute the solution at a specific step. .. _d05be-py2-py-notes: **Notes** ``abel1_weak`` computes the numerical solution of the weakly singular convolution Volterra--Abel integral equation of the first kind .. math:: f\left(t\right)+\frac{1}{\sqrt{\pi }}\int_0^t\frac{{k\left(t-s\right)}}{{\sqrt{t-s}}}g\left(s, {y\left(s\right)}\right){ds} = 0\text{, }\quad 0\leq t\leq T\text{.} Note the constant :math:`\frac{1}{\sqrt{\pi }}` in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__. It is assumed that the functions involved in `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__ are sufficiently smooth and if .. math:: f\left(t\right) = t^{\beta }w\left(t\right)\quad \text{ with }\quad \beta > -\frac{1}{2}\text{ and }w\left(t\right)\text{ smooth,} then the solution :math:`y\left(t\right)` is unique and has the form :math:`y\left(t\right) = t^{{\beta -1/2}}z\left(t\right)`, (see Lubich (1987)). It is evident from `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__ that :math:`f\left(0\right) = 0`. You are required to provide the value of :math:`y\left(t\right)` at :math:`t = 0`. If :math:`y\left(0\right)` is unknown, `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#fcomments>`__ gives a description of how an approximate value can be obtained. The function uses a fractional BDF linear multi-step method selected by you to generate a family of quadrature rules (see :meth:`abel_weak_weights`). The BDF methods available in ``abel1_weak`` are of orders :math:`4`, :math:`5` and :math:`6` (:math:`\text{} = p` say). For a description of the theoretical and practical background related to these methods we refer to Lubich (1987) and to Baker and Derakhshan (1987) and Hairer `et al.` (1988) respectively. The algorithm is based on computing the solution :math:`y\left(t\right)` in a step-by-step fashion on a mesh of equispaced points. The size of the mesh is given by :math:`T/\left(N-1\right)`, :math:`N` being the number of points at which the solution is sought. These methods require :math:`2p-2` starting values which are evaluated internally. The computation of the lag term arising from the discretization of `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bef.html#eqn1>`__ is performed by fast Fourier transform (FFT) techniques when :math:`N > 32+2p-1`, and directly otherwise. The function does not provide an error estimate and you are advised to check the behaviour of the solution with a different value of :math:`N`. An option is provided which avoids the re-evaluation of the fractional weights when ``abel1_weak`` is to be called several times (with the same value of :math:`N`) within the same program with different functions. .. _d05be-py2-py-references: **References** Baker, C T H and Derakhshan, M S, 1987, `FFT techniques in the numerical solution of convolution equations`, J. Comput. Appl. Math. (20), 5--24 Gorenflo, R and Pfeiffer, A, 1991, `On analysis and discretization of nonlinear Abel integral equations of first kind`, Acta Math. Vietnam (16), 211--262 Hairer, E, Lubich, Ch and Schlichte, M, 1988, `Fast numerical solution of weakly singular Volterra integral equations`, J. Comput. Appl. Math. (23), 87--98 Lubich, Ch, 1987, `Fractional linear multistep methods for Abel--Volterra integral equations of the first kind`, IMA J. Numer. Anal (7), 97--106 """ raise NotImplementedError
[docs]def volterra_weights(method, iorder, nomg, nwt): r""" ``volterra_weights`` computes the quadrature weights associated with the Adams' methods of orders three to six and the Backward Differentiation Formulae (BDF) methods of orders two to five. These rules, which are referred to as reducible quadrature rules, can then be used in the solution of Volterra integral and integro-differential equations. .. _d05bw-py2-py-doc: For full information please refer to the NAG Library document for d05bw https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bwf.html .. _d05bw-py2-py-parameters: **Parameters** **method** : str, length 1 The type of method to be used. :math:`\mathrm{method} = \texttt{'A'}` For Adams' type formulae. :math:`\mathrm{method} = \texttt{'B'}` For Backward Differentiation Formulae. **iorder** : int The order of the method to be used. The number of starting weights, :math:`\textit{p}` is determined by :math:`\mathrm{method}` and :math:`\mathrm{iorder}`. If :math:`\mathrm{method} = \texttt{'A'}`, :math:`\textit{p} = \mathrm{iorder}-1`. If :math:`\mathrm{method} = \texttt{'B'}`, :math:`\textit{p} = \mathrm{iorder}`. **nomg** : int The number of convolution weights, :math:`\textit{n}_w`. **nwt** : int :math:`\textit{p}`, the number of columns in the starting weights. **Returns** **omega** : float, ndarray, shape :math:`\left(\mathrm{nomg}\right)` Contains the first :math:`\mathrm{nomg}` convolution weights. **lensw** : int The number of rows in the weights :math:`W_{{i,j}}`. **sw** : float, ndarray, shape :math:`\left(\textit{n}, \mathrm{nwt}\right)` :math:`\mathrm{sw}[\textit{i}-1,\textit{j}]` contains the weights :math:`W_{{\textit{i},\textit{j}}}`, for :math:`\textit{j} = 0,1,\ldots,\mathrm{nwt}-1`, for :math:`\textit{i} = 1,2,\ldots,\mathrm{lensw}`, where :math:`\textit{n}` is as defined in :ref:`Notes <d05bw-py2-py-notes>`. .. _d05bw-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{method} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{method} = \texttt{'A'}` or :math:`\texttt{'B'}`. (`errno` :math:`2`) On entry, :math:`\mathrm{nomg} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{nomg}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`2\leq \mathrm{iorder}\leq 6`. (`errno` :math:`3`) On entry, :math:`\mathrm{method} = \texttt{'B'}` and :math:`\mathrm{iorder} = 6`. Constraint: if :math:`\mathrm{method} = \texttt{'B'}`, :math:`2\leq \mathrm{iorder}\leq 5`. (`errno` :math:`3`) On entry, :math:`\mathrm{method} = \texttt{'A'}` and :math:`\mathrm{iorder} = 2`. Constraint: if :math:`\mathrm{method} = \texttt{'A'}`, :math:`3\leq \mathrm{iorder}\leq 6`. (`errno` :math:`4`) On entry, :math:`\mathrm{method} = \texttt{'B'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nwt} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'B'}`, :math:`\mathrm{nwt} = \mathrm{iorder}`. (`errno` :math:`4`) On entry, :math:`\mathrm{method} = \texttt{'A'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nwt} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'A'}`, :math:`\mathrm{nwt} = \mathrm{iorder}-1`. (`errno` :math:`5`) On entry, :math:`\mathrm{method} = \texttt{'B'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nomg} = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\textit{ldsw} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'B'}`, :math:`\textit{ldsw}\geq \mathrm{nomg}+\mathrm{iorder}-1`. (`errno` :math:`5`) On entry, :math:`\mathrm{method} = \texttt{'A'}`, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{nomg} = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\textit{ldsw} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: if :math:`\mathrm{method} = \texttt{'A'}`, :math:`\textit{ldsw}\geq \mathrm{nomg}+\mathrm{iorder}-2`. .. _d05bw-py2-py-notes: **Notes** ``volterra_weights`` computes the weights :math:`W_{{i,j}}` and :math:`\omega_i` for a family of quadrature rules related to the Adams' methods of orders three to six and the BDF methods of orders two to five, for approximating the integral: .. math:: \int_0^t\phi \left(s\right){ds}\simeq h\sum_{{j = 0}}^{{\textit{p}-1}}W_{{i,j}}\phi \left(j\times h\right)+h\sum_{{j = \textit{p}}}^i\omega_{{i-j}}\phi \left(j\times h\right)\text{, }\quad 0\leq t\leq T\text{,} with :math:`t = \textit{i}\times h`, for :math:`\textit{i} = 0,1,\ldots,\textit{n}`, for some given constant :math:`h`. In `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bwf.html#eqn1>`__, :math:`h` is a uniform mesh, :math:`\textit{p}` is related to the order of the method being used and :math:`W_{{i,j}}`, :math:`\omega_i` are the starting and the convolution weights respectively. The mesh size :math:`h` is determined as :math:`h = \frac{T}{\textit{n}}`, where :math:`\textit{n} = \textit{n}_w+\textit{p}-1` and :math:`\textit{n}_w` is the chosen number of convolution weights :math:`w_j`, for :math:`\textit{j} = 1,2,\ldots,{\textit{n}_w-1}`. A description of how these weights can be used in the solution of a Volterra integral equation of the second kind is given in `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05bwf.html#fcomments>`__. For a general discussion of these methods, see Wolkenfelt (1982) for more details. .. _d05bw-py2-py-references: **References** Lambert, J D, 1973, `Computational Methods in Ordinary Differential Equations`, John Wiley Wolkenfelt, P H M, 1982, `The construction of reducible quadrature rules for Volterra integral and integro-differential equations`, IMA J. Numer. Anal. (2), 131--152 """ raise NotImplementedError
[docs]def abel_weak_weights(iorder, iq, lenfw): r""" ``abel_weak_weights`` computes the fractional quadrature weights associated with the Backward Differentiation Formulae (BDF) of orders :math:`4`, :math:`5` and :math:`6`. These weights can then be used in the solution of weakly singular equations of Abel type. .. _d05by-py2-py-doc: For full information please refer to the NAG Library document for d05by https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05byf.html .. _d05by-py2-py-parameters: **Parameters** **iorder** : int :math:`p`, the order of the BDF method to be used. **iq** : int Determines the number of weights to be computed. By setting :math:`\mathrm{iq}` to a value, :math:`2^{{\mathrm{iq}+1}}` fractional convolution weights are computed. **lenfw** : int The dimension of the array :math:`\mathrm{wt}`. **Returns** **wt** : float, ndarray, shape :math:`\left(\mathrm{lenfw}\right)` The first :math:`2^{{\mathrm{iq}+1}}` elements of :math:`\mathrm{wt}` contains the fractional convolution weights :math:`\omega_i`, for :math:`\textit{i} = 0,1,\ldots,2^{{\mathrm{iq}+1}}-1`. The remainder of the array is used as workspace. **sw** : float, ndarray, shape :math:`\left(2^{{\mathrm{iq}+1}}+2\times \mathrm{iorder}-1, 2\times \mathrm{iorder}-1\right)` :math:`\mathrm{sw}[\textit{i}-1,\textit{j}]` contains the fractional starting weights :math:`W_{{\textit{i}-1,\textit{j}}}`, for :math:`\textit{j} = 0,1,\ldots,2\times \mathrm{iorder}-2`, for :math:`\textit{i} = 1,2,\ldots,\textit{N}`, where :math:`\textit{N} = \left(2^{{\mathrm{iq}+1}}+2\times \mathrm{iorder}-1\right)`. .. _d05by-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{lenfw} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iq} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{lenfw}\geq 2^{{\mathrm{iq}+2}}`. (`errno` :math:`1`) On entry, :math:`\textit{ldsw} = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{iq} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{ldsw}\geq 2^{{\mathrm{iq}+1}}+2\times \mathrm{iorder}-1`. (`errno` :math:`1`) On entry, :math:`\mathrm{iq} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{iq}\geq 0`. (`errno` :math:`1`) On entry, :math:`\mathrm{iorder} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`4\leq \mathrm{iorder}\leq 6`. .. _d05by-py2-py-notes: **Notes** ``abel_weak_weights`` computes the weights :math:`W_{{i,j}}` and :math:`\omega_i` for a family of quadrature rules related to a BDF method for approximating the integral: .. math:: \frac{1}{\sqrt{\pi }}\int_0^t\frac{{\phi \left(s\right)}}{{\sqrt{t-s}}}{ds}\simeq \sqrt{h}\sum_{{j = 0}}^{{2p-2}}W_{{i,j}}\phi \left(j\times h\right)+\sqrt{h}\sum_{{j = 2p-1}}^i\omega_{{i-j}}\phi \left(j\times h\right)\text{, }\quad 0\leq t\leq T\text{,} with :math:`t = i\times h\left(i\geq 0\right)`, for some given :math:`h`. In `(1) <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05byf.html#eqn1>`__, :math:`p` is the order of the BDF method used and :math:`W_{{i,j}}`, :math:`\omega_i` are the fractional starting and the fractional convolution weights respectively. The algorithm for the generation of :math:`\omega_i` is based on Newton's iteration. Fast Fourier transform (FFT) techniques are used for computing these weights and subsequently :math:`W_{{i,j}}` (see Baker and Derakhshan (1987) and Henrici (1979) for practical details and Lubich (1986) for theoretical details). Some special functions can be represented as the fractional integrals of simpler functions and fractional quadratures can be employed for their computation (see Lubich (1986)). A description of how these weights can be used in the solution of weakly singular equations of Abel type is given in `Further Comments <https://www.nag.com/numeric/nl/nagdoc_27.3/flhtml/d05/d05byf.html#fcomments>`__. .. _d05by-py2-py-references: **References** Baker, C T H and Derakhshan, M S, 1987, `Computational approximations to some power series`, Approximation Theory, (eds L Collatz, G Meinardus and G Nürnberger) (81), 11--20 Henrici, P, 1979, `Fast Fourier methods in computational complex analysis`, SIAM Rev. (21), 481--529 Lubich, Ch, 1986, `Discretized fractional calculus`, SIAM J. Math. Anal. (17), 704--719 """ raise NotImplementedError