{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "css_file = './custom.css'\n", "HTML(open(css_file, \"r\").read())" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python version 3.8.5 (default, Jul 28 2020, 12:59:40) \n", "[GCC 9.3.0]\n", "Matplotlib version 3.1.2\n", "Scipy version 1.3.3\n", "Sympy version 1.5.1\n" ] } ], "source": [ "import sys #only needed to determine Python version number\n", "import matplotlib #only needed to determine Matplotlib version number\n", "import scipy # idem\n", "import sympy # idem\n", "\n", "print('Python version ' + sys.version)\n", "print('Matplotlib version ' + matplotlib.__version__ )\n", "print('Scipy version ' + scipy.__version__ )\n", "print('Sympy version ' + sympy.__version__ )\n", "\n", "%reset -f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# M62_TP0 Calcul approché (package SciPy) VS formel (package SymPy)." ] }, { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calcul approché avec le module `SciPy`\n", "--- \n", "Cette librairie est un ensemble très complet de modules d’algèbre linéaire, statistiques et autres algorithmes numériques. \n", "Le site de la documentation en fournit la liste : http://docs.scipy.org/doc/scipy/reference" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `fsolve`\n", "Si on ne peut pas calculer analytiquement la solution d'une équation, on peut l'approcher numériquement comme suit:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7390851332151607\n" ] } ], "source": [ "from math import cos\n", "from scipy.optimize import fsolve\n", "\n", "sol=fsolve(lambda x: x-cos(x), 1)[0]\n", "print(sol)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "from matplotlib.pylab import *\n", "x=linspace(-pi,pi,101)\n", "y=[cos(xi) for xi in x ]\n", "plot(x,x,'g-',x,y,'r-')\n", "plot( [sol,sol,0],[0,sol,sol] ,'-.')\n", "grid(True)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.75308916]\n", "[0.75308916]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from math import exp\n", "from matplotlib.pylab import *\n", "from scipy.optimize import fsolve\n", "\n", "sol=fsolve(lambda x: x**2-exp(-x*x), -1)\n", "print(sol)\n", "\n", "sol=fsolve(lambda x: x**2-exp(-x*x), 0.2)\n", "print(sol)\n", "\n", "x=linspace(-1.5,1.5,101)\n", "plot(x,[xi**2 for xi in x],'r--',label=r'$x^2$')\n", "plot(x,[exp(-xi*xi) for xi in x],label=r'$e^{-x^2}$')\n", "legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.);\n", "\n", "# figure()\n", "# plot(x,[xi**2-exp(-xi*xi) for xi in x],x,[0 for xi in x])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Et pour un système:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.25 0.0625]\n" ] } ], "source": [ "from scipy.optimize import fsolve\n", "sol=fsolve(lambda p: ( p[1]-p[0]**2 , 4*p[1]-p[0] ), (5,5))\n", "print(sol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `integrate.quad`\n", "Pour approcher la valeur numérique d'une intégrale on peut utiliser `integrate.quad`\n", "https://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Integrale = 0.33333333333333337 Erreur = 3.700743415417189e-15\n", "0.8862269254527579\n", "0.8862269254527579\n" ] } ], "source": [ "from math import *\n", "from scipy import integrate\n", "\n", "a=0\n", "b=1\n", "f = lambda x:x**2\n", "integr = integrate.quad(f,a,b)\n", "print(\"Integrale =\",integr[0], \" Erreur =\",integr[1] )\n", "\n", "f = lambda x: exp(-x*x)\n", "print(integrate.quad(f, 0,inf)[0])\n", "print(sqrt(pi)/2)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on package scipy.integrate in scipy:\n", "\n", "NAME\n", " scipy.integrate\n", "\n", "DESCRIPTION\n", " =============================================\n", " Integration and ODEs (:mod:`scipy.integrate`)\n", " =============================================\n", " \n", " .. currentmodule:: scipy.integrate\n", " \n", " Integrating functions, given function object\n", " ============================================\n", " \n", " .. autosummary::\n", " :toctree: generated/\n", " \n", " quad -- General purpose integration\n", " dblquad -- General purpose double integration\n", " tplquad -- General purpose triple integration\n", " nquad -- General purpose n-dimensional integration\n", " fixed_quad -- Integrate func(x) using Gaussian quadrature of order n\n", " quadrature -- Integrate with given tolerance using Gaussian quadrature\n", " romberg -- Integrate func using Romberg integration\n", " quad_explain -- Print information for use of quad\n", " newton_cotes -- Weights and error coefficient for Newton-Cotes integration\n", " IntegrationWarning -- Warning on issues during integration\n", " \n", " Integrating functions, given fixed samples\n", " ==========================================\n", " \n", " .. autosummary::\n", " :toctree: generated/\n", " \n", " trapz -- Use trapezoidal rule to compute integral.\n", " cumtrapz -- Use trapezoidal rule to cumulatively compute integral.\n", " simps -- Use Simpson's rule to compute integral from samples.\n", " romb -- Use Romberg Integration to compute integral from\n", " -- (2**k + 1) evenly-spaced samples.\n", " \n", " .. seealso::\n", " \n", " :mod:`scipy.special` for orthogonal polynomials (special) for Gaussian\n", " quadrature roots and weights for other weighting factors and regions.\n", " \n", " Solving initial value problems for ODE systems\n", " ==============================================\n", " \n", " The solvers are implemented as individual classes which can be used directly\n", " (low-level usage) or through a convenience function.\n", " \n", " .. autosummary::\n", " :toctree: generated/\n", " \n", " solve_ivp -- Convenient function for ODE integration.\n", " RK23 -- Explicit Runge-Kutta solver of order 3(2).\n", " RK45 -- Explicit Runge-Kutta solver of order 5(4).\n", " Radau -- Implicit Runge-Kutta solver of order 5.\n", " BDF -- Implicit multi-step variable order (1 to 5) solver.\n", " LSODA -- LSODA solver from ODEPACK Fortran package.\n", " OdeSolver -- Base class for ODE solvers.\n", " DenseOutput -- Local interpolant for computing a dense output.\n", " OdeSolution -- Class which represents a continuous ODE solution.\n", " \n", " \n", " Old API\n", " -------\n", " \n", " These are the routines developed earlier for scipy. They wrap older solvers\n", " implemented in Fortran (mostly ODEPACK). While the interface to them is not\n", " particularly convenient and certain features are missing compared to the new\n", " API, the solvers themselves are of good quality and work fast as compiled\n", " Fortran code. In some cases it might be worth using this old API.\n", " \n", " .. autosummary::\n", " :toctree: generated/\n", " \n", " odeint -- General integration of ordinary differential equations.\n", " ode -- Integrate ODE using VODE and ZVODE routines.\n", " complex_ode -- Convert a complex-valued ODE to real-valued and integrate.\n", " \n", " \n", " Solving boundary value problems for ODE systems\n", " ===============================================\n", " \n", " .. autosummary::\n", " :toctree: generated/\n", " \n", " solve_bvp -- Solve a boundary value problem for a system of ODEs.\n", "\n", "PACKAGE CONTENTS\n", " _bvp\n", " _dop\n", " _ivp (package)\n", " _ode\n", " _odepack\n", " _quadpack\n", " _test_multivariate\n", " _test_odeint_banded\n", " lsoda\n", " odepack\n", " quadpack\n", " quadrature\n", " tests (package)\n", " vode\n", "\n", "CLASSES\n", " builtins.UserWarning(builtins.Warning)\n", " scipy.integrate.quadpack.IntegrationWarning\n", " builtins.object\n", " scipy.integrate._ivp.base.DenseOutput\n", " scipy.integrate._ivp.base.OdeSolver\n", " scipy.integrate._ivp.bdf.BDF\n", " scipy.integrate._ivp.lsoda.LSODA\n", " scipy.integrate._ivp.radau.Radau\n", " scipy.integrate._ivp.common.OdeSolution\n", " scipy.integrate._ode.ode\n", " scipy.integrate._ode.complex_ode\n", " scipy.integrate._ivp.rk.RungeKutta(scipy.integrate._ivp.base.OdeSolver)\n", " scipy.integrate._ivp.rk.RK23\n", " scipy.integrate._ivp.rk.RK45\n", " \n", " class BDF(scipy.integrate._ivp.base.OdeSolver)\n", " | BDF(fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, first_step=None, **extraneous)\n", " | \n", " | Implicit method based on backward-differentiation formulas.\n", " | \n", " | This is a variable order method with the order varying automatically from\n", " | 1 to 5. The general framework of the BDF algorithm is described in [1]_.\n", " | This class implements a quasi-constant step size as explained in [2]_.\n", " | The error estimation strategy for the constant-step BDF is derived in [3]_.\n", " | An accuracy enhancement using modified formulas (NDF) [2]_ is also implemented.\n", " | \n", " | Can be applied in the complex domain.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar, and there are two options for the ndarray ``y``:\n", " | It can either have shape (n,); then ``fun`` must return array_like with\n", " | shape (n,). Alternatively it can have shape (n, k); then ``fun``\n", " | must return an array_like with shape (n, k), i.e. each column\n", " | corresponds to a single column in ``y``. The choice between the two\n", " | options is determined by `vectorized` argument (see below). The\n", " | vectorized implementation allows a faster approximation of the Jacobian\n", " | by finite differences (required for this solver).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time - the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | first_step : float or None, optional\n", " | Initial step size. Default is ``None`` which means that the algorithm\n", " | should choose.\n", " | max_step : float, optional\n", " | Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | rtol, atol : float and array_like, optional\n", " | Relative and absolute tolerances. The solver keeps the local error\n", " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " | relative accuracy (number of correct digits). But if a component of `y`\n", " | is approximately below `atol`, the error only needs to fall within\n", " | the same `atol` threshold, and the number of correct digits is not\n", " | guaranteed. If components of y have different scales, it might be\n", " | beneficial to set different `atol` values for different components by\n", " | passing array_like with shape (n,) for `atol`. Default values are\n", " | 1e-3 for `rtol` and 1e-6 for `atol`.\n", " | jac : {None, array_like, sparse_matrix, callable}, optional\n", " | Jacobian matrix of the right-hand side of the system with respect to y,\n", " | required by this method. The Jacobian matrix has shape (n, n) and its\n", " | element (i, j) is equal to ``d f_i / d y_j``.\n", " | There are three ways to define the Jacobian:\n", " | \n", " | * If array_like or sparse_matrix, the Jacobian is assumed to\n", " | be constant.\n", " | * If callable, the Jacobian is assumed to depend on both\n", " | t and y; it will be called as ``jac(t, y)`` as necessary.\n", " | For the 'Radau' and 'BDF' methods, the return value might be a\n", " | sparse matrix.\n", " | * If None (default), the Jacobian will be approximated by\n", " | finite differences.\n", " | \n", " | It is generally recommended to provide the Jacobian rather than\n", " | relying on a finite-difference approximation.\n", " | jac_sparsity : {None, array_like, sparse matrix}, optional\n", " | Defines a sparsity structure of the Jacobian matrix for a\n", " | finite-difference approximation. Its shape must be (n, n). This argument\n", " | is ignored if `jac` is not `None`. If the Jacobian has only few non-zero\n", " | elements in *each* row, providing the sparsity structure will greatly\n", " | speed up the computations [4]_. A zero entry means that a corresponding\n", " | element in the Jacobian is always zero. If None (default), the Jacobian\n", " | is assumed to be dense.\n", " | vectorized : bool, optional\n", " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | step_size : float\n", " | Size of the last successful step. None if no steps were made yet.\n", " | nfev : int\n", " | Number of evaluations of the right-hand side.\n", " | njev : int\n", " | Number of evaluations of the Jacobian.\n", " | nlu : int\n", " | Number of LU decompositions.\n", " | \n", " | References\n", " | ----------\n", " | .. [1] G. D. Byrne, A. C. Hindmarsh, \"A Polyalgorithm for the Numerical\n", " | Solution of Ordinary Differential Equations\", ACM Transactions on\n", " | Mathematical Software, Vol. 1, No. 1, pp. 71-96, March 1975.\n", " | .. [2] L. F. Shampine, M. W. Reichelt, \"THE MATLAB ODE SUITE\", SIAM J. SCI.\n", " | COMPUTE., Vol. 18, No. 1, pp. 1-22, January 1997.\n", " | .. [3] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations I:\n", " | Nonstiff Problems\", Sec. III.2.\n", " | .. [4] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n", " | sparse Jacobian matrices\", Journal of the Institute of Mathematics\n", " | and its Applications, 13, pp. 117-120, 1974.\n", " | \n", " | Method resolution order:\n", " | BDF\n", " | scipy.integrate._ivp.base.OdeSolver\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, first_step=None, **extraneous)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class DenseOutput(builtins.object)\n", " | DenseOutput(t_old, t)\n", " | \n", " | Base class for local interpolant over step made by an ODE solver.\n", " | \n", " | It interpolates between `t_min` and `t_max` (see Attributes below).\n", " | Evaluation outside this interval is not forbidden, but the accuracy is not\n", " | guaranteed.\n", " | \n", " | Attributes\n", " | ----------\n", " | t_min, t_max : float\n", " | Time range of the interpolation.\n", " | \n", " | Methods defined here:\n", " | \n", " | __call__(self, t)\n", " | Evaluate the interpolant.\n", " | \n", " | Parameters\n", " | ----------\n", " | t : float or array_like with shape (n_points,)\n", " | Points to evaluate the solution at.\n", " | \n", " | Returns\n", " | -------\n", " | y : ndarray, shape (n,) or (n, n_points)\n", " | Computed values. Shape depends on whether `t` was a scalar or a\n", " | 1-d array.\n", " | \n", " | __init__(self, t_old, t)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " \n", " class IntegrationWarning(builtins.UserWarning)\n", " | Warning on issues during integration.\n", " | \n", " | Method resolution order:\n", " | IntegrationWarning\n", " | builtins.UserWarning\n", " | builtins.Warning\n", " | builtins.Exception\n", " | builtins.BaseException\n", " | builtins.object\n", " | \n", " | Data descriptors defined here:\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from builtins.UserWarning:\n", " | \n", " | __init__(self, /, *args, **kwargs)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Static methods inherited from builtins.UserWarning:\n", " | \n", " | __new__(*args, **kwargs) from builtins.type\n", " | Create and return a new object. See help(type) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from builtins.BaseException:\n", " | \n", " | __delattr__(self, name, /)\n", " | Implement delattr(self, name).\n", " | \n", " | __getattribute__(self, name, /)\n", " | Return getattr(self, name).\n", " | \n", " | __reduce__(...)\n", " | Helper for pickle.\n", " | \n", " | __repr__(self, /)\n", " | Return repr(self).\n", " | \n", " | __setattr__(self, name, value, /)\n", " | Implement setattr(self, name, value).\n", " | \n", " | __setstate__(...)\n", " | \n", " | __str__(self, /)\n", " | Return str(self).\n", " | \n", " | with_traceback(...)\n", " | Exception.with_traceback(tb) --\n", " | set self.__traceback__ to tb and return self.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from builtins.BaseException:\n", " | \n", " | __cause__\n", " | exception cause\n", " | \n", " | __context__\n", " | exception context\n", " | \n", " | __dict__\n", " | \n", " | __suppress_context__\n", " | \n", " | __traceback__\n", " | \n", " | args\n", " \n", " class LSODA(scipy.integrate._ivp.base.OdeSolver)\n", " | LSODA(fun, t0, y0, t_bound, first_step=None, min_step=0.0, max_step=inf, rtol=0.001, atol=1e-06, jac=None, lband=None, uband=None, vectorized=False, **extraneous)\n", " | \n", " | Adams/BDF method with automatic stiffness detection and switching.\n", " | \n", " | This is a wrapper to the Fortran solver from ODEPACK [1]_. It switches\n", " | automatically between the nonstiff Adams method and the stiff BDF method.\n", " | The method was originally detailed in [2]_.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar, and there are two options for the ndarray ``y``:\n", " | It can either have shape (n,); then ``fun`` must return array_like with\n", " | shape (n,). Alternatively it can have shape (n, k); then ``fun``\n", " | must return an array_like with shape (n, k), i.e. each column\n", " | corresponds to a single column in ``y``. The choice between the two\n", " | options is determined by `vectorized` argument (see below). The\n", " | vectorized implementation allows a faster approximation of the Jacobian\n", " | by finite differences (required for this solver).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time - the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | first_step : float or None, optional\n", " | Initial step size. Default is ``None`` which means that the algorithm\n", " | should choose.\n", " | min_step : float, optional\n", " | Minimum allowed step size. Default is 0.0, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | max_step : float, optional\n", " | Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | rtol, atol : float and array_like, optional\n", " | Relative and absolute tolerances. The solver keeps the local error\n", " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " | relative accuracy (number of correct digits). But if a component of `y`\n", " | is approximately below `atol`, the error only needs to fall within\n", " | the same `atol` threshold, and the number of correct digits is not\n", " | guaranteed. If components of y have different scales, it might be\n", " | beneficial to set different `atol` values for different components by\n", " | passing array_like with shape (n,) for `atol`. Default values are\n", " | 1e-3 for `rtol` and 1e-6 for `atol`.\n", " | jac : None or callable, optional\n", " | Jacobian matrix of the right-hand side of the system with respect to\n", " | ``y``. The Jacobian matrix has shape (n, n) and its element (i, j) is\n", " | equal to ``d f_i / d y_j``. The function will be called as\n", " | ``jac(t, y)``. If None (default), the Jacobian will be\n", " | approximated by finite differences. It is generally recommended to\n", " | provide the Jacobian rather than relying on a finite-difference\n", " | approximation.\n", " | lband, uband : int or None\n", " | Parameters defining the bandwidth of the Jacobian,\n", " | i.e., ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Setting\n", " | these requires your jac routine to return the Jacobian in the packed format:\n", " | the returned array must have ``n`` columns and ``uband + lband + 1``\n", " | rows in which Jacobian diagonals are written. Specifically\n", " | ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format is used\n", " | in `scipy.linalg.solve_banded` (check for an illustration).\n", " | These parameters can be also used with ``jac=None`` to reduce the\n", " | number of Jacobian elements estimated by finite differences.\n", " | vectorized : bool, optional\n", " | Whether `fun` is implemented in a vectorized fashion. A vectorized\n", " | implementation offers no advantages for this solver. Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | nfev : int\n", " | Number of evaluations of the right-hand side.\n", " | njev : int\n", " | Number of evaluations of the Jacobian.\n", " | \n", " | References\n", " | ----------\n", " | .. [1] A. C. Hindmarsh, \"ODEPACK, A Systematized Collection of ODE\n", " | Solvers,\" IMACS Transactions on Scientific Computation, Vol 1.,\n", " | pp. 55-64, 1983.\n", " | .. [2] L. Petzold, \"Automatic selection of methods for solving stiff and\n", " | nonstiff systems of ordinary differential equations\", SIAM Journal\n", " | on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148,\n", " | 1983.\n", " | \n", " | Method resolution order:\n", " | LSODA\n", " | scipy.integrate._ivp.base.OdeSolver\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, first_step=None, min_step=0.0, max_step=inf, rtol=0.001, atol=1e-06, jac=None, lband=None, uband=None, vectorized=False, **extraneous)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class OdeSolution(builtins.object)\n", " | OdeSolution(ts, interpolants)\n", " | \n", " | Continuous ODE solution.\n", " | \n", " | It is organized as a collection of `DenseOutput` objects which represent\n", " | local interpolants. It provides an algorithm to select a right interpolant\n", " | for each given point.\n", " | \n", " | The interpolants cover the range between `t_min` and `t_max` (see\n", " | Attributes below). Evaluation outside this interval is not forbidden, but\n", " | the accuracy is not guaranteed.\n", " | \n", " | When evaluating at a breakpoint (one of the values in `ts`) a segment with\n", " | the lower index is selected.\n", " | \n", " | Parameters\n", " | ----------\n", " | ts : array_like, shape (n_segments + 1,)\n", " | Time instants between which local interpolants are defined. Must\n", " | be strictly increasing or decreasing (zero segment with two points is\n", " | also allowed).\n", " | interpolants : list of DenseOutput with n_segments elements\n", " | Local interpolants. An i-th interpolant is assumed to be defined\n", " | between ``ts[i]`` and ``ts[i + 1]``.\n", " | \n", " | Attributes\n", " | ----------\n", " | t_min, t_max : float\n", " | Time range of the interpolation.\n", " | \n", " | Methods defined here:\n", " | \n", " | __call__(self, t)\n", " | Evaluate the solution.\n", " | \n", " | Parameters\n", " | ----------\n", " | t : float or array_like with shape (n_points,)\n", " | Points to evaluate at.\n", " | \n", " | Returns\n", " | -------\n", " | y : ndarray, shape (n_states,) or (n_states, n_points)\n", " | Computed values. Shape depends on whether `t` is a scalar or a\n", " | 1-d array.\n", " | \n", " | __init__(self, ts, interpolants)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " \n", " class OdeSolver(builtins.object)\n", " | OdeSolver(fun, t0, y0, t_bound, vectorized, support_complex=False)\n", " | \n", " | Base class for ODE solvers.\n", " | \n", " | In order to implement a new solver you need to follow the guidelines:\n", " | \n", " | 1. A constructor must accept parameters presented in the base class\n", " | (listed below) along with any other parameters specific to a solver.\n", " | 2. A constructor must accept arbitrary extraneous arguments\n", " | ``**extraneous``, but warn that these arguments are irrelevant\n", " | using `common.warn_extraneous` function. Do not pass these\n", " | arguments to the base class.\n", " | 3. A solver must implement a private method `_step_impl(self)` which\n", " | propagates a solver one step further. It must return tuple\n", " | ``(success, message)``, where ``success`` is a boolean indicating\n", " | whether a step was successful, and ``message`` is a string\n", " | containing description of a failure if a step failed or None\n", " | otherwise.\n", " | 4. A solver must implement a private method `_dense_output_impl(self)`\n", " | which returns a `DenseOutput` object covering the last successful\n", " | step.\n", " | 5. A solver must have attributes listed below in Attributes section.\n", " | Note that ``t_old`` and ``step_size`` are updated automatically.\n", " | 6. Use `fun(self, t, y)` method for the system rhs evaluation, this\n", " | way the number of function evaluations (`nfev`) will be tracked\n", " | automatically.\n", " | 7. For convenience a base class provides `fun_single(self, t, y)` and\n", " | `fun_vectorized(self, t, y)` for evaluating the rhs in\n", " | non-vectorized and vectorized fashions respectively (regardless of\n", " | how `fun` from the constructor is implemented). These calls don't\n", " | increment `nfev`.\n", " | 8. If a solver uses a Jacobian matrix and LU decompositions, it should\n", " | track the number of Jacobian evaluations (`njev`) and the number of\n", " | LU decompositions (`nlu`).\n", " | 9. By convention the function evaluations used to compute a finite\n", " | difference approximation of the Jacobian should not be counted in\n", " | `nfev`, thus use `fun_single(self, t, y)` or\n", " | `fun_vectorized(self, t, y)` when computing a finite difference\n", " | approximation of the Jacobian.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n", " | It can either have shape (n,), then ``fun`` must return array_like with\n", " | shape (n,). Or alternatively it can have shape (n, n_points), then\n", " | ``fun`` must return array_like with shape (n, n_points) (each column\n", " | corresponds to a single column in ``y``). The choice between the two\n", " | options is determined by `vectorized` argument (see below).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time --- the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | vectorized : bool\n", " | Whether `fun` is implemented in a vectorized fashion.\n", " | support_complex : bool, optional\n", " | Whether integration in a complex domain should be supported.\n", " | Generally determined by a derived solver class capabilities.\n", " | Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | step_size : float\n", " | Size of the last successful step. None if no steps were made yet.\n", " | nfev : int\n", " | Number of the system's rhs evaluations.\n", " | njev : int\n", " | Number of the Jacobian evaluations.\n", " | nlu : int\n", " | Number of LU decompositions.\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, vectorized, support_complex=False)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties defined here:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes defined here:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class RK23(RungeKutta)\n", " | RK23(fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, first_step=None, **extraneous)\n", " | \n", " | Explicit Runge-Kutta method of order 3(2).\n", " | \n", " | This uses the Bogacki-Shampine pair of formulas [1]_. The error is controlled\n", " | assuming accuracy of the second-order method, but steps are taken using the\n", " | third-order accurate formula (local extrapolation is done). A cubic Hermite\n", " | polynomial is used for the dense output.\n", " | \n", " | Can be applied in the complex domain.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n", " | It can either have shape (n,), then ``fun`` must return array_like with\n", " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n", " | must return array_like with shape (n, k), i.e. each column\n", " | corresponds to a single column in ``y``. The choice between the two\n", " | options is determined by `vectorized` argument (see below).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time - the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | first_step : float or None, optional\n", " | Initial step size. Default is ``None`` which means that the algorithm\n", " | should choose.\n", " | max_step : float, optional\n", " | Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | rtol, atol : float and array_like, optional\n", " | Relative and absolute tolerances. The solver keeps the local error\n", " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " | relative accuracy (number of correct digits). But if a component of `y`\n", " | is approximately below `atol`, the error only needs to fall within\n", " | the same `atol` threshold, and the number of correct digits is not\n", " | guaranteed. If components of y have different scales, it might be\n", " | beneficial to set different `atol` values for different components by\n", " | passing array_like with shape (n,) for `atol`. Default values are\n", " | 1e-3 for `rtol` and 1e-6 for `atol`.\n", " | vectorized : bool, optional\n", " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | step_size : float\n", " | Size of the last successful step. None if no steps were made yet.\n", " | nfev : int\n", " | Number evaluations of the system's right-hand side.\n", " | njev : int\n", " | Number of evaluations of the Jacobian. Is always 0 for this solver as it does not use the Jacobian.\n", " | nlu : int\n", " | Number of LU decompositions. Is always 0 for this solver.\n", " | \n", " | References\n", " | ----------\n", " | .. [1] P. Bogacki, L.F. Shampine, \"A 3(2) Pair of Runge-Kutta Formulas\",\n", " | Appl. Math. Lett. Vol. 2, No. 4. pp. 321-325, 1989.\n", " | \n", " | Method resolution order:\n", " | RK23\n", " | RungeKutta\n", " | scipy.integrate._ivp.base.OdeSolver\n", " | builtins.object\n", " | \n", " | Data and other attributes defined here:\n", " | \n", " | A = [array([0.5]), array([0. , 0.75])]\n", " | \n", " | B = array([0.22222222, 0.33333333, 0.44444444])\n", " | \n", " | C = array([0.5 , 0.75])\n", " | \n", " | E = array([ 0.06944444, -0.08333333, -0.11111111, 0.125 ])\n", " | \n", " | P = array([[ 1. , -1.33333333, 0.55555556],\n", " | ...\n", " | [ 0. ...\n", " | \n", " | n_stages = 3\n", " | \n", " | order = 2\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from RungeKutta:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, first_step=None, **extraneous)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class RK45(RungeKutta)\n", " | RK45(fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, first_step=None, **extraneous)\n", " | \n", " | Explicit Runge-Kutta method of order 5(4).\n", " | \n", " | This uses the Dormand-Prince pair of formulas [1]_. The error is controlled\n", " | assuming accuracy of the fourth-order method accuracy, but steps are taken\n", " | using the fifth-order accurate formula (local extrapolation is done).\n", " | A quartic interpolation polynomial is used for the dense output [2]_.\n", " | \n", " | Can be applied in the complex domain.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar, and there are two options for the ndarray ``y``:\n", " | It can either have shape (n,); then ``fun`` must return array_like with\n", " | shape (n,). Alternatively it can have shape (n, k); then ``fun``\n", " | must return an array_like with shape (n, k), i.e. each column\n", " | corresponds to a single column in ``y``. The choice between the two\n", " | options is determined by `vectorized` argument (see below).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time - the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | first_step : float or None, optional\n", " | Initial step size. Default is ``None`` which means that the algorithm\n", " | should choose.\n", " | max_step : float, optional\n", " | Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | rtol, atol : float and array_like, optional\n", " | Relative and absolute tolerances. The solver keeps the local error\n", " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " | relative accuracy (number of correct digits). But if a component of `y`\n", " | is approximately below `atol`, the error only needs to fall within\n", " | the same `atol` threshold, and the number of correct digits is not\n", " | guaranteed. If components of y have different scales, it might be\n", " | beneficial to set different `atol` values for different components by\n", " | passing array_like with shape (n,) for `atol`. Default values are\n", " | 1e-3 for `rtol` and 1e-6 for `atol`.\n", " | vectorized : bool, optional\n", " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | step_size : float\n", " | Size of the last successful step. None if no steps were made yet.\n", " | nfev : int\n", " | Number evaluations of the system's right-hand side.\n", " | njev : int\n", " | Number of evaluations of the Jacobian. Is always 0 for this solver as it does not use the Jacobian.\n", " | nlu : int\n", " | Number of LU decompositions. Is always 0 for this solver.\n", " | \n", " | References\n", " | ----------\n", " | .. [1] J. R. Dormand, P. J. Prince, \"A family of embedded Runge-Kutta\n", " | formulae\", Journal of Computational and Applied Mathematics, Vol. 6,\n", " | No. 1, pp. 19-26, 1980.\n", " | .. [2] L. W. Shampine, \"Some Practical Runge-Kutta Formulas\", Mathematics\n", " | of Computation,, Vol. 46, No. 173, pp. 135-150, 1986.\n", " | \n", " | Method resolution order:\n", " | RK45\n", " | RungeKutta\n", " | scipy.integrate._ivp.base.OdeSolver\n", " | builtins.object\n", " | \n", " | Data and other attributes defined here:\n", " | \n", " | A = [array([0.2]), array([0.075, 0.225]), array([ 0.97777778, -3.73333...\n", " | \n", " | B = array([ 0.09114583, 0. , 0.4492363 , 0.65104167, -0.3223...\n", " | \n", " | C = array([0.2 , 0.3 , 0.8 , 0.88888889, 1. ]...\n", " | \n", " | E = array([-0.00123264, 0. , 0.00425277, -0...7, 0.0508638 ,...\n", " | \n", " | P = array([[ 1. , -2.85358007, 3.07174346, -... , 1.382...\n", " | \n", " | n_stages = 6\n", " | \n", " | order = 4\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from RungeKutta:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, first_step=None, **extraneous)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class Radau(scipy.integrate._ivp.base.OdeSolver)\n", " | Radau(fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, first_step=None, **extraneous)\n", " | \n", " | Implicit Runge-Kutta method of Radau IIA family of order 5.\n", " | \n", " | The implementation follows [1]_. The error is controlled with a\n", " | third-order accurate embedded formula. A cubic polynomial which satisfies\n", " | the collocation conditions is used for the dense output.\n", " | \n", " | Parameters\n", " | ----------\n", " | fun : callable\n", " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " | Here ``t`` is a scalar, and there are two options for the ndarray ``y``:\n", " | It can either have shape (n,); then ``fun`` must return array_like with\n", " | shape (n,). Alternatively it can have shape (n, k); then ``fun``\n", " | must return an array_like with shape (n, k), i.e. each column\n", " | corresponds to a single column in ``y``. The choice between the two\n", " | options is determined by `vectorized` argument (see below). The\n", " | vectorized implementation allows a faster approximation of the Jacobian\n", " | by finite differences (required for this solver).\n", " | t0 : float\n", " | Initial time.\n", " | y0 : array_like, shape (n,)\n", " | Initial state.\n", " | t_bound : float\n", " | Boundary time - the integration won't continue beyond it. It also\n", " | determines the direction of the integration.\n", " | first_step : float or None, optional\n", " | Initial step size. Default is ``None`` which means that the algorithm\n", " | should choose.\n", " | max_step : float, optional\n", " | Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " | bounded and determined solely by the solver.\n", " | rtol, atol : float and array_like, optional\n", " | Relative and absolute tolerances. The solver keeps the local error\n", " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " | relative accuracy (number of correct digits). But if a component of `y`\n", " | is approximately below `atol`, the error only needs to fall within\n", " | the same `atol` threshold, and the number of correct digits is not\n", " | guaranteed. If components of y have different scales, it might be\n", " | beneficial to set different `atol` values for different components by\n", " | passing array_like with shape (n,) for `atol`. Default values are\n", " | 1e-3 for `rtol` and 1e-6 for `atol`.\n", " | jac : {None, array_like, sparse_matrix, callable}, optional\n", " | Jacobian matrix of the right-hand side of the system with respect to\n", " | y, required by this method. The Jacobian matrix has shape (n, n) and\n", " | its element (i, j) is equal to ``d f_i / d y_j``.\n", " | There are three ways to define the Jacobian:\n", " | \n", " | * If array_like or sparse_matrix, the Jacobian is assumed to\n", " | be constant.\n", " | * If callable, the Jacobian is assumed to depend on both\n", " | t and y; it will be called as ``jac(t, y)`` as necessary.\n", " | For the 'Radau' and 'BDF' methods, the return value might be a\n", " | sparse matrix.\n", " | * If None (default), the Jacobian will be approximated by\n", " | finite differences.\n", " | \n", " | It is generally recommended to provide the Jacobian rather than\n", " | relying on a finite-difference approximation.\n", " | jac_sparsity : {None, array_like, sparse matrix}, optional\n", " | Defines a sparsity structure of the Jacobian matrix for a\n", " | finite-difference approximation. Its shape must be (n, n). This argument\n", " | is ignored if `jac` is not `None`. If the Jacobian has only few non-zero\n", " | elements in *each* row, providing the sparsity structure will greatly\n", " | speed up the computations [2]_. A zero entry means that a corresponding\n", " | element in the Jacobian is always zero. If None (default), the Jacobian\n", " | is assumed to be dense.\n", " | vectorized : bool, optional\n", " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n", " | \n", " | Attributes\n", " | ----------\n", " | n : int\n", " | Number of equations.\n", " | status : string\n", " | Current status of the solver: 'running', 'finished' or 'failed'.\n", " | t_bound : float\n", " | Boundary time.\n", " | direction : float\n", " | Integration direction: +1 or -1.\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current state.\n", " | t_old : float\n", " | Previous time. None if no steps were made yet.\n", " | step_size : float\n", " | Size of the last successful step. None if no steps were made yet.\n", " | nfev : int\n", " | Number of evaluations of the right-hand side.\n", " | njev : int\n", " | Number of evaluations of the Jacobian.\n", " | nlu : int\n", " | Number of LU decompositions.\n", " | \n", " | References\n", " | ----------\n", " | .. [1] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations II:\n", " | Stiff and Differential-Algebraic Problems\", Sec. IV.8.\n", " | .. [2] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n", " | sparse Jacobian matrices\", Journal of the Institute of Mathematics\n", " | and its Applications, 13, pp. 117-120, 1974.\n", " | \n", " | Method resolution order:\n", " | Radau\n", " | scipy.integrate._ivp.base.OdeSolver\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, first_step=None, **extraneous)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | dense_output(self)\n", " | Compute a local interpolant over the last successful step.\n", " | \n", " | Returns\n", " | -------\n", " | sol : `DenseOutput`\n", " | Local interpolant over the last successful step.\n", " | \n", " | step(self)\n", " | Perform one integration step.\n", " | \n", " | Returns\n", " | -------\n", " | message : string or None\n", " | Report from the solver. Typically a reason for a failure if\n", " | `self.status` is 'failed' after the step was taken or None\n", " | otherwise.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | step_size\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n", " | \n", " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n", " \n", " class complex_ode(ode)\n", " | complex_ode(f, jac=None)\n", " | \n", " | A wrapper of ode for complex systems.\n", " | \n", " | This functions similarly as `ode`, but re-maps a complex-valued\n", " | equation system to a real-valued one before using the integrators.\n", " | \n", " | Parameters\n", " | ----------\n", " | f : callable ``f(t, y, *f_args)``\n", " | Rhs of the equation. t is a scalar, ``y.shape == (n,)``.\n", " | ``f_args`` is set by calling ``set_f_params(*args)``.\n", " | jac : callable ``jac(t, y, *jac_args)``\n", " | Jacobian of the rhs, ``jac[i,j] = d f[i] / d y[j]``.\n", " | ``jac_args`` is set by calling ``set_f_params(*args)``.\n", " | \n", " | Attributes\n", " | ----------\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current variable values.\n", " | \n", " | Examples\n", " | --------\n", " | For usage examples, see `ode`.\n", " | \n", " | Method resolution order:\n", " | complex_ode\n", " | ode\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, f, jac=None)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | integrate(self, t, step=False, relax=False)\n", " | Find y=y(t), set y as an initial condition, and return y.\n", " | \n", " | Parameters\n", " | ----------\n", " | t : float\n", " | The endpoint of the integration step.\n", " | step : bool\n", " | If True, and if the integrator supports the step method,\n", " | then perform a single integration step and return.\n", " | This parameter is provided in order to expose internals of\n", " | the implementation, and should not be changed from its default\n", " | value in most cases.\n", " | relax : bool\n", " | If True and if the integrator supports the run_relax method,\n", " | then integrate until t_1 >= t and return. ``relax`` is not\n", " | referenced if ``step=True``.\n", " | This parameter is provided in order to expose internals of\n", " | the implementation, and should not be changed from its default\n", " | value in most cases.\n", " | \n", " | Returns\n", " | -------\n", " | y : float\n", " | The integrated value at t\n", " | \n", " | set_initial_value(self, y, t=0.0)\n", " | Set initial conditions y(t) = y.\n", " | \n", " | set_integrator(self, name, **integrator_params)\n", " | Set integrator by name.\n", " | \n", " | Parameters\n", " | ----------\n", " | name : str\n", " | Name of the integrator\n", " | integrator_params\n", " | Additional parameters for the integrator.\n", " | \n", " | set_solout(self, solout)\n", " | Set callable to be called at every successful integration step.\n", " | \n", " | Parameters\n", " | ----------\n", " | solout : callable\n", " | ``solout(t, y)`` is called at each internal integrator step,\n", " | t is a scalar providing the current independent position\n", " | y is the current soloution ``y.shape == (n,)``\n", " | solout should return -1 to stop integration\n", " | otherwise it should return None or 0\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties defined here:\n", " | \n", " | y\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from ode:\n", " | \n", " | get_return_code(self)\n", " | Extracts the return code for the integration to enable better control\n", " | if the integration fails.\n", " | \n", " | In general, a return code > 0 implies success while a return code < 0\n", " | implies failure.\n", " | \n", " | Notes\n", " | -----\n", " | This section describes possible return codes and their meaning, for available\n", " | integrators that can be selected by `set_integrator` method.\n", " | \n", " | \"vode\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call. (Perhaps wrong MF.)\n", " | -2 Excess accuracy requested. (Tolerances too small.)\n", " | -3 Illegal input detected. (See printed message.)\n", " | -4 Repeated error test failures. (Check all input.)\n", " | -5 Repeated convergence failures. (Perhaps bad Jacobian\n", " | supplied or wrong choice of MF or tolerances.)\n", " | -6 Error weight became zero during problem. (Solution\n", " | component i vanished, and ATOL or ATOL(i) = 0.)\n", " | =========== =======\n", " | \n", " | \"zvode\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call. (Perhaps wrong MF.)\n", " | -2 Excess accuracy requested. (Tolerances too small.)\n", " | -3 Illegal input detected. (See printed message.)\n", " | -4 Repeated error test failures. (Check all input.)\n", " | -5 Repeated convergence failures. (Perhaps bad Jacobian\n", " | supplied or wrong choice of MF or tolerances.)\n", " | -6 Error weight became zero during problem. (Solution\n", " | component i vanished, and ATOL or ATOL(i) = 0.)\n", " | =========== =======\n", " | \n", " | \"dopri5\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 1 Integration successful.\n", " | 2 Integration successful (interrupted by solout).\n", " | -1 Input is not consistent.\n", " | -2 Larger nsteps is needed.\n", " | -3 Step size becomes too small.\n", " | -4 Problem is probably stiff (interrupted).\n", " | =========== =======\n", " | \n", " | \"dop853\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 1 Integration successful.\n", " | 2 Integration successful (interrupted by solout).\n", " | -1 Input is not consistent.\n", " | -2 Larger nsteps is needed.\n", " | -3 Step size becomes too small.\n", " | -4 Problem is probably stiff (interrupted).\n", " | =========== =======\n", " | \n", " | \"lsoda\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call (perhaps wrong Dfun type).\n", " | -2 Excess accuracy requested (tolerances too small).\n", " | -3 Illegal input detected (internal error).\n", " | -4 Repeated error test failures (internal error).\n", " | -5 Repeated convergence failures (perhaps bad Jacobian or tolerances).\n", " | -6 Error weight became zero during problem.\n", " | -7 Internal workspace insufficient to finish (internal error).\n", " | =========== =======\n", " | \n", " | set_f_params(self, *args)\n", " | Set extra parameters for user-supplied function f.\n", " | \n", " | set_jac_params(self, *args)\n", " | Set extra parameters for user-supplied function jac.\n", " | \n", " | successful(self)\n", " | Check if integration was successful.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from ode:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " \n", " class ode(builtins.object)\n", " | ode(f, jac=None)\n", " | \n", " | A generic interface class to numeric integrators.\n", " | \n", " | Solve an equation system :math:`y'(t) = f(t,y)` with (optional) ``jac = df/dy``.\n", " | \n", " | *Note*: The first two arguments of ``f(t, y, ...)`` are in the\n", " | opposite order of the arguments in the system definition function used\n", " | by `scipy.integrate.odeint`.\n", " | \n", " | Parameters\n", " | ----------\n", " | f : callable ``f(t, y, *f_args)``\n", " | Right-hand side of the differential equation. t is a scalar,\n", " | ``y.shape == (n,)``.\n", " | ``f_args`` is set by calling ``set_f_params(*args)``.\n", " | `f` should return a scalar, array or list (not a tuple).\n", " | jac : callable ``jac(t, y, *jac_args)``, optional\n", " | Jacobian of the right-hand side, ``jac[i,j] = d f[i] / d y[j]``.\n", " | ``jac_args`` is set by calling ``set_jac_params(*args)``.\n", " | \n", " | Attributes\n", " | ----------\n", " | t : float\n", " | Current time.\n", " | y : ndarray\n", " | Current variable values.\n", " | \n", " | See also\n", " | --------\n", " | odeint : an integrator with a simpler interface based on lsoda from ODEPACK\n", " | quad : for finding the area under a curve\n", " | \n", " | Notes\n", " | -----\n", " | Available integrators are listed below. They can be selected using\n", " | the `set_integrator` method.\n", " | \n", " | \"vode\"\n", " | \n", " | Real-valued Variable-coefficient Ordinary Differential Equation\n", " | solver, with fixed-leading-coefficient implementation. It provides\n", " | implicit Adams method (for non-stiff problems) and a method based on\n", " | backward differentiation formulas (BDF) (for stiff problems).\n", " | \n", " | Source: http://www.netlib.org/ode/vode.f\n", " | \n", " | .. warning::\n", " | \n", " | This integrator is not re-entrant. You cannot have two `ode`\n", " | instances using the \"vode\" integrator at the same time.\n", " | \n", " | This integrator accepts the following parameters in `set_integrator`\n", " | method of the `ode` class:\n", " | \n", " | - atol : float or sequence\n", " | absolute tolerance for solution\n", " | - rtol : float or sequence\n", " | relative tolerance for solution\n", " | - lband : None or int\n", " | - uband : None or int\n", " | Jacobian band width, jac[i,j] != 0 for i-lband <= j <= i+uband.\n", " | Setting these requires your jac routine to return the jacobian\n", " | in packed format, jac_packed[i-j+uband, j] = jac[i,j]. The\n", " | dimension of the matrix must be (lband+uband+1, len(y)).\n", " | - method: 'adams' or 'bdf'\n", " | Which solver to use, Adams (non-stiff) or BDF (stiff)\n", " | - with_jacobian : bool\n", " | This option is only considered when the user has not supplied a\n", " | Jacobian function and has not indicated (by setting either band)\n", " | that the Jacobian is banded. In this case, `with_jacobian` specifies\n", " | whether the iteration method of the ODE solver's correction step is\n", " | chord iteration with an internally generated full Jacobian or\n", " | functional iteration with no Jacobian.\n", " | - nsteps : int\n", " | Maximum number of (internally defined) steps allowed during one\n", " | call to the solver.\n", " | - first_step : float\n", " | - min_step : float\n", " | - max_step : float\n", " | Limits for the step sizes used by the integrator.\n", " | - order : int\n", " | Maximum order used by the integrator,\n", " | order <= 12 for Adams, <= 5 for BDF.\n", " | \n", " | \"zvode\"\n", " | \n", " | Complex-valued Variable-coefficient Ordinary Differential Equation\n", " | solver, with fixed-leading-coefficient implementation. It provides\n", " | implicit Adams method (for non-stiff problems) and a method based on\n", " | backward differentiation formulas (BDF) (for stiff problems).\n", " | \n", " | Source: http://www.netlib.org/ode/zvode.f\n", " | \n", " | .. warning::\n", " | \n", " | This integrator is not re-entrant. You cannot have two `ode`\n", " | instances using the \"zvode\" integrator at the same time.\n", " | \n", " | This integrator accepts the same parameters in `set_integrator`\n", " | as the \"vode\" solver.\n", " | \n", " | .. note::\n", " | \n", " | When using ZVODE for a stiff system, it should only be used for\n", " | the case in which the function f is analytic, that is, when each f(i)\n", " | is an analytic function of each y(j). Analyticity means that the\n", " | partial derivative df(i)/dy(j) is a unique complex number, and this\n", " | fact is critical in the way ZVODE solves the dense or banded linear\n", " | systems that arise in the stiff case. For a complex stiff ODE system\n", " | in which f is not analytic, ZVODE is likely to have convergence\n", " | failures, and for this problem one should instead use DVODE on the\n", " | equivalent real system (in the real and imaginary parts of y).\n", " | \n", " | \"lsoda\"\n", " | \n", " | Real-valued Variable-coefficient Ordinary Differential Equation\n", " | solver, with fixed-leading-coefficient implementation. It provides\n", " | automatic method switching between implicit Adams method (for non-stiff\n", " | problems) and a method based on backward differentiation formulas (BDF)\n", " | (for stiff problems).\n", " | \n", " | Source: http://www.netlib.org/odepack\n", " | \n", " | .. warning::\n", " | \n", " | This integrator is not re-entrant. You cannot have two `ode`\n", " | instances using the \"lsoda\" integrator at the same time.\n", " | \n", " | This integrator accepts the following parameters in `set_integrator`\n", " | method of the `ode` class:\n", " | \n", " | - atol : float or sequence\n", " | absolute tolerance for solution\n", " | - rtol : float or sequence\n", " | relative tolerance for solution\n", " | - lband : None or int\n", " | - uband : None or int\n", " | Jacobian band width, jac[i,j] != 0 for i-lband <= j <= i+uband.\n", " | Setting these requires your jac routine to return the jacobian\n", " | in packed format, jac_packed[i-j+uband, j] = jac[i,j].\n", " | - with_jacobian : bool\n", " | *Not used.*\n", " | - nsteps : int\n", " | Maximum number of (internally defined) steps allowed during one\n", " | call to the solver.\n", " | - first_step : float\n", " | - min_step : float\n", " | - max_step : float\n", " | Limits for the step sizes used by the integrator.\n", " | - max_order_ns : int\n", " | Maximum order used in the nonstiff case (default 12).\n", " | - max_order_s : int\n", " | Maximum order used in the stiff case (default 5).\n", " | - max_hnil : int\n", " | Maximum number of messages reporting too small step size (t + h = t)\n", " | (default 0)\n", " | - ixpr : int\n", " | Whether to generate extra printing at method switches (default False).\n", " | \n", " | \"dopri5\"\n", " | \n", " | This is an explicit runge-kutta method of order (4)5 due to Dormand &\n", " | Prince (with stepsize control and dense output).\n", " | \n", " | Authors:\n", " | \n", " | E. Hairer and G. Wanner\n", " | Universite de Geneve, Dept. de Mathematiques\n", " | CH-1211 Geneve 24, Switzerland\n", " | e-mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch\n", " | \n", " | This code is described in [HNW93]_.\n", " | \n", " | This integrator accepts the following parameters in set_integrator()\n", " | method of the ode class:\n", " | \n", " | - atol : float or sequence\n", " | absolute tolerance for solution\n", " | - rtol : float or sequence\n", " | relative tolerance for solution\n", " | - nsteps : int\n", " | Maximum number of (internally defined) steps allowed during one\n", " | call to the solver.\n", " | - first_step : float\n", " | - max_step : float\n", " | - safety : float\n", " | Safety factor on new step selection (default 0.9)\n", " | - ifactor : float\n", " | - dfactor : float\n", " | Maximum factor to increase/decrease step size by in one step\n", " | - beta : float\n", " | Beta parameter for stabilised step size control.\n", " | - verbosity : int\n", " | Switch for printing messages (< 0 for no messages).\n", " | \n", " | \"dop853\"\n", " | \n", " | This is an explicit runge-kutta method of order 8(5,3) due to Dormand\n", " | & Prince (with stepsize control and dense output).\n", " | \n", " | Options and references the same as \"dopri5\".\n", " | \n", " | Examples\n", " | --------\n", " | \n", " | A problem to integrate and the corresponding jacobian:\n", " | \n", " | >>> from scipy.integrate import ode\n", " | >>>\n", " | >>> y0, t0 = [1.0j, 2.0], 0\n", " | >>>\n", " | >>> def f(t, y, arg1):\n", " | ... return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]\n", " | >>> def jac(t, y, arg1):\n", " | ... return [[1j*arg1, 1], [0, -arg1*2*y[1]]]\n", " | \n", " | The integration:\n", " | \n", " | >>> r = ode(f, jac).set_integrator('zvode', method='bdf')\n", " | >>> r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)\n", " | >>> t1 = 10\n", " | >>> dt = 1\n", " | >>> while r.successful() and r.t < t1:\n", " | ... print(r.t+dt, r.integrate(r.t+dt))\n", " | 1 [-0.71038232+0.23749653j 0.40000271+0.j ]\n", " | 2.0 [0.19098503-0.52359246j 0.22222356+0.j ]\n", " | 3.0 [0.47153208+0.52701229j 0.15384681+0.j ]\n", " | 4.0 [-0.61905937+0.30726255j 0.11764744+0.j ]\n", " | 5.0 [0.02340997-0.61418799j 0.09523835+0.j ]\n", " | 6.0 [0.58643071+0.339819j 0.08000018+0.j ]\n", " | 7.0 [-0.52070105+0.44525141j 0.06896565+0.j ]\n", " | 8.0 [-0.15986733-0.61234476j 0.06060616+0.j ]\n", " | 9.0 [0.64850462+0.15048982j 0.05405414+0.j ]\n", " | 10.0 [-0.38404699+0.56382299j 0.04878055+0.j ]\n", " | \n", " | References\n", " | ----------\n", " | .. [HNW93] E. Hairer, S.P. Norsett and G. Wanner, Solving Ordinary\n", " | Differential Equations i. Nonstiff Problems. 2nd edition.\n", " | Springer Series in Computational Mathematics,\n", " | Springer-Verlag (1993)\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, f, jac=None)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | get_return_code(self)\n", " | Extracts the return code for the integration to enable better control\n", " | if the integration fails.\n", " | \n", " | In general, a return code > 0 implies success while a return code < 0\n", " | implies failure.\n", " | \n", " | Notes\n", " | -----\n", " | This section describes possible return codes and their meaning, for available\n", " | integrators that can be selected by `set_integrator` method.\n", " | \n", " | \"vode\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call. (Perhaps wrong MF.)\n", " | -2 Excess accuracy requested. (Tolerances too small.)\n", " | -3 Illegal input detected. (See printed message.)\n", " | -4 Repeated error test failures. (Check all input.)\n", " | -5 Repeated convergence failures. (Perhaps bad Jacobian\n", " | supplied or wrong choice of MF or tolerances.)\n", " | -6 Error weight became zero during problem. (Solution\n", " | component i vanished, and ATOL or ATOL(i) = 0.)\n", " | =========== =======\n", " | \n", " | \"zvode\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call. (Perhaps wrong MF.)\n", " | -2 Excess accuracy requested. (Tolerances too small.)\n", " | -3 Illegal input detected. (See printed message.)\n", " | -4 Repeated error test failures. (Check all input.)\n", " | -5 Repeated convergence failures. (Perhaps bad Jacobian\n", " | supplied or wrong choice of MF or tolerances.)\n", " | -6 Error weight became zero during problem. (Solution\n", " | component i vanished, and ATOL or ATOL(i) = 0.)\n", " | =========== =======\n", " | \n", " | \"dopri5\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 1 Integration successful.\n", " | 2 Integration successful (interrupted by solout).\n", " | -1 Input is not consistent.\n", " | -2 Larger nsteps is needed.\n", " | -3 Step size becomes too small.\n", " | -4 Problem is probably stiff (interrupted).\n", " | =========== =======\n", " | \n", " | \"dop853\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 1 Integration successful.\n", " | 2 Integration successful (interrupted by solout).\n", " | -1 Input is not consistent.\n", " | -2 Larger nsteps is needed.\n", " | -3 Step size becomes too small.\n", " | -4 Problem is probably stiff (interrupted).\n", " | =========== =======\n", " | \n", " | \"lsoda\"\n", " | \n", " | =========== =======\n", " | Return Code Message\n", " | =========== =======\n", " | 2 Integration successful.\n", " | -1 Excess work done on this call (perhaps wrong Dfun type).\n", " | -2 Excess accuracy requested (tolerances too small).\n", " | -3 Illegal input detected (internal error).\n", " | -4 Repeated error test failures (internal error).\n", " | -5 Repeated convergence failures (perhaps bad Jacobian or tolerances).\n", " | -6 Error weight became zero during problem.\n", " | -7 Internal workspace insufficient to finish (internal error).\n", " | =========== =======\n", " | \n", " | integrate(self, t, step=False, relax=False)\n", " | Find y=y(t), set y as an initial condition, and return y.\n", " | \n", " | Parameters\n", " | ----------\n", " | t : float\n", " | The endpoint of the integration step.\n", " | step : bool\n", " | If True, and if the integrator supports the step method,\n", " | then perform a single integration step and return.\n", " | This parameter is provided in order to expose internals of\n", " | the implementation, and should not be changed from its default\n", " | value in most cases.\n", " | relax : bool\n", " | If True and if the integrator supports the run_relax method,\n", " | then integrate until t_1 >= t and return. ``relax`` is not\n", " | referenced if ``step=True``.\n", " | This parameter is provided in order to expose internals of\n", " | the implementation, and should not be changed from its default\n", " | value in most cases.\n", " | \n", " | Returns\n", " | -------\n", " | y : float\n", " | The integrated value at t\n", " | \n", " | set_f_params(self, *args)\n", " | Set extra parameters for user-supplied function f.\n", " | \n", " | set_initial_value(self, y, t=0.0)\n", " | Set initial conditions y(t) = y.\n", " | \n", " | set_integrator(self, name, **integrator_params)\n", " | Set integrator by name.\n", " | \n", " | Parameters\n", " | ----------\n", " | name : str\n", " | Name of the integrator.\n", " | integrator_params\n", " | Additional parameters for the integrator.\n", " | \n", " | set_jac_params(self, *args)\n", " | Set extra parameters for user-supplied function jac.\n", " | \n", " | set_solout(self, solout)\n", " | Set callable to be called at every successful integration step.\n", " | \n", " | Parameters\n", " | ----------\n", " | solout : callable\n", " | ``solout(t, y)`` is called at each internal integrator step,\n", " | t is a scalar providing the current independent position\n", " | y is the current soloution ``y.shape == (n,)``\n", " | solout should return -1 to stop integration\n", " | otherwise it should return None or 0\n", " | \n", " | successful(self)\n", " | Check if integration was successful.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties defined here:\n", " | \n", " | y\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", "\n", "FUNCTIONS\n", " cumtrapz(y, x=None, dx=1.0, axis=-1, initial=None)\n", " Cumulatively integrate y(x) using the composite trapezoidal rule.\n", " \n", " Parameters\n", " ----------\n", " y : array_like\n", " Values to integrate.\n", " x : array_like, optional\n", " The coordinate to integrate along. If None (default), use spacing `dx`\n", " between consecutive elements in `y`.\n", " dx : float, optional\n", " Spacing between elements of `y`. Only used if `x` is None.\n", " axis : int, optional\n", " Specifies the axis to cumulate. Default is -1 (last axis).\n", " initial : scalar, optional\n", " If given, insert this value at the beginning of the returned result.\n", " Typically this value should be 0. Default is None, which means no\n", " value at ``x[0]`` is returned and `res` has one element less than `y`\n", " along the axis of integration.\n", " \n", " Returns\n", " -------\n", " res : ndarray\n", " The result of cumulative integration of `y` along `axis`.\n", " If `initial` is None, the shape is such that the axis of integration\n", " has one less value than `y`. If `initial` is given, the shape is equal\n", " to that of `y`.\n", " \n", " See Also\n", " --------\n", " numpy.cumsum, numpy.cumprod\n", " quad: adaptive quadrature using QUADPACK\n", " romberg: adaptive Romberg quadrature\n", " quadrature: adaptive Gaussian quadrature\n", " fixed_quad: fixed-order Gaussian quadrature\n", " dblquad: double integrals\n", " tplquad: triple integrals\n", " romb: integrators for sampled data\n", " ode: ODE integrators\n", " odeint: ODE integrators\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> import matplotlib.pyplot as plt\n", " \n", " >>> x = np.linspace(-2, 2, num=20)\n", " >>> y = x\n", " >>> y_int = integrate.cumtrapz(y, x, initial=0)\n", " >>> plt.plot(x, y_int, 'ro', x, y[0] + 0.5 * x**2, 'b-')\n", " >>> plt.show()\n", " \n", " dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)\n", " Compute a double integral.\n", " \n", " Return the double (definite) integral of ``func(y, x)`` from ``x = a..b``\n", " and ``y = gfun(x)..hfun(x)``.\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " A Python function or method of at least two variables: y must be the\n", " first argument and x the second argument.\n", " a, b : float\n", " The limits of integration in x: `a` < `b`\n", " gfun : callable or float\n", " The lower boundary curve in y which is a function taking a single\n", " floating point argument (x) and returning a floating point result\n", " or a float indicating a constant boundary curve.\n", " hfun : callable or float\n", " The upper boundary curve in y (same requirements as `gfun`).\n", " args : sequence, optional\n", " Extra arguments to pass to `func`.\n", " epsabs : float, optional\n", " Absolute tolerance passed directly to the inner 1-D quadrature\n", " integration. Default is 1.49e-8.\n", " epsrel : float, optional\n", " Relative tolerance of the inner 1-D integrals. Default is 1.49e-8.\n", " \n", " Returns\n", " -------\n", " y : float\n", " The resultant integral.\n", " abserr : float\n", " An estimate of the error.\n", " \n", " See also\n", " --------\n", " quad : single integral\n", " tplquad : triple integral\n", " nquad : N-dimensional integrals\n", " fixed_quad : fixed-order Gaussian quadrature\n", " quadrature : adaptive Gaussian quadrature\n", " odeint : ODE integrator\n", " ode : ODE integrator\n", " simps : integrator for sampled data\n", " romb : integrator for sampled data\n", " scipy.special : for coefficients and roots of orthogonal polynomials\n", " \n", " Examples\n", " --------\n", " \n", " Compute the double integral of ``x * y**2`` over the box\n", " ``x`` ranging from 0 to 2 and ``y`` ranging from 0 to 1.\n", " \n", " >>> from scipy import integrate\n", " >>> f = lambda y, x: x*y**2\n", " >>> integrate.dblquad(f, 0, 2, lambda x: 0, lambda x: 1)\n", " (0.6666666666666667, 7.401486830834377e-15)\n", " \n", " fixed_quad(func, a, b, args=(), n=5)\n", " Compute a definite integral using fixed-order Gaussian quadrature.\n", " \n", " Integrate `func` from `a` to `b` using Gaussian quadrature of\n", " order `n`.\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " A Python function or method to integrate (must accept vector inputs).\n", " If integrating a vector-valued function, the returned array must have\n", " shape ``(..., len(x))``.\n", " a : float\n", " Lower limit of integration.\n", " b : float\n", " Upper limit of integration.\n", " args : tuple, optional\n", " Extra arguments to pass to function, if any.\n", " n : int, optional\n", " Order of quadrature integration. Default is 5.\n", " \n", " Returns\n", " -------\n", " val : float\n", " Gaussian quadrature approximation to the integral\n", " none : None\n", " Statically returned value of None\n", " \n", " \n", " See Also\n", " --------\n", " quad : adaptive quadrature using QUADPACK\n", " dblquad : double integrals\n", " tplquad : triple integrals\n", " romberg : adaptive Romberg quadrature\n", " quadrature : adaptive Gaussian quadrature\n", " romb : integrators for sampled data\n", " simps : integrators for sampled data\n", " cumtrapz : cumulative integration for sampled data\n", " ode : ODE integrator\n", " odeint : ODE integrator\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> f = lambda x: x**8\n", " >>> integrate.fixed_quad(f, 0.0, 1.0, n=4)\n", " (0.1110884353741496, None)\n", " >>> integrate.fixed_quad(f, 0.0, 1.0, n=5)\n", " (0.11111111111111102, None)\n", " >>> print(1/9.0) # analytical result\n", " 0.1111111111111111\n", " \n", " >>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=4)\n", " (0.9999999771971152, None)\n", " >>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=5)\n", " (1.000000000039565, None)\n", " >>> np.sin(np.pi/2)-np.sin(0) # analytical result\n", " 1.0\n", " \n", " newton_cotes(rn, equal=0)\n", " Return weights and error coefficient for Newton-Cotes integration.\n", " \n", " Suppose we have (N+1) samples of f at the positions\n", " x_0, x_1, ..., x_N. Then an N-point Newton-Cotes formula for the\n", " integral between x_0 and x_N is:\n", " \n", " :math:`\\int_{x_0}^{x_N} f(x)dx = \\Delta x \\sum_{i=0}^{N} a_i f(x_i)\n", " + B_N (\\Delta x)^{N+2} f^{N+1} (\\xi)`\n", " \n", " where :math:`\\xi \\in [x_0,x_N]`\n", " and :math:`\\Delta x = \\frac{x_N-x_0}{N}` is the average samples spacing.\n", " \n", " If the samples are equally-spaced and N is even, then the error\n", " term is :math:`B_N (\\Delta x)^{N+3} f^{N+2}(\\xi)`.\n", " \n", " Parameters\n", " ----------\n", " rn : int\n", " The integer order for equally-spaced data or the relative positions of\n", " the samples with the first sample at 0 and the last at N, where N+1 is\n", " the length of `rn`. N is the order of the Newton-Cotes integration.\n", " equal : int, optional\n", " Set to 1 to enforce equally spaced data.\n", " \n", " Returns\n", " -------\n", " an : ndarray\n", " 1-D array of weights to apply to the function at the provided sample\n", " positions.\n", " B : float\n", " Error coefficient.\n", " \n", " Examples\n", " --------\n", " Compute the integral of sin(x) in [0, :math:`\\pi`]:\n", " \n", " >>> from scipy.integrate import newton_cotes\n", " >>> def f(x):\n", " ... return np.sin(x)\n", " >>> a = 0\n", " >>> b = np.pi\n", " >>> exact = 2\n", " >>> for N in [2, 4, 6, 8, 10]:\n", " ... x = np.linspace(a, b, N + 1)\n", " ... an, B = newton_cotes(N, 1)\n", " ... dx = (b - a) / N\n", " ... quad = dx * np.sum(an * f(x))\n", " ... error = abs(quad - exact)\n", " ... print('{:2d} {:10.9f} {:.5e}'.format(N, quad, error))\n", " ...\n", " 2 2.094395102 9.43951e-02\n", " 4 1.998570732 1.42927e-03\n", " 6 2.000017814 1.78136e-05\n", " 8 1.999999835 1.64725e-07\n", " 10 2.000000001 1.14677e-09\n", " \n", " Notes\n", " -----\n", " Normally, the Newton-Cotes rules are used on smaller integration\n", " regions and a composite rule is used to return the total integral.\n", " \n", " nquad(func, ranges, args=None, opts=None, full_output=False)\n", " Integration over multiple variables.\n", " \n", " Wraps `quad` to enable integration over multiple variables.\n", " Various options allow improved integration of discontinuous functions, as\n", " well as the use of weighted integration, and generally finer control of the\n", " integration process.\n", " \n", " Parameters\n", " ----------\n", " func : {callable, scipy.LowLevelCallable}\n", " The function to be integrated. Has arguments of ``x0, ... xn``,\n", " ``t0, tm``, where integration is carried out over ``x0, ... xn``, which\n", " must be floats. Function signature should be\n", " ``func(x0, x1, ..., xn, t0, t1, ..., tm)``. Integration is carried out\n", " in order. That is, integration over ``x0`` is the innermost integral,\n", " and ``xn`` is the outermost.\n", " \n", " If the user desires improved integration performance, then `f` may\n", " be a `scipy.LowLevelCallable` with one of the signatures::\n", " \n", " double func(int n, double *xx)\n", " double func(int n, double *xx, void *user_data)\n", " \n", " where ``n`` is the number of extra parameters and args is an array\n", " of doubles of the additional parameters, the ``xx`` array contains the\n", " coordinates. The ``user_data`` is the data contained in the\n", " `scipy.LowLevelCallable`.\n", " ranges : iterable object\n", " Each element of ranges may be either a sequence of 2 numbers, or else\n", " a callable that returns such a sequence. ``ranges[0]`` corresponds to\n", " integration over x0, and so on. If an element of ranges is a callable,\n", " then it will be called with all of the integration arguments available,\n", " as well as any parametric arguments. e.g. if\n", " ``func = f(x0, x1, x2, t0, t1)``, then ``ranges[0]`` may be defined as\n", " either ``(a, b)`` or else as ``(a, b) = range0(x1, x2, t0, t1)``.\n", " args : iterable object, optional\n", " Additional arguments ``t0, ..., tn``, required by `func`, `ranges`, and\n", " ``opts``.\n", " opts : iterable object or dict, optional\n", " Options to be passed to `quad`. May be empty, a dict, or\n", " a sequence of dicts or functions that return a dict. If empty, the\n", " default options from scipy.integrate.quad are used. If a dict, the same\n", " options are used for all levels of integraion. If a sequence, then each\n", " element of the sequence corresponds to a particular integration. e.g.\n", " opts[0] corresponds to integration over x0, and so on. If a callable,\n", " the signature must be the same as for ``ranges``. The available\n", " options together with their default values are:\n", " \n", " - epsabs = 1.49e-08\n", " - epsrel = 1.49e-08\n", " - limit = 50\n", " - points = None\n", " - weight = None\n", " - wvar = None\n", " - wopts = None\n", " \n", " For more information on these options, see `quad` and `quad_explain`.\n", " \n", " full_output : bool, optional\n", " Partial implementation of ``full_output`` from scipy.integrate.quad.\n", " The number of integrand function evaluations ``neval`` can be obtained\n", " by setting ``full_output=True`` when calling nquad.\n", " \n", " Returns\n", " -------\n", " result : float\n", " The result of the integration.\n", " abserr : float\n", " The maximum of the estimates of the absolute error in the various\n", " integration results.\n", " out_dict : dict, optional\n", " A dict containing additional information on the integration.\n", " \n", " See Also\n", " --------\n", " quad : 1-dimensional numerical integration\n", " dblquad, tplquad : double and triple integrals\n", " fixed_quad : fixed-order Gaussian quadrature\n", " quadrature : adaptive Gaussian quadrature\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> func = lambda x0,x1,x2,x3 : x0**2 + x1*x2 - x3**3 + np.sin(x0) + (\n", " ... 1 if (x0-.2*x3-.5-.25*x1>0) else 0)\n", " >>> points = [[lambda x1,x2,x3 : 0.2*x3 + 0.5 + 0.25*x1], [], [], []]\n", " >>> def opts0(*args, **kwargs):\n", " ... return {'points':[0.2*args[2] + 0.5 + 0.25*args[0]]}\n", " >>> integrate.nquad(func, [[0,1], [-1,1], [.13,.8], [-.15,1]],\n", " ... opts=[opts0,{},{},{}], full_output=True)\n", " (1.5267454070738633, 2.9437360001402324e-14, {'neval': 388962})\n", " \n", " >>> scale = .1\n", " >>> def func2(x0, x1, x2, x3, t0, t1):\n", " ... return x0*x1*x3**2 + np.sin(x2) + 1 + (1 if x0+t1*x1-t0>0 else 0)\n", " >>> def lim0(x1, x2, x3, t0, t1):\n", " ... return [scale * (x1**2 + x2 + np.cos(x3)*t0*t1 + 1) - 1,\n", " ... scale * (x1**2 + x2 + np.cos(x3)*t0*t1 + 1) + 1]\n", " >>> def lim1(x2, x3, t0, t1):\n", " ... return [scale * (t0*x2 + t1*x3) - 1,\n", " ... scale * (t0*x2 + t1*x3) + 1]\n", " >>> def lim2(x3, t0, t1):\n", " ... return [scale * (x3 + t0**2*t1**3) - 1,\n", " ... scale * (x3 + t0**2*t1**3) + 1]\n", " >>> def lim3(t0, t1):\n", " ... return [scale * (t0+t1) - 1, scale * (t0+t1) + 1]\n", " >>> def opts0(x1, x2, x3, t0, t1):\n", " ... return {'points' : [t0 - t1*x1]}\n", " >>> def opts1(x2, x3, t0, t1):\n", " ... return {}\n", " >>> def opts2(x3, t0, t1):\n", " ... return {}\n", " >>> def opts3(t0, t1):\n", " ... return {}\n", " >>> integrate.nquad(func2, [lim0, lim1, lim2, lim3], args=(0,0),\n", " ... opts=[opts0, opts1, opts2, opts3])\n", " (25.066666666666666, 2.7829590483937256e-13)\n", " \n", " odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0, tfirst=False)\n", " Integrate a system of ordinary differential equations.\n", " \n", " .. note:: For new code, use `scipy.integrate.solve_ivp` to solve a\n", " differential equation.\n", " \n", " Solve a system of ordinary differential equations using lsoda from the\n", " FORTRAN library odepack.\n", " \n", " Solves the initial value problem for stiff or non-stiff systems\n", " of first order ode-s::\n", " \n", " dy/dt = func(y, t, ...) [or func(t, y, ...)]\n", " \n", " where y can be a vector.\n", " \n", " .. note:: By default, the required order of the first two arguments of\n", " `func` are in the opposite order of the arguments in the system\n", " definition function used by the `scipy.integrate.ode` class and\n", " the function `scipy.integrate.solve_ivp`. To use a function with\n", " the signature ``func(t, y, ...)``, the argument `tfirst` must be\n", " set to ``True``.\n", " \n", " Parameters\n", " ----------\n", " func : callable(y, t, ...) or callable(t, y, ...)\n", " Computes the derivative of y at t.\n", " If the signature is ``callable(t, y, ...)``, then the argument\n", " `tfirst` must be set ``True``.\n", " y0 : array\n", " Initial condition on y (can be a vector).\n", " t : array\n", " A sequence of time points for which to solve for y. The initial\n", " value point should be the first element of this sequence.\n", " This sequence must be monotonically increasing or monotonically\n", " decreasing; repeated values are allowed.\n", " args : tuple, optional\n", " Extra arguments to pass to function.\n", " Dfun : callable(y, t, ...) or callable(t, y, ...)\n", " Gradient (Jacobian) of `func`.\n", " If the signature is ``callable(t, y, ...)``, then the argument\n", " `tfirst` must be set ``True``.\n", " col_deriv : bool, optional\n", " True if `Dfun` defines derivatives down columns (faster),\n", " otherwise `Dfun` should define derivatives across rows.\n", " full_output : bool, optional\n", " True if to return a dictionary of optional outputs as the second output\n", " printmessg : bool, optional\n", " Whether to print the convergence message\n", " tfirst: bool, optional\n", " If True, the first two arguments of `func` (and `Dfun`, if given)\n", " must ``t, y`` instead of the default ``y, t``.\n", " \n", " .. versionadded:: 1.1.0\n", " \n", " Returns\n", " -------\n", " y : array, shape (len(t), len(y0))\n", " Array containing the value of y for each desired time in t,\n", " with the initial value `y0` in the first row.\n", " infodict : dict, only returned if full_output == True\n", " Dictionary containing additional output information\n", " \n", " ======= ============================================================\n", " key meaning\n", " ======= ============================================================\n", " 'hu' vector of step sizes successfully used for each time step.\n", " 'tcur' vector with the value of t reached for each time step.\n", " (will always be at least as large as the input times).\n", " 'tolsf' vector of tolerance scale factors, greater than 1.0,\n", " computed when a request for too much accuracy was detected.\n", " 'tsw' value of t at the time of the last method switch\n", " (given for each time step)\n", " 'nst' cumulative number of time steps\n", " 'nfe' cumulative number of function evaluations for each time step\n", " 'nje' cumulative number of jacobian evaluations for each time step\n", " 'nqu' a vector of method orders for each successful step.\n", " 'imxer' index of the component of largest magnitude in the\n", " weighted local error vector (e / ewt) on an error return, -1\n", " otherwise.\n", " 'lenrw' the length of the double work array required.\n", " 'leniw' the length of integer work array required.\n", " 'mused' a vector of method indicators for each successful time step:\n", " 1: adams (nonstiff), 2: bdf (stiff)\n", " ======= ============================================================\n", " \n", " Other Parameters\n", " ----------------\n", " ml, mu : int, optional\n", " If either of these are not None or non-negative, then the\n", " Jacobian is assumed to be banded. These give the number of\n", " lower and upper non-zero diagonals in this banded matrix.\n", " For the banded case, `Dfun` should return a matrix whose\n", " rows contain the non-zero bands (starting with the lowest diagonal).\n", " Thus, the return matrix `jac` from `Dfun` should have shape\n", " ``(ml + mu + 1, len(y0))`` when ``ml >=0`` or ``mu >=0``.\n", " The data in `jac` must be stored such that ``jac[i - j + mu, j]``\n", " holds the derivative of the `i`th equation with respect to the `j`th\n", " state variable. If `col_deriv` is True, the transpose of this\n", " `jac` must be returned.\n", " rtol, atol : float, optional\n", " The input parameters `rtol` and `atol` determine the error\n", " control performed by the solver. The solver will control the\n", " vector, e, of estimated local errors in y, according to an\n", " inequality of the form ``max-norm of (e / ewt) <= 1``,\n", " where ewt is a vector of positive error weights computed as\n", " ``ewt = rtol * abs(y) + atol``.\n", " rtol and atol can be either vectors the same length as y or scalars.\n", " Defaults to 1.49012e-8.\n", " tcrit : ndarray, optional\n", " Vector of critical points (e.g. singularities) where integration\n", " care should be taken.\n", " h0 : float, (0: solver-determined), optional\n", " The step size to be attempted on the first step.\n", " hmax : float, (0: solver-determined), optional\n", " The maximum absolute step size allowed.\n", " hmin : float, (0: solver-determined), optional\n", " The minimum absolute step size allowed.\n", " ixpr : bool, optional\n", " Whether to generate extra printing at method switches.\n", " mxstep : int, (0: solver-determined), optional\n", " Maximum number of (internally defined) steps allowed for each\n", " integration point in t.\n", " mxhnil : int, (0: solver-determined), optional\n", " Maximum number of messages printed.\n", " mxordn : int, (0: solver-determined), optional\n", " Maximum order to be allowed for the non-stiff (Adams) method.\n", " mxords : int, (0: solver-determined), optional\n", " Maximum order to be allowed for the stiff (BDF) method.\n", " \n", " See Also\n", " --------\n", " solve_ivp : Solve an initial value problem for a system of ODEs.\n", " ode : a more object-oriented integrator based on VODE.\n", " quad : for finding the area under a curve.\n", " \n", " Examples\n", " --------\n", " The second order differential equation for the angle `theta` of a\n", " pendulum acted on by gravity with friction can be written::\n", " \n", " theta''(t) + b*theta'(t) + c*sin(theta(t)) = 0\n", " \n", " where `b` and `c` are positive constants, and a prime (') denotes a\n", " derivative. To solve this equation with `odeint`, we must first convert\n", " it to a system of first order equations. By defining the angular\n", " velocity ``omega(t) = theta'(t)``, we obtain the system::\n", " \n", " theta'(t) = omega(t)\n", " omega'(t) = -b*omega(t) - c*sin(theta(t))\n", " \n", " Let `y` be the vector [`theta`, `omega`]. We implement this system\n", " in python as:\n", " \n", " >>> def pend(y, t, b, c):\n", " ... theta, omega = y\n", " ... dydt = [omega, -b*omega - c*np.sin(theta)]\n", " ... return dydt\n", " ...\n", " \n", " We assume the constants are `b` = 0.25 and `c` = 5.0:\n", " \n", " >>> b = 0.25\n", " >>> c = 5.0\n", " \n", " For initial conditions, we assume the pendulum is nearly vertical\n", " with `theta(0)` = `pi` - 0.1, and is initially at rest, so\n", " `omega(0)` = 0. Then the vector of initial conditions is\n", " \n", " >>> y0 = [np.pi - 0.1, 0.0]\n", " \n", " We will generate a solution at 101 evenly spaced samples in the interval\n", " 0 <= `t` <= 10. So our array of times is:\n", " \n", " >>> t = np.linspace(0, 10, 101)\n", " \n", " Call `odeint` to generate the solution. To pass the parameters\n", " `b` and `c` to `pend`, we give them to `odeint` using the `args`\n", " argument.\n", " \n", " >>> from scipy.integrate import odeint\n", " >>> sol = odeint(pend, y0, t, args=(b, c))\n", " \n", " The solution is an array with shape (101, 2). The first column\n", " is `theta(t)`, and the second is `omega(t)`. The following code\n", " plots both components.\n", " \n", " >>> import matplotlib.pyplot as plt\n", " >>> plt.plot(t, sol[:, 0], 'b', label='theta(t)')\n", " >>> plt.plot(t, sol[:, 1], 'g', label='omega(t)')\n", " >>> plt.legend(loc='best')\n", " >>> plt.xlabel('t')\n", " >>> plt.grid()\n", " >>> plt.show()\n", " \n", " quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08, epsrel=1.49e-08, limit=50, points=None, weight=None, wvar=None, wopts=None, maxp1=50, limlst=50)\n", " Compute a definite integral.\n", " \n", " Integrate func from `a` to `b` (possibly infinite interval) using a\n", " technique from the Fortran library QUADPACK.\n", " \n", " Parameters\n", " ----------\n", " func : {function, scipy.LowLevelCallable}\n", " A Python function or method to integrate. If `func` takes many\n", " arguments, it is integrated along the axis corresponding to the\n", " first argument.\n", " \n", " If the user desires improved integration performance, then `f` may\n", " be a `scipy.LowLevelCallable` with one of the signatures::\n", " \n", " double func(double x)\n", " double func(double x, void *user_data)\n", " double func(int n, double *xx)\n", " double func(int n, double *xx, void *user_data)\n", " \n", " The ``user_data`` is the data contained in the `scipy.LowLevelCallable`.\n", " In the call forms with ``xx``, ``n`` is the length of the ``xx``\n", " array which contains ``xx[0] == x`` and the rest of the items are\n", " numbers contained in the ``args`` argument of quad.\n", " \n", " In addition, certain ctypes call signatures are supported for\n", " backward compatibility, but those should not be used in new code.\n", " a : float\n", " Lower limit of integration (use -numpy.inf for -infinity).\n", " b : float\n", " Upper limit of integration (use numpy.inf for +infinity).\n", " args : tuple, optional\n", " Extra arguments to pass to `func`.\n", " full_output : int, optional\n", " Non-zero to return a dictionary of integration information.\n", " If non-zero, warning messages are also suppressed and the\n", " message is appended to the output tuple.\n", " \n", " Returns\n", " -------\n", " y : float\n", " The integral of func from `a` to `b`.\n", " abserr : float\n", " An estimate of the absolute error in the result.\n", " infodict : dict\n", " A dictionary containing additional information.\n", " Run scipy.integrate.quad_explain() for more information.\n", " message\n", " A convergence message.\n", " explain\n", " Appended only with 'cos' or 'sin' weighting and infinite\n", " integration limits, it contains an explanation of the codes in\n", " infodict['ierlst']\n", " \n", " Other Parameters\n", " ----------------\n", " epsabs : float or int, optional\n", " Absolute error tolerance.\n", " epsrel : float or int, optional\n", " Relative error tolerance.\n", " limit : float or int, optional\n", " An upper bound on the number of subintervals used in the adaptive\n", " algorithm.\n", " points : (sequence of floats,ints), optional\n", " A sequence of break points in the bounded integration interval\n", " where local difficulties of the integrand may occur (e.g.,\n", " singularities, discontinuities). The sequence does not have\n", " to be sorted.\n", " weight : float or int, optional\n", " String indicating weighting function. Full explanation for this\n", " and the remaining arguments can be found below.\n", " wvar : optional\n", " Variables for use with weighting functions.\n", " wopts : optional\n", " Optional input for reusing Chebyshev moments.\n", " maxp1 : float or int, optional\n", " An upper bound on the number of Chebyshev moments.\n", " limlst : int, optional\n", " Upper bound on the number of cycles (>=3) for use with a sinusoidal\n", " weighting and an infinite end-point.\n", " \n", " See Also\n", " --------\n", " dblquad : double integral\n", " tplquad : triple integral\n", " nquad : n-dimensional integrals (uses `quad` recursively)\n", " fixed_quad : fixed-order Gaussian quadrature\n", " quadrature : adaptive Gaussian quadrature\n", " odeint : ODE integrator\n", " ode : ODE integrator\n", " simps : integrator for sampled data\n", " romb : integrator for sampled data\n", " scipy.special : for coefficients and roots of orthogonal polynomials\n", " \n", " Notes\n", " -----\n", " \n", " **Extra information for quad() inputs and outputs**\n", " \n", " If full_output is non-zero, then the third output argument\n", " (infodict) is a dictionary with entries as tabulated below. For\n", " infinite limits, the range is transformed to (0,1) and the\n", " optional outputs are given with respect to this transformed range.\n", " Let M be the input argument limit and let K be infodict['last'].\n", " The entries are:\n", " \n", " 'neval'\n", " The number of function evaluations.\n", " 'last'\n", " The number, K, of subintervals produced in the subdivision process.\n", " 'alist'\n", " A rank-1 array of length M, the first K elements of which are the\n", " left end points of the subintervals in the partition of the\n", " integration range.\n", " 'blist'\n", " A rank-1 array of length M, the first K elements of which are the\n", " right end points of the subintervals.\n", " 'rlist'\n", " A rank-1 array of length M, the first K elements of which are the\n", " integral approximations on the subintervals.\n", " 'elist'\n", " A rank-1 array of length M, the first K elements of which are the\n", " moduli of the absolute error estimates on the subintervals.\n", " 'iord'\n", " A rank-1 integer array of length M, the first L elements of\n", " which are pointers to the error estimates over the subintervals\n", " with ``L=K`` if ``K<=M/2+2`` or ``L=M+1-K`` otherwise. Let I be the\n", " sequence ``infodict['iord']`` and let E be the sequence\n", " ``infodict['elist']``. Then ``E[I[1]], ..., E[I[L]]`` forms a\n", " decreasing sequence.\n", " \n", " If the input argument points is provided (i.e. it is not None),\n", " the following additional outputs are placed in the output\n", " dictionary. Assume the points sequence is of length P.\n", " \n", " 'pts'\n", " A rank-1 array of length P+2 containing the integration limits\n", " and the break points of the intervals in ascending order.\n", " This is an array giving the subintervals over which integration\n", " will occur.\n", " 'level'\n", " A rank-1 integer array of length M (=limit), containing the\n", " subdivision levels of the subintervals, i.e., if (aa,bb) is a\n", " subinterval of ``(pts[1], pts[2])`` where ``pts[0]`` and ``pts[2]``\n", " are adjacent elements of ``infodict['pts']``, then (aa,bb) has level l\n", " if ``|bb-aa| = |pts[2]-pts[1]| * 2**(-l)``.\n", " 'ndin'\n", " A rank-1 integer array of length P+2. After the first integration\n", " over the intervals (pts[1], pts[2]), the error estimates over some\n", " of the intervals may have been increased artificially in order to\n", " put their subdivision forward. This array has ones in slots\n", " corresponding to the subintervals for which this happens.\n", " \n", " **Weighting the integrand**\n", " \n", " The input variables, *weight* and *wvar*, are used to weight the\n", " integrand by a select list of functions. Different integration\n", " methods are used to compute the integral with these weighting\n", " functions. The possible values of weight and the corresponding\n", " weighting functions are.\n", " \n", " ========== =================================== =====================\n", " ``weight`` Weight function used ``wvar``\n", " ========== =================================== =====================\n", " 'cos' cos(w*x) wvar = w\n", " 'sin' sin(w*x) wvar = w\n", " 'alg' g(x) = ((x-a)**alpha)*((b-x)**beta) wvar = (alpha, beta)\n", " 'alg-loga' g(x)*log(x-a) wvar = (alpha, beta)\n", " 'alg-logb' g(x)*log(b-x) wvar = (alpha, beta)\n", " 'alg-log' g(x)*log(x-a)*log(b-x) wvar = (alpha, beta)\n", " 'cauchy' 1/(x-c) wvar = c\n", " ========== =================================== =====================\n", " \n", " wvar holds the parameter w, (alpha, beta), or c depending on the weight\n", " selected. In these expressions, a and b are the integration limits.\n", " \n", " For the 'cos' and 'sin' weighting, additional inputs and outputs are\n", " available.\n", " \n", " For finite integration limits, the integration is performed using a\n", " Clenshaw-Curtis method which uses Chebyshev moments. For repeated\n", " calculations, these moments are saved in the output dictionary:\n", " \n", " 'momcom'\n", " The maximum level of Chebyshev moments that have been computed,\n", " i.e., if ``M_c`` is ``infodict['momcom']`` then the moments have been\n", " computed for intervals of length ``|b-a| * 2**(-l)``,\n", " ``l=0,1,...,M_c``.\n", " 'nnlog'\n", " A rank-1 integer array of length M(=limit), containing the\n", " subdivision levels of the subintervals, i.e., an element of this\n", " array is equal to l if the corresponding subinterval is\n", " ``|b-a|* 2**(-l)``.\n", " 'chebmo'\n", " A rank-2 array of shape (25, maxp1) containing the computed\n", " Chebyshev moments. These can be passed on to an integration\n", " over the same interval by passing this array as the second\n", " element of the sequence wopts and passing infodict['momcom'] as\n", " the first element.\n", " \n", " If one of the integration limits is infinite, then a Fourier integral is\n", " computed (assuming w neq 0). If full_output is 1 and a numerical error\n", " is encountered, besides the error message attached to the output tuple,\n", " a dictionary is also appended to the output tuple which translates the\n", " error codes in the array ``info['ierlst']`` to English messages. The\n", " output information dictionary contains the following entries instead of\n", " 'last', 'alist', 'blist', 'rlist', and 'elist':\n", " \n", " 'lst'\n", " The number of subintervals needed for the integration (call it ``K_f``).\n", " 'rslst'\n", " A rank-1 array of length M_f=limlst, whose first ``K_f`` elements\n", " contain the integral contribution over the interval\n", " ``(a+(k-1)c, a+kc)`` where ``c = (2*floor(|w|) + 1) * pi / |w|``\n", " and ``k=1,2,...,K_f``.\n", " 'erlst'\n", " A rank-1 array of length ``M_f`` containing the error estimate\n", " corresponding to the interval in the same position in\n", " ``infodict['rslist']``.\n", " 'ierlst'\n", " A rank-1 integer array of length ``M_f`` containing an error flag\n", " corresponding to the interval in the same position in\n", " ``infodict['rslist']``. See the explanation dictionary (last entry\n", " in the output tuple) for the meaning of the codes.\n", " \n", " Examples\n", " --------\n", " Calculate :math:`\\int^4_0 x^2 dx` and compare with an analytic result\n", " \n", " >>> from scipy import integrate\n", " >>> x2 = lambda x: x**2\n", " >>> integrate.quad(x2, 0, 4)\n", " (21.333333333333332, 2.3684757858670003e-13)\n", " >>> print(4**3 / 3.) # analytical result\n", " 21.3333333333\n", " \n", " Calculate :math:`\\int^\\infty_0 e^{-x} dx`\n", " \n", " >>> invexp = lambda x: np.exp(-x)\n", " >>> integrate.quad(invexp, 0, np.inf)\n", " (1.0, 5.842605999138044e-11)\n", " \n", " >>> f = lambda x,a : a*x\n", " >>> y, err = integrate.quad(f, 0, 1, args=(1,))\n", " >>> y\n", " 0.5\n", " >>> y, err = integrate.quad(f, 0, 1, args=(3,))\n", " >>> y\n", " 1.5\n", " \n", " Calculate :math:`\\int^1_0 x^2 + y^2 dx` with ctypes, holding\n", " y parameter as 1::\n", " \n", " testlib.c =>\n", " double func(int n, double args[n]){\n", " return args[0]*args[0] + args[1]*args[1];}\n", " compile to library testlib.*\n", " \n", " ::\n", " \n", " from scipy import integrate\n", " import ctypes\n", " lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path\n", " lib.func.restype = ctypes.c_double\n", " lib.func.argtypes = (ctypes.c_int,ctypes.c_double)\n", " integrate.quad(lib.func,0,1,(1))\n", " #(1.3333333333333333, 1.4802973661668752e-14)\n", " print((1.0**3/3.0 + 1.0) - (0.0**3/3.0 + 0.0)) #Analytic result\n", " # 1.3333333333333333\n", " \n", " Be aware that pulse shapes and other sharp features as compared to the\n", " size of the integration interval may not be integrated correctly using\n", " this method. A simplified example of this limitation is integrating a\n", " y-axis reflected step function with many zero values within the integrals\n", " bounds.\n", " \n", " >>> y = lambda x: 1 if x<=0 else 0\n", " >>> integrate.quad(y, -1, 1)\n", " (1.0, 1.1102230246251565e-14)\n", " >>> integrate.quad(y, -1, 100)\n", " (1.0000000002199108, 1.0189464580163188e-08)\n", " >>> integrate.quad(y, -1, 10000)\n", " (0.0, 0.0)\n", " \n", " quad_explain(output=)\n", " Print extra information about integrate.quad() parameters and returns.\n", " \n", " Parameters\n", " ----------\n", " output : instance with \"write\" method, optional\n", " Information about `quad` is passed to ``output.write()``.\n", " Default is ``sys.stdout``.\n", " \n", " Returns\n", " -------\n", " None\n", " \n", " quadrature(func, a, b, args=(), tol=1.49e-08, rtol=1.49e-08, maxiter=50, vec_func=True, miniter=1)\n", " Compute a definite integral using fixed-tolerance Gaussian quadrature.\n", " \n", " Integrate `func` from `a` to `b` using Gaussian quadrature\n", " with absolute tolerance `tol`.\n", " \n", " Parameters\n", " ----------\n", " func : function\n", " A Python function or method to integrate.\n", " a : float\n", " Lower limit of integration.\n", " b : float\n", " Upper limit of integration.\n", " args : tuple, optional\n", " Extra arguments to pass to function.\n", " tol, rtol : float, optional\n", " Iteration stops when error between last two iterates is less than\n", " `tol` OR the relative change is less than `rtol`.\n", " maxiter : int, optional\n", " Maximum order of Gaussian quadrature.\n", " vec_func : bool, optional\n", " True or False if func handles arrays as arguments (is\n", " a \"vector\" function). Default is True.\n", " miniter : int, optional\n", " Minimum order of Gaussian quadrature.\n", " \n", " Returns\n", " -------\n", " val : float\n", " Gaussian quadrature approximation (within tolerance) to integral.\n", " err : float\n", " Difference between last two estimates of the integral.\n", " \n", " See also\n", " --------\n", " romberg: adaptive Romberg quadrature\n", " fixed_quad: fixed-order Gaussian quadrature\n", " quad: adaptive quadrature using QUADPACK\n", " dblquad: double integrals\n", " tplquad: triple integrals\n", " romb: integrator for sampled data\n", " simps: integrator for sampled data\n", " cumtrapz: cumulative integration for sampled data\n", " ode: ODE integrator\n", " odeint: ODE integrator\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> f = lambda x: x**8\n", " >>> integrate.quadrature(f, 0.0, 1.0)\n", " (0.11111111111111106, 4.163336342344337e-17)\n", " >>> print(1/9.0) # analytical result\n", " 0.1111111111111111\n", " \n", " >>> integrate.quadrature(np.cos, 0.0, np.pi/2)\n", " (0.9999999999999536, 3.9611425250996035e-11)\n", " >>> np.sin(np.pi/2)-np.sin(0) # analytical result\n", " 1.0\n", " \n", " romb(y, dx=1.0, axis=-1, show=False)\n", " Romberg integration using samples of a function.\n", " \n", " Parameters\n", " ----------\n", " y : array_like\n", " A vector of ``2**k + 1`` equally-spaced samples of a function.\n", " dx : float, optional\n", " The sample spacing. Default is 1.\n", " axis : int, optional\n", " The axis along which to integrate. Default is -1 (last axis).\n", " show : bool, optional\n", " When `y` is a single 1-D array, then if this argument is True\n", " print the table showing Richardson extrapolation from the\n", " samples. Default is False.\n", " \n", " Returns\n", " -------\n", " romb : ndarray\n", " The integrated result for `axis`.\n", " \n", " See also\n", " --------\n", " quad : adaptive quadrature using QUADPACK\n", " romberg : adaptive Romberg quadrature\n", " quadrature : adaptive Gaussian quadrature\n", " fixed_quad : fixed-order Gaussian quadrature\n", " dblquad : double integrals\n", " tplquad : triple integrals\n", " simps : integrators for sampled data\n", " cumtrapz : cumulative integration for sampled data\n", " ode : ODE integrators\n", " odeint : ODE integrators\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> x = np.arange(10, 14.25, 0.25)\n", " >>> y = np.arange(3, 12)\n", " \n", " >>> integrate.romb(y)\n", " 56.0\n", " \n", " >>> y = np.sin(np.power(x, 2.5))\n", " >>> integrate.romb(y)\n", " -0.742561336672229\n", " \n", " >>> integrate.romb(y, show=True)\n", " Richardson Extrapolation Table for Romberg Integration\n", " ====================================================================\n", " -0.81576\n", " 4.63862 6.45674\n", " -1.10581 -3.02062 -3.65245\n", " -2.57379 -3.06311 -3.06595 -3.05664\n", " -1.34093 -0.92997 -0.78776 -0.75160 -0.74256\n", " ====================================================================\n", " -0.742561336672229\n", " \n", " romberg(function, a, b, args=(), tol=1.48e-08, rtol=1.48e-08, show=False, divmax=10, vec_func=False)\n", " Romberg integration of a callable function or method.\n", " \n", " Returns the integral of `function` (a function of one variable)\n", " over the interval (`a`, `b`).\n", " \n", " If `show` is 1, the triangular array of the intermediate results\n", " will be printed. If `vec_func` is True (default is False), then\n", " `function` is assumed to support vector arguments.\n", " \n", " Parameters\n", " ----------\n", " function : callable\n", " Function to be integrated.\n", " a : float\n", " Lower limit of integration.\n", " b : float\n", " Upper limit of integration.\n", " \n", " Returns\n", " -------\n", " results : float\n", " Result of the integration.\n", " \n", " Other Parameters\n", " ----------------\n", " args : tuple, optional\n", " Extra arguments to pass to function. Each element of `args` will\n", " be passed as a single argument to `func`. Default is to pass no\n", " extra arguments.\n", " tol, rtol : float, optional\n", " The desired absolute and relative tolerances. Defaults are 1.48e-8.\n", " show : bool, optional\n", " Whether to print the results. Default is False.\n", " divmax : int, optional\n", " Maximum order of extrapolation. Default is 10.\n", " vec_func : bool, optional\n", " Whether `func` handles arrays as arguments (i.e whether it is a\n", " \"vector\" function). Default is False.\n", " \n", " See Also\n", " --------\n", " fixed_quad : Fixed-order Gaussian quadrature.\n", " quad : Adaptive quadrature using QUADPACK.\n", " dblquad : Double integrals.\n", " tplquad : Triple integrals.\n", " romb : Integrators for sampled data.\n", " simps : Integrators for sampled data.\n", " cumtrapz : Cumulative integration for sampled data.\n", " ode : ODE integrator.\n", " odeint : ODE integrator.\n", " \n", " References\n", " ----------\n", " .. [1] 'Romberg's method' https://en.wikipedia.org/wiki/Romberg%27s_method\n", " \n", " Examples\n", " --------\n", " Integrate a gaussian from 0 to 1 and compare to the error function.\n", " \n", " >>> from scipy import integrate\n", " >>> from scipy.special import erf\n", " >>> gaussian = lambda x: 1/np.sqrt(np.pi) * np.exp(-x**2)\n", " >>> result = integrate.romberg(gaussian, 0, 1, show=True)\n", " Romberg integration of from [0, 1]\n", " \n", " ::\n", " \n", " Steps StepSize Results\n", " 1 1.000000 0.385872\n", " 2 0.500000 0.412631 0.421551\n", " 4 0.250000 0.419184 0.421368 0.421356\n", " 8 0.125000 0.420810 0.421352 0.421350 0.421350\n", " 16 0.062500 0.421215 0.421350 0.421350 0.421350 0.421350\n", " 32 0.031250 0.421317 0.421350 0.421350 0.421350 0.421350 0.421350\n", " \n", " The final result is 0.421350396475 after 33 function evaluations.\n", " \n", " >>> print(\"%g %g\" % (2*result, erf(1)))\n", " 0.842701 0.842701\n", " \n", " simps(y, x=None, dx=1, axis=-1, even='avg')\n", " Integrate y(x) using samples along the given axis and the composite\n", " Simpson's rule. If x is None, spacing of dx is assumed.\n", " \n", " If there are an even number of samples, N, then there are an odd\n", " number of intervals (N-1), but Simpson's rule requires an even number\n", " of intervals. The parameter 'even' controls how this is handled.\n", " \n", " Parameters\n", " ----------\n", " y : array_like\n", " Array to be integrated.\n", " x : array_like, optional\n", " If given, the points at which `y` is sampled.\n", " dx : int, optional\n", " Spacing of integration points along axis of `y`. Only used when\n", " `x` is None. Default is 1.\n", " axis : int, optional\n", " Axis along which to integrate. Default is the last axis.\n", " even : str {'avg', 'first', 'last'}, optional\n", " 'avg' : Average two results:1) use the first N-2 intervals with\n", " a trapezoidal rule on the last interval and 2) use the last\n", " N-2 intervals with a trapezoidal rule on the first interval.\n", " \n", " 'first' : Use Simpson's rule for the first N-2 intervals with\n", " a trapezoidal rule on the last interval.\n", " \n", " 'last' : Use Simpson's rule for the last N-2 intervals with a\n", " trapezoidal rule on the first interval.\n", " \n", " See Also\n", " --------\n", " quad: adaptive quadrature using QUADPACK\n", " romberg: adaptive Romberg quadrature\n", " quadrature: adaptive Gaussian quadrature\n", " fixed_quad: fixed-order Gaussian quadrature\n", " dblquad: double integrals\n", " tplquad: triple integrals\n", " romb: integrators for sampled data\n", " cumtrapz: cumulative integration for sampled data\n", " ode: ODE integrators\n", " odeint: ODE integrators\n", " \n", " Notes\n", " -----\n", " For an odd number of samples that are equally spaced the result is\n", " exact if the function is a polynomial of order 3 or less. If\n", " the samples are not equally spaced, then the result is exact only\n", " if the function is a polynomial of order 2 or less.\n", " \n", " Examples\n", " --------\n", " >>> from scipy import integrate\n", " >>> x = np.arange(0, 10)\n", " >>> y = np.arange(0, 10)\n", " \n", " >>> integrate.simps(y, x)\n", " 40.5\n", " \n", " >>> y = np.power(x, 3)\n", " >>> integrate.simps(y, x)\n", " 1642.5\n", " >>> integrate.quad(lambda x: x**3, 0, 9)[0]\n", " 1640.25\n", " \n", " >>> integrate.simps(y, x, even='first')\n", " 1644.5\n", " \n", " solve_bvp(fun, bc, x, y, p=None, S=None, fun_jac=None, bc_jac=None, tol=0.001, max_nodes=1000, verbose=0, bc_tol=None)\n", " Solve a boundary-value problem for a system of ODEs.\n", " \n", " This function numerically solves a first order system of ODEs subject to\n", " two-point boundary conditions::\n", " \n", " dy / dx = f(x, y, p) + S * y / (x - a), a <= x <= b\n", " bc(y(a), y(b), p) = 0\n", " \n", " Here x is a 1-dimensional independent variable, y(x) is a n-dimensional\n", " vector-valued function and p is a k-dimensional vector of unknown\n", " parameters which is to be found along with y(x). For the problem to be\n", " determined there must be n + k boundary conditions, i.e. bc must be\n", " (n + k)-dimensional function.\n", " \n", " The last singular term in the right-hand side of the system is optional.\n", " It is defined by an n-by-n matrix S, such that the solution must satisfy\n", " S y(a) = 0. This condition will be forced during iterations, so it must not\n", " contradict boundary conditions. See [2]_ for the explanation how this term\n", " is handled when solving BVPs numerically.\n", " \n", " Problems in a complex domain can be solved as well. In this case y and p\n", " are considered to be complex, and f and bc are assumed to be complex-valued\n", " functions, but x stays real. Note that f and bc must be complex\n", " differentiable (satisfy Cauchy-Riemann equations [4]_), otherwise you\n", " should rewrite your problem for real and imaginary parts separately. To\n", " solve a problem in a complex domain, pass an initial guess for y with a\n", " complex data type (see below).\n", " \n", " Parameters\n", " ----------\n", " fun : callable\n", " Right-hand side of the system. The calling signature is ``fun(x, y)``,\n", " or ``fun(x, y, p)`` if parameters are present. All arguments are\n", " ndarray: ``x`` with shape (m,), ``y`` with shape (n, m), meaning that\n", " ``y[:, i]`` corresponds to ``x[i]``, and ``p`` with shape (k,). The\n", " return value must be an array with shape (n, m) and with the same\n", " layout as ``y``.\n", " bc : callable\n", " Function evaluating residuals of the boundary conditions. The calling\n", " signature is ``bc(ya, yb)``, or ``bc(ya, yb, p)`` if parameters are\n", " present. All arguments are ndarray: ``ya`` and ``yb`` with shape (n,),\n", " and ``p`` with shape (k,). The return value must be an array with\n", " shape (n + k,).\n", " x : array_like, shape (m,)\n", " Initial mesh. Must be a strictly increasing sequence of real numbers\n", " with ``x[0]=a`` and ``x[-1]=b``.\n", " y : array_like, shape (n, m)\n", " Initial guess for the function values at the mesh nodes, i-th column\n", " corresponds to ``x[i]``. For problems in a complex domain pass `y`\n", " with a complex data type (even if the initial guess is purely real).\n", " p : array_like with shape (k,) or None, optional\n", " Initial guess for the unknown parameters. If None (default), it is\n", " assumed that the problem doesn't depend on any parameters.\n", " S : array_like with shape (n, n) or None\n", " Matrix defining the singular term. If None (default), the problem is\n", " solved without the singular term.\n", " fun_jac : callable or None, optional\n", " Function computing derivatives of f with respect to y and p. The\n", " calling signature is ``fun_jac(x, y)``, or ``fun_jac(x, y, p)`` if\n", " parameters are present. The return must contain 1 or 2 elements in the\n", " following order:\n", " \n", " * df_dy : array_like with shape (n, n, m) where an element\n", " (i, j, q) equals to d f_i(x_q, y_q, p) / d (y_q)_j.\n", " * df_dp : array_like with shape (n, k, m) where an element\n", " (i, j, q) equals to d f_i(x_q, y_q, p) / d p_j.\n", " \n", " Here q numbers nodes at which x and y are defined, whereas i and j\n", " number vector components. If the problem is solved without unknown\n", " parameters df_dp should not be returned.\n", " \n", " If `fun_jac` is None (default), the derivatives will be estimated\n", " by the forward finite differences.\n", " bc_jac : callable or None, optional\n", " Function computing derivatives of bc with respect to ya, yb and p.\n", " The calling signature is ``bc_jac(ya, yb)``, or ``bc_jac(ya, yb, p)``\n", " if parameters are present. The return must contain 2 or 3 elements in\n", " the following order:\n", " \n", " * dbc_dya : array_like with shape (n, n) where an element (i, j)\n", " equals to d bc_i(ya, yb, p) / d ya_j.\n", " * dbc_dyb : array_like with shape (n, n) where an element (i, j)\n", " equals to d bc_i(ya, yb, p) / d yb_j.\n", " * dbc_dp : array_like with shape (n, k) where an element (i, j)\n", " equals to d bc_i(ya, yb, p) / d p_j.\n", " \n", " If the problem is solved without unknown parameters dbc_dp should not\n", " be returned.\n", " \n", " If `bc_jac` is None (default), the derivatives will be estimated by\n", " the forward finite differences.\n", " tol : float, optional\n", " Desired tolerance of the solution. If we define ``r = y' - f(x, y)``\n", " where y is the found solution, then the solver tries to achieve on each\n", " mesh interval ``norm(r / (1 + abs(f)) < tol``, where ``norm`` is\n", " estimated in a root mean squared sense (using a numerical quadrature\n", " formula). Default is 1e-3.\n", " max_nodes : int, optional\n", " Maximum allowed number of the mesh nodes. If exceeded, the algorithm\n", " terminates. Default is 1000.\n", " verbose : {0, 1, 2}, optional\n", " Level of algorithm's verbosity:\n", " \n", " * 0 (default) : work silently.\n", " * 1 : display a termination report.\n", " * 2 : display progress during iterations.\n", " bc_tol : float, optional\n", " Desired absolute tolerance for the boundary condition residuals: `bc` \n", " value should satisfy ``abs(bc) < bc_tol`` component-wise. \n", " Equals to `tol` by default. Up to 10 iterations are allowed to achieve this\n", " tolerance.\n", " \n", " Returns\n", " -------\n", " Bunch object with the following fields defined:\n", " sol : PPoly\n", " Found solution for y as `scipy.interpolate.PPoly` instance, a C1\n", " continuous cubic spline.\n", " p : ndarray or None, shape (k,)\n", " Found parameters. None, if the parameters were not present in the\n", " problem.\n", " x : ndarray, shape (m,)\n", " Nodes of the final mesh.\n", " y : ndarray, shape (n, m)\n", " Solution values at the mesh nodes.\n", " yp : ndarray, shape (n, m)\n", " Solution derivatives at the mesh nodes.\n", " rms_residuals : ndarray, shape (m - 1,)\n", " RMS values of the relative residuals over each mesh interval (see the\n", " description of `tol` parameter).\n", " niter : int\n", " Number of completed iterations.\n", " status : int\n", " Reason for algorithm termination:\n", " \n", " * 0: The algorithm converged to the desired accuracy.\n", " * 1: The maximum number of mesh nodes is exceeded.\n", " * 2: A singular Jacobian encountered when solving the collocation\n", " system.\n", " \n", " message : string\n", " Verbal description of the termination reason.\n", " success : bool\n", " True if the algorithm converged to the desired accuracy (``status=0``).\n", " \n", " Notes\n", " -----\n", " This function implements a 4-th order collocation algorithm with the\n", " control of residuals similar to [1]_. A collocation system is solved\n", " by a damped Newton method with an affine-invariant criterion function as\n", " described in [3]_.\n", " \n", " Note that in [1]_ integral residuals are defined without normalization\n", " by interval lengths. So their definition is different by a multiplier of\n", " h**0.5 (h is an interval length) from the definition used here.\n", " \n", " .. versionadded:: 0.18.0\n", " \n", " References\n", " ----------\n", " .. [1] J. Kierzenka, L. F. Shampine, \"A BVP Solver Based on Residual\n", " Control and the Maltab PSE\", ACM Trans. Math. Softw., Vol. 27,\n", " Number 3, pp. 299-316, 2001.\n", " .. [2] L.F. Shampine, P. H. Muir and H. Xu, \"A User-Friendly Fortran BVP\n", " Solver\".\n", " .. [3] U. Ascher, R. Mattheij and R. Russell \"Numerical Solution of\n", " Boundary Value Problems for Ordinary Differential Equations\".\n", " .. [4] `Cauchy-Riemann equations\n", " `_ on\n", " Wikipedia.\n", " \n", " Examples\n", " --------\n", " In the first example we solve Bratu's problem::\n", " \n", " y'' + k * exp(y) = 0\n", " y(0) = y(1) = 0\n", " \n", " for k = 1.\n", " \n", " We rewrite the equation as a first order system and implement its\n", " right-hand side evaluation::\n", " \n", " y1' = y2\n", " y2' = -exp(y1)\n", " \n", " >>> def fun(x, y):\n", " ... return np.vstack((y[1], -np.exp(y[0])))\n", " \n", " Implement evaluation of the boundary condition residuals:\n", " \n", " >>> def bc(ya, yb):\n", " ... return np.array([ya[0], yb[0]])\n", " \n", " Define the initial mesh with 5 nodes:\n", " \n", " >>> x = np.linspace(0, 1, 5)\n", " \n", " This problem is known to have two solutions. To obtain both of them we\n", " use two different initial guesses for y. We denote them by subscripts\n", " a and b.\n", " \n", " >>> y_a = np.zeros((2, x.size))\n", " >>> y_b = np.zeros((2, x.size))\n", " >>> y_b[0] = 3\n", " \n", " Now we are ready to run the solver.\n", " \n", " >>> from scipy.integrate import solve_bvp\n", " >>> res_a = solve_bvp(fun, bc, x, y_a)\n", " >>> res_b = solve_bvp(fun, bc, x, y_b)\n", " \n", " Let's plot the two found solutions. We take an advantage of having the\n", " solution in a spline form to produce a smooth plot.\n", " \n", " >>> x_plot = np.linspace(0, 1, 100)\n", " >>> y_plot_a = res_a.sol(x_plot)[0]\n", " >>> y_plot_b = res_b.sol(x_plot)[0]\n", " >>> import matplotlib.pyplot as plt\n", " >>> plt.plot(x_plot, y_plot_a, label='y_a')\n", " >>> plt.plot(x_plot, y_plot_b, label='y_b')\n", " >>> plt.legend()\n", " >>> plt.xlabel(\"x\")\n", " >>> plt.ylabel(\"y\")\n", " >>> plt.show()\n", " \n", " We see that the two solutions have similar shape, but differ in scale\n", " significantly.\n", " \n", " In the second example we solve a simple Sturm-Liouville problem::\n", " \n", " y'' + k**2 * y = 0\n", " y(0) = y(1) = 0\n", " \n", " It is known that a non-trivial solution y = A * sin(k * x) is possible for\n", " k = pi * n, where n is an integer. To establish the normalization constant\n", " A = 1 we add a boundary condition::\n", " \n", " y'(0) = k\n", " \n", " Again we rewrite our equation as a first order system and implement its\n", " right-hand side evaluation::\n", " \n", " y1' = y2\n", " y2' = -k**2 * y1\n", " \n", " >>> def fun(x, y, p):\n", " ... k = p[0]\n", " ... return np.vstack((y[1], -k**2 * y[0]))\n", " \n", " Note that parameters p are passed as a vector (with one element in our\n", " case).\n", " \n", " Implement the boundary conditions:\n", " \n", " >>> def bc(ya, yb, p):\n", " ... k = p[0]\n", " ... return np.array([ya[0], yb[0], ya[1] - k])\n", " \n", " Setup the initial mesh and guess for y. We aim to find the solution for\n", " k = 2 * pi, to achieve that we set values of y to approximately follow\n", " sin(2 * pi * x):\n", " \n", " >>> x = np.linspace(0, 1, 5)\n", " >>> y = np.zeros((2, x.size))\n", " >>> y[0, 1] = 1\n", " >>> y[0, 3] = -1\n", " \n", " Run the solver with 6 as an initial guess for k.\n", " \n", " >>> sol = solve_bvp(fun, bc, x, y, p=[6])\n", " \n", " We see that the found k is approximately correct:\n", " \n", " >>> sol.p[0]\n", " 6.28329460046\n", " \n", " And finally plot the solution to see the anticipated sinusoid:\n", " \n", " >>> x_plot = np.linspace(0, 1, 100)\n", " >>> y_plot = sol.sol(x_plot)[0]\n", " >>> plt.plot(x_plot, y_plot)\n", " >>> plt.xlabel(\"x\")\n", " >>> plt.ylabel(\"y\")\n", " >>> plt.show()\n", " \n", " solve_ivp(fun, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, **options)\n", " Solve an initial value problem for a system of ODEs.\n", " \n", " This function numerically integrates a system of ordinary differential\n", " equations given an initial value::\n", " \n", " dy / dt = f(t, y)\n", " y(t0) = y0\n", " \n", " Here t is a one-dimensional independent variable (time), y(t) is an\n", " n-dimensional vector-valued function (state), and an n-dimensional\n", " vector-valued function f(t, y) determines the differential equations.\n", " The goal is to find y(t) approximately satisfying the differential\n", " equations, given an initial value y(t0)=y0.\n", " \n", " Some of the solvers support integration in the complex domain, but note that\n", " for stiff ODE solvers, the right-hand side must be complex-differentiable\n", " (satisfy Cauchy-Riemann equations [11]_). To solve a problem in the complex\n", " domain, pass y0 with a complex data type. Another option is always to\n", " rewrite your problem for real and imaginary parts separately.\n", " \n", " Parameters\n", " ----------\n", " fun : callable\n", " Right-hand side of the system. The calling signature is ``fun(t, y)``.\n", " Here `t` is a scalar, and there are two options for the ndarray `y`:\n", " It can either have shape (n,); then `fun` must return array_like with\n", " shape (n,). Alternatively it can have shape (n, k); then `fun`\n", " must return an array_like with shape (n, k), i.e. each column\n", " corresponds to a single column in `y`. The choice between the two\n", " options is determined by `vectorized` argument (see below). The\n", " vectorized implementation allows a faster approximation of the Jacobian\n", " by finite differences (required for stiff solvers).\n", " t_span : 2-tuple of floats\n", " Interval of integration (t0, tf). The solver starts with t=t0 and\n", " integrates until it reaches t=tf.\n", " y0 : array_like, shape (n,)\n", " Initial state. For problems in the complex domain, pass `y0` with a\n", " complex data type (even if the initial guess is purely real).\n", " method : string or `OdeSolver`, optional\n", " Integration method to use:\n", " \n", " * 'RK45' (default): Explicit Runge-Kutta method of order 5(4) [1]_.\n", " The error is controlled assuming accuracy of the fourth-order\n", " method, but steps are taken using the fifth-order accurate formula\n", " (local extrapolation is done). A quartic interpolation polynomial\n", " is used for the dense output [2]_. Can be applied in the complex domain.\n", " * 'RK23': Explicit Runge-Kutta method of order 3(2) [3]_. The error\n", " is controlled assuming accuracy of the second-order method, but\n", " steps are taken using the third-order accurate formula (local\n", " extrapolation is done). A cubic Hermite polynomial is used for the\n", " dense output. Can be applied in the complex domain.\n", " * 'Radau': Implicit Runge-Kutta method of the Radau IIA family of\n", " order 5 [4]_. The error is controlled with a third-order accurate\n", " embedded formula. A cubic polynomial which satisfies the\n", " collocation conditions is used for the dense output.\n", " * 'BDF': Implicit multi-step variable-order (1 to 5) method based\n", " on a backward differentiation formula for the derivative\n", " approximation [5]_. The implementation follows the one described\n", " in [6]_. A quasi-constant step scheme is used and accuracy is\n", " enhanced using the NDF modification. Can be applied in the complex\n", " domain.\n", " * 'LSODA': Adams/BDF method with automatic stiffness detection and\n", " switching [7]_, [8]_. This is a wrapper of the Fortran solver\n", " from ODEPACK.\n", " \n", " You should use the 'RK45' or 'RK23' method for non-stiff problems and\n", " 'Radau' or 'BDF' for stiff problems [9]_. If not sure, first try to run\n", " 'RK45'. If needs unusually many iterations, diverges, or fails, your\n", " problem is likely to be stiff and you should use 'Radau' or 'BDF'.\n", " 'LSODA' can also be a good universal choice, but it might be somewhat\n", " less convenient to work with as it wraps old Fortran code.\n", " \n", " You can also pass an arbitrary class derived from `OdeSolver` which\n", " implements the solver.\n", " dense_output : bool, optional\n", " Whether to compute a continuous solution. Default is False.\n", " t_eval : array_like or None, optional\n", " Times at which to store the computed solution, must be sorted and lie\n", " within `t_span`. If None (default), use points selected by the solver.\n", " events : callable, or list of callables, optional\n", " Events to track. If None (default), no events will be tracked.\n", " Each event occurs at the zeros of a continuous function of time and\n", " state. Each function must have the signature ``event(t, y)`` and return\n", " a float. The solver will find an accurate value of `t` at which\n", " ``event(t, y(t)) = 0`` using a root-finding algorithm. By default, all\n", " zeros will be found. The solver looks for a sign change over each step,\n", " so if multiple zero crossings occur within one step, events may be\n", " missed. Additionally each `event` function might have the following\n", " attributes:\n", " \n", " terminal: bool, optional\n", " Whether to terminate integration if this event occurs.\n", " Implicitly False if not assigned.\n", " direction: float, optional\n", " Direction of a zero crossing. If `direction` is positive,\n", " `event` will only trigger when going from negative to positive,\n", " and vice versa if `direction` is negative. If 0, then either\n", " direction will trigger event. Implicitly 0 if not assigned.\n", " \n", " You can assign attributes like ``event.terminal = True`` to any\n", " function in Python. \n", " vectorized : bool, optional\n", " Whether `fun` is implemented in a vectorized fashion. Default is False.\n", " options\n", " Options passed to a chosen solver. All options available for already\n", " implemented solvers are listed below.\n", " first_step : float or None, optional\n", " Initial step size. Default is `None` which means that the algorithm\n", " should choose.\n", " max_step : float, optional\n", " Maximum allowed step size. Default is np.inf, i.e. the step size is not\n", " bounded and determined solely by the solver.\n", " rtol, atol : float or array_like, optional\n", " Relative and absolute tolerances. The solver keeps the local error\n", " estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n", " relative accuracy (number of correct digits). But if a component of `y`\n", " is approximately below `atol`, the error only needs to fall within\n", " the same `atol` threshold, and the number of correct digits is not\n", " guaranteed. If components of y have different scales, it might be\n", " beneficial to set different `atol` values for different components by\n", " passing array_like with shape (n,) for `atol`. Default values are\n", " 1e-3 for `rtol` and 1e-6 for `atol`.\n", " jac : array_like, sparse_matrix, callable or None, optional\n", " Jacobian matrix of the right-hand side of the system with respect to\n", " y, required by the 'Radau', 'BDF' and 'LSODA' method. The Jacobian matrix\n", " has shape (n, n) and its element (i, j) is equal to ``d f_i / d y_j``.\n", " There are three ways to define the Jacobian:\n", " \n", " * If array_like or sparse_matrix, the Jacobian is assumed to\n", " be constant. Not supported by 'LSODA'.\n", " * If callable, the Jacobian is assumed to depend on both\n", " t and y; it will be called as ``jac(t, y)`` as necessary.\n", " For the 'Radau' and 'BDF' methods, the return value might be a\n", " sparse matrix.\n", " * If None (default), the Jacobian will be approximated by\n", " finite differences.\n", " \n", " It is generally recommended to provide the Jacobian rather than\n", " relying on a finite-difference approximation.\n", " jac_sparsity : array_like, sparse matrix or None, optional\n", " Defines a sparsity structure of the Jacobian matrix for a\n", " finite-difference approximation. Its shape must be (n, n). This argument\n", " is ignored if `jac` is not `None`. If the Jacobian has only few non-zero\n", " elements in *each* row, providing the sparsity structure will greatly\n", " speed up the computations [10]_. A zero entry means that a corresponding\n", " element in the Jacobian is always zero. If None (default), the Jacobian\n", " is assumed to be dense.\n", " Not supported by 'LSODA', see `lband` and `uband` instead.\n", " lband, uband : int or None, optional\n", " Parameters defining the bandwidth of the Jacobian for the 'LSODA' method,\n", " i.e., ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Default is\n", " None. Setting these requires your jac routine to return the Jacobian in the\n", " packed format: the returned array must have ``n`` columns and\n", " ``uband + lband + 1`` rows in which Jacobian diagonals are written.\n", " Specifically ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format\n", " is used in `scipy.linalg.solve_banded` (check for an illustration).\n", " These parameters can be also used with ``jac=None`` to reduce the\n", " number of Jacobian elements estimated by finite differences.\n", " min_step : float, optional\n", " The minimum allowed step size for 'LSODA' method. \n", " By default `min_step` is zero.\n", " \n", " Returns\n", " -------\n", " Bunch object with the following fields defined:\n", " t : ndarray, shape (n_points,)\n", " Time points.\n", " y : ndarray, shape (n, n_points)\n", " Values of the solution at `t`.\n", " sol : `OdeSolution` or None\n", " Found solution as `OdeSolution` instance; None if `dense_output` was\n", " set to False.\n", " t_events : list of ndarray or None\n", " Contains for each event type a list of arrays at which an event of\n", " that type event was detected. None if `events` was None.\n", " nfev : int\n", " Number of evaluations of the right-hand side.\n", " njev : int\n", " Number of evaluations of the Jacobian.\n", " nlu : int\n", " Number of LU decompositions.\n", " status : int\n", " Reason for algorithm termination:\n", " \n", " * -1: Integration step failed.\n", " * 0: The solver successfully reached the end of `tspan`.\n", " * 1: A termination event occurred.\n", " \n", " message : string\n", " Human-readable description of the termination reason.\n", " success : bool\n", " True if the solver reached the interval end or a termination event\n", " occurred (``status >= 0``).\n", " \n", " References\n", " ----------\n", " .. [1] J. R. Dormand, P. J. Prince, \"A family of embedded Runge-Kutta\n", " formulae\", Journal of Computational and Applied Mathematics, Vol. 6,\n", " No. 1, pp. 19-26, 1980.\n", " .. [2] L. W. Shampine, \"Some Practical Runge-Kutta Formulas\", Mathematics\n", " of Computation,, Vol. 46, No. 173, pp. 135-150, 1986.\n", " .. [3] P. Bogacki, L.F. Shampine, \"A 3(2) Pair of Runge-Kutta Formulas\",\n", " Appl. Math. Lett. Vol. 2, No. 4. pp. 321-325, 1989.\n", " .. [4] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations II:\n", " Stiff and Differential-Algebraic Problems\", Sec. IV.8.\n", " .. [5] `Backward Differentiation Formula\n", " `_\n", " on Wikipedia.\n", " .. [6] L. F. Shampine, M. W. Reichelt, \"THE MATLAB ODE SUITE\", SIAM J. SCI.\n", " COMPUTE., Vol. 18, No. 1, pp. 1-22, January 1997.\n", " .. [7] A. C. Hindmarsh, \"ODEPACK, A Systematized Collection of ODE\n", " Solvers,\" IMACS Transactions on Scientific Computation, Vol 1.,\n", " pp. 55-64, 1983.\n", " .. [8] L. Petzold, \"Automatic selection of methods for solving stiff and\n", " nonstiff systems of ordinary differential equations\", SIAM Journal\n", " on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148,\n", " 1983.\n", " .. [9] `Stiff equation `_ on\n", " Wikipedia.\n", " .. [10] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n", " sparse Jacobian matrices\", Journal of the Institute of Mathematics\n", " and its Applications, 13, pp. 117-120, 1974.\n", " .. [11] `Cauchy-Riemann equations\n", " `_ on\n", " Wikipedia.\n", " \n", " Examples\n", " --------\n", " Basic exponential decay showing automatically chosen time points.\n", " \n", " >>> from scipy.integrate import solve_ivp\n", " >>> def exponential_decay(t, y): return -0.5 * y\n", " >>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8])\n", " >>> print(sol.t)\n", " [ 0. 0.11487653 1.26364188 3.06061781 4.85759374\n", " 6.65456967 8.4515456 10. ]\n", " >>> print(sol.y)\n", " [[2. 1.88836035 1.06327177 0.43319312 0.17648948 0.0719045\n", " 0.02929499 0.01350938]\n", " [4. 3.7767207 2.12654355 0.86638624 0.35297895 0.143809\n", " 0.05858998 0.02701876]\n", " [8. 7.5534414 4.25308709 1.73277247 0.7059579 0.287618\n", " 0.11717996 0.05403753]]\n", " \n", " Specifying points where the solution is desired.\n", " \n", " >>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8],\n", " ... t_eval=[0, 1, 2, 4, 10])\n", " >>> print(sol.t)\n", " [ 0 1 2 4 10]\n", " >>> print(sol.y)\n", " [[2. 1.21305369 0.73534021 0.27066736 0.01350938]\n", " [4. 2.42610739 1.47068043 0.54133472 0.02701876]\n", " [8. 4.85221478 2.94136085 1.08266944 0.05403753]]\n", " \n", " Cannon fired upward with terminal event upon impact. The ``terminal`` and\n", " ``direction`` fields of an event are applied by monkey patching a function.\n", " Here ``y[0]`` is position and ``y[1]`` is velocity. The projectile starts at\n", " position 0 with velocity +10. Note that the integration never reaches t=100\n", " because the event is terminal.\n", " \n", " >>> def upward_cannon(t, y): return [y[1], -0.5]\n", " >>> def hit_ground(t, y): return y[0]\n", " >>> hit_ground.terminal = True\n", " >>> hit_ground.direction = -1\n", " >>> sol = solve_ivp(upward_cannon, [0, 100], [0, 10], events=hit_ground)\n", " >>> print(sol.t_events)\n", " [array([40.])]\n", " >>> print(sol.t)\n", " [0.00000000e+00 9.99900010e-05 1.09989001e-03 1.10988901e-02\n", " 1.11088891e-01 1.11098890e+00 1.11099890e+01 4.00000000e+01]\n", " \n", " Use `dense_output` and `events` to find position, which is 100, at the apex of\n", " the cannonball's trajectory. Apex is not defined as terminal, so both apex\n", " and hit_ground are found. There is no information at t=20, so the sol\n", " attribute is used to evaluate the solution. The sol attribute is\n", " returned by setting ``dense_output=True``.\n", " \n", " >>> def apex(t,y): return y[1]\n", " >>> sol = solve_ivp(upward_cannon, [0, 100], [0, 10], \n", " ... events=(hit_ground, apex), dense_output=True)\n", " >>> print(sol.t_events)\n", " [array([40.]), array([20.])]\n", " >>> print(sol.t)\n", " [0.00000000e+00 9.99900010e-05 1.09989001e-03 1.10988901e-02\n", " 1.11088891e-01 1.11098890e+00 1.11099890e+01 4.00000000e+01]\n", " >>> print(sol.sol(sol.t_events[1][0]))\n", " [100. 0.]\n", " \n", " tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)\n", " Compute a triple (definite) integral.\n", " \n", " Return the triple integral of ``func(z, y, x)`` from ``x = a..b``,\n", " ``y = gfun(x)..hfun(x)``, and ``z = qfun(x,y)..rfun(x,y)``.\n", " \n", " Parameters\n", " ----------\n", " func : function\n", " A Python function or method of at least three variables in the\n", " order (z, y, x).\n", " a, b : float\n", " The limits of integration in x: `a` < `b`\n", " gfun : function or float\n", " The lower boundary curve in y which is a function taking a single\n", " floating point argument (x) and returning a floating point result\n", " or a float indicating a constant boundary curve.\n", " hfun : function or float\n", " The upper boundary curve in y (same requirements as `gfun`).\n", " qfun : function or float\n", " The lower boundary surface in z. It must be a function that takes\n", " two floats in the order (x, y) and returns a float or a float\n", " indicating a constant boundary surface.\n", " rfun : function or float\n", " The upper boundary surface in z. (Same requirements as `qfun`.)\n", " args : tuple, optional\n", " Extra arguments to pass to `func`.\n", " epsabs : float, optional\n", " Absolute tolerance passed directly to the innermost 1-D quadrature\n", " integration. Default is 1.49e-8.\n", " epsrel : float, optional\n", " Relative tolerance of the innermost 1-D integrals. Default is 1.49e-8.\n", " \n", " Returns\n", " -------\n", " y : float\n", " The resultant integral.\n", " abserr : float\n", " An estimate of the error.\n", " \n", " See Also\n", " --------\n", " quad: Adaptive quadrature using QUADPACK\n", " quadrature: Adaptive Gaussian quadrature\n", " fixed_quad: Fixed-order Gaussian quadrature\n", " dblquad: Double integrals\n", " nquad : N-dimensional integrals\n", " romb: Integrators for sampled data\n", " simps: Integrators for sampled data\n", " ode: ODE integrators\n", " odeint: ODE integrators\n", " scipy.special: For coefficients and roots of orthogonal polynomials\n", " \n", " Examples\n", " --------\n", " \n", " Compute the triple integral of ``x * y * z``, over ``x`` ranging\n", " from 1 to 2, ``y`` ranging from 2 to 3, ``z`` ranging from 0 to 1.\n", " \n", " >>> from scipy import integrate\n", " >>> f = lambda z, y, x: x*y*z\n", " >>> integrate.tplquad(f, 1, 2, lambda x: 2, lambda x: 3,\n", " ... lambda x, y: 0, lambda x, y: 1)\n", " (1.8750000000000002, 3.324644794257407e-14)\n", " \n", " trapz(y, x=None, dx=1.0, axis=-1)\n", " Integrate along the given axis using the composite trapezoidal rule.\n", " \n", " Integrate `y` (`x`) along given axis.\n", " \n", " Parameters\n", " ----------\n", " y : array_like\n", " Input array to integrate.\n", " x : array_like, optional\n", " The sample points corresponding to the `y` values. If `x` is None,\n", " the sample points are assumed to be evenly spaced `dx` apart. The\n", " default is None.\n", " dx : scalar, optional\n", " The spacing between sample points when `x` is None. The default is 1.\n", " axis : int, optional\n", " The axis along which to integrate.\n", " \n", " Returns\n", " -------\n", " trapz : float\n", " Definite integral as approximated by trapezoidal rule.\n", " \n", " See Also\n", " --------\n", " numpy.cumsum\n", " \n", " Notes\n", " -----\n", " Image [2]_ illustrates trapezoidal rule -- y-axis locations of points\n", " will be taken from `y` array, by default x-axis distances between\n", " points will be 1.0, alternatively they can be provided with `x` array\n", " or with `dx` scalar. Return value will be equal to combined area under\n", " the red lines.\n", " \n", " \n", " References\n", " ----------\n", " .. [1] Wikipedia page: https://en.wikipedia.org/wiki/Trapezoidal_rule\n", " \n", " .. [2] Illustration image:\n", " https://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png\n", " \n", " Examples\n", " --------\n", " >>> np.trapz([1,2,3])\n", " 4.0\n", " >>> np.trapz([1,2,3], x=[4,6,8])\n", " 8.0\n", " >>> np.trapz([1,2,3], dx=2)\n", " 8.0\n", " >>> a = np.arange(6).reshape(2, 3)\n", " >>> a\n", " array([[0, 1, 2],\n", " [3, 4, 5]])\n", " >>> np.trapz(a, axis=0)\n", " array([1.5, 2.5, 3.5])\n", " >>> np.trapz(a, axis=1)\n", " array([2., 8.])\n", "\n", "DATA\n", " __all__ = ['BDF', 'DenseOutput', 'IntegrationWarning', 'LSODA', 'OdeSo...\n", " absolute_import = _Feature((2, 5, 0, 'alpha', 1), (3, 0, 0, 'alpha', 0...\n", " division = _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 1310...\n", " print_function = _Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0)...\n", "\n", "FILE\n", " /usr/lib/python3/dist-packages/scipy/integrate/__init__.py\n", "\n", "\n" ] } ], "source": [ "help(integrate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calcul formel avec le module `sympy`\n", "--- \n", "`SymPy` est une bibliothèque Python pour les mathématiques symboliques. \n", "Elle prévoit devenir un système complet de calcul formel (“CAS” en anglais : “Computer Algebra System”) tout en gardant le code aussi simple que possible afin qu’il soit compréhensible et facilement extensible. \n", "\n", "Quelques commandes : https://www.sympygamma.com/\n", "\n", "Pour tester en ligne: https://live.sympy.org/" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "%reset -f\n", "from sympy import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour un meilleur aspect des résultats affichées on utilisera :" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "init_printing()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le symbole `oo` est utilisé pour une classe définissant l’infini mathématique :" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAKCAYAAABWiWWfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABIklEQVQoFX2S4U3DQAyFEyaIYIOwAYwAI6R0A7oBVX8l/6qyQdgAygbtCKQjpBMgsUH4vstFojoFS6+2n1/t+O7yYRgyrWmaO9wjuAUd+Rs+MfgC8gncgw58wP3gs9xmJM/EC3AAN8BcW1A7jmEYWBFvwBp8gRIswTu6U1bXdQlam04gL0AHBlDJ68F+0vz18Dvz3ICuTrowONc5A71fvYFztcTgPaLrK36+kyoEAs/hIdb2+GRgrKk9EZc2m7Uoeo2C1axwLBT/Not/9oadXNF8uphYGh28F9HbrCdx58TgXW8LXLcH7YzWrz5OT6MlWSMM7wXvodvoQBzWxDvdp6P3/D6BZhzeZWgmg3iHU2gjm27hXO/C4F4glsBtrKsLjX8B1i+VmyjeP9EAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\infty$" ], "text/plain": [ "∞" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "oo+1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Contrairement à d’autres systèmes de calcul formel, SymPy vous oblige à déclarer les variables symboliques explicitement :" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# premiere methode pour declarer des variables\n", "x = Symbol('x')\n", "y = Symbol('y')\n", "# deuxieme methode pour declarer des variables\n", "h,k = symbols('u,v')\n", "# troisieme methode pour declarer des variables\n", "var('u,v');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Manipulations algèbriques" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABeklEQVQ4EZWTMVICQRBFB+UAFEfA1IiSnABvoHgC5QiUEaTrDcDMzJLQDAISIwpvAEeguAG+t7VDDesG0FV/u/tPd0/P9GztcDiE8XjcCiEMgXIHdmAI/ytxiVwTbLEJyf1ut/sNpsvl8hbuA/2Dv72k4BXBGRikSRS32z34SvlzbAv2wIYijVLCAr8B7wnOFguauCXRjqqkvFFVzJGrOZQqYYMNfAtdi+vYFn8p/A76GXiCp4Jb2eE/IbENaWCcfIzJWHsTECvwDnr4xrlZVudTJQ5jViTm69h25gCjeEUPwC6VJsiCR04xGo0mYJ5y2nDtlCvi1imnfXLkoosm+j7fM/nAlR95n+XPJCQ3j0cmwfZv0I8xCNt7DOiTx43vU/POZq4rcPohL4jjEDro8hDcZFoEe68OxWfmj7DHTjd6Nb/Oxy4MXmBP0Kn04Jyqhe3K/9tO/NePAueaU887nKMtGt+XfJR4b3Y1BSYGCgzAHNjAGuyw8+P/AdCPuNNDiDYBAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 2 x$" ], "text/plain": [ "2⋅x" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(x+y)+(x-y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `simplify` simplifie des expressions" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\sin^{2}{\\left(x \\right)} + \\cos^{2}{\\left(x \\right)}$" ], "text/plain": [ " 2 2 \n", "sin (x) + cos (x)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=sin(x)**2 + cos(x)**2\n", "expr" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZElEQVQYGWP8//8/Aww0NDQYAdmrgdgYyP4AEmcBMgSA9GwgfgfEJkCsBMRwAFIAUhkKEgGyy4AUyBQ4YIKzcDBGFUACBj0chKHhJQQLN0ZQZAGDGBRBIOACxKC4OQfE94B4NwDm+hiAOyllRAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(expr)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$" ], "text/plain": [ " 3 2 \n", "x + x - x - 1\n", "───────────────\n", " 2 \n", " x + 2⋅x + 1 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=(x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)\n", "expr" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAOCAYAAABQFS4BAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABSElEQVRIDdWV203DQBBFE5QCEHSQEgh0EDogUAHQAYgv+w+FFiiBdABUkJAOoIQoHZhzrPVqsYTkL3tzpeuZfSR7ZzyzHldVNcodZVmeofENzvD36p34yBEIPEbXK9zBcziFETkLN7MLlRLEA8asRxxF78CcgxUeSyXU1F1I/AX2FlpXN2FuzZ5V8Ac3acaXCHuRqFpDG2PO+BFroyxhNqgzjjgznQqzMa6gWRcnMF2vJ4d8NKWyQfxPImSGv2XOAEbYuruT9T8u676RT6jtigW/23bd3N7XZLz9B9dsfG5v/m+MAAM02N6Q1nh9KCLmOGYuNqIZlb2p6nDQJAjyc2pzfmDv4R4/LZ0nxjZpNjDjZljuQhB+YiOYc81bZkichsO9JGqMi6KwBLwxvp1BqFeiN8ol/IIGFMuGcW/gXCtBNOVrL1oJ77+zk16agmP5dQAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle x - 1$" ], "text/plain": [ "x - 1" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(expr) # ou expr.simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `cancel` simplifie des fractions de polynômes" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEMAAAAyCAYAAAAHtGYXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEUElEQVRoBe2a61EbMRSFbYYCnKQDpwMIFcTpAJIKgA7C8Av+MdABUEFCOiCpgEcJpIJ43IFzPlnSyGJfWowtM3tnZGm10t1zz15daSX3p9NpL1VOT0+H6jNSGitR3lE6U/2j8mylDvdmS+Tn6vck5Vf0V/5d2R+ld1xnLJW425JxFhn8Qdd4Se5SibsVGfKEeDjsigVYz1rqcLciw1lsh8c3XV+qbIaMu5dzXoa73yaAhoZK8UDXN0q3Kl+E93IuF+F+MRkYLMVbyh6UtlWOhxBNspQYd/IwkQI84a/S58DwibX2k/IsyWiCe8Ma0TiTUgxn5ngKOo1Upv5nUJdVsQlu7xmWuQNrAYuofSUWVARI5E5tfs2KvT3lx7r+Z69pzxBxHmKrXz8LcH/U0x507QO5vXetHLxIJW5Phhqeq9MhPZSziLpWgoAjpUuVmToNGbpmKOQyHHgpYGR6B7MnQ+WvStQbqcNtyFAjPCJcJ/CGUYJ3IO+VwvumctU/wk3gvrM4vihn+IZC3e+woqrsPONeisMYsK1Oj6ozbq/cuVmVrtp70jNQI5bt5E1lT/3KvJBPAncPL4hXmKOCutLnOs9wCl3DIsXuXutcwCEXohciVl9POUZDsB8iqsNrqGvsGc9mk0CxC5Y8bECS4lwFz/WebEFC0ES44xddasOmNZIVJAEUFgmiKAmHjQlSpVpWf4NZL8QLoqR4QQc8AwZJY0vMWGUvquOeC1K+PrPCHBEWM7hvU3BuqjHewFijc0+KDpX4zmA6ZYkNSX7I0CZDORIm1hPMeKx9WHMgjeMFjRfybYKinMSSMlKeFKyfBdCcjGqCBcOV8GAjKhPoWTfF0+ysQcXv2pMh21gc/ghsNKtQkZI8tNd+mMhoyGCFjEcQK25UlxQr1MfI2pPhDFlE/haGySJ4MDo6MgIqOzICMvonJyfpR2qBgrdU7AJo8Da7YdKRETAQFPlQSxa75D22HYc231f9JFnZEjvU4W5FhvD7zWNs0UPcF677WlyiiUmPqsTdNmYciADzyW+h8Ok8VB1bbTlLJe62ZLAbdp+z1SXYKnEvZGqVR+AZu8pzHyZzHMW423qGV2qHBl+OSRspXsGKCkW4X0SGFA5lC16xkqPFtjyW4faziRq4HSKesaPEaRrGFp219qxCjvXYhXbX5HObs9x7TdHzHG6GaN1Zq8NZiDv0DKadC5KUshvOjhH7iGy28kA8wIjqIInplH/sbJFUpt3czrqulyEcY4CZnXCP0T44PmutxG08Q8pSz1rZc4Qgv/fIw6WHaL000fN4Ce4YAw+NX0Z8dlKJ2w2TpLNWgWj1F0f1g8CVnbXW4XaeER/BdWet+LfYGynjDfrdZd4oifuZSnfWGrwYAmM8i8XxImheXNxQNZ5A6s5aRUJ31ioSkIV8m8xU5fOr+MZ6gzVS0icCw2StBcOV/HpHZQJ9d9Zq32p31ioi8IgXnbX+BwqkDNjr8arYAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\frac{x^{3} - y^{3}}{x^{2} - y^{2}}$" ], "text/plain": [ " 3 3\n", "x - y \n", "───────\n", " 2 2\n", "x - y " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=(x**3-y**3)/(x**2-y**2)\n", "expr" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHMAAAAyCAYAAABvR+QvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEzUlEQVR4Ae2b71XbMBTFA4cBaEdINyiHDdINoJ0A2KAcPsG3HtigZQS6Ad2APyOwQTnZgN5fKgnHdhJLlh3Fkc5RJD/L0n3v+kmy47fz9vY28k1XV1f7uubCXDc25YnkU9++cvvmFlhl973mXc21vFbHZ1ai+k/Vn5Q/WVkuO7HAUrvvBg55KgInhWuvVR9L9rkgy9X4Flhq91Ay8crH+FhzjysssNTuOyFrZnlAeSSeeaQyT7Nl43R4XLZ7qGc6iGZqPZLgwAlzpXML1Nm9FZnqcCzUeOWB6sE7WV07UT7t3AIdDdA3fo1Xa/fQ3ezIdHiu8gs2MseULwE241GHvKmpN/zGzrV2DyLTdMjjCJ3aHSyL8/mmsrEJuFfZ3ZGphtxddqo7VP1EGXf+pkx6UJvf/6uzZ0ra82zpks67Z08n7KHig73Qls3ak45/WYjm3K3KYyvruvTEg70X2t2RqUbugVQDfNfxrTIE4n14IWvjjEwdf1A9pdQYu0BfGJ3YtKGjI1P1r8rI+0yN8ayy+4xMNcIjIcumqSoohXeSPioXz8+EKfz4YFdbloQHg5u1/rWkA7I/JVlnh7HxWM98VMfFjQuPGc+SQepIZZRpR/3g4RP6LCVuFsapm6bBsWx8H+wv6uvZjI0X/jB1W4CtLLPnwBcbfys8DpipWM+0CtrzdYrac8GljFFHFkZiFuB14I1v57qmMXa1tTcnpLH2uClW5/BaZAs9U22i4m+LR1jn0u7ckQ40gFXUbnaQ7ZPLbVM79sCOp7uZx+iB3lP1Ub45+lAzCp49Q9KdELOJ4K7k7kOp4rQ7W6T70MpnjBbY2aUX9WPYXtfLkp5R8OCZ3JHkV2Oc1+JAknHObhqKp1Koh2KfI9LoSF/3a1IqCp49gccbWTtQZiTFzpTvlVnsea6BZDfl0iahFIqdlxs8T7JD/6ts/yBYuF52rHMUPFH+NWmrqIwavAFqOzbXG1InKoP+LIiNPxRPZQMUwzgBfbDLJHeeMJSye3OlOhs7nrMXPpI0ABWMPyYeptm1JynU5/TGLMASYtPsLZAwBC8lLfFHw5PENGut2kcpw2M8XlLgkayVdy3JUBfhKSaerSMz3OzpX5nKmpm+pTYAYSZzA0hqCjGT2dRSG9Bu5/Ly0v+T9g1QbBsh5g3QgFjP02wmc0AWGJAq2TMzmQOywIBUyZ6ZyRyQBQakylZ4pl5m81+l/cB7QPTNq7IVZEpl/iEhDzptC5mDJtEql8Sf0xYMpaZDPMhOiYeq81X9WLku5kXiblMBTxKxKcu0TdEz+azjhizgfBXIlwCseXz0BNF9h0nwmSlY+HKvPPY6YlMEoz4l5ZkyWlIxL8KTVGxKPYXv0qTIFCyfuJF3LUxNxk86FqQCOLIgKTJFRjk0wCvmRdcnHQsSmbtKdymumTOQImaiCmuk+2pOsnXFvESJBalYP7IgGc+EKOmWaswLu+m5EAIdrzM2pfY2SMkz8URyijEvc0SaWQOs64pNqSUzGc8UutC4kVrFIgujxIJExlTpbis+G5EnRY1lUX88bwbHplRYiCRIaZqNpFJtN1NJyd4J4pRjx6Z442hyQUrTbBO8QW1ERptYlmixIEHgPS7aimnWwx6VproRkopNqQAsCP4BJn9a0vzSixEAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\frac{x^{2} + x y + y^{2}}{x + y}$" ], "text/plain": [ " 2 2\n", "x + x⋅y + y \n", "─────────────\n", " x + y " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cancel(expr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `expand` dévéloppe une expression:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAaCAYAAAAKYioIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADd0lEQVRYCeWY7VHbQBCGDUMBDCVAByZUENIBSSoAOoDhF/zLkA6ACjKhA0gFYDowHYS4A/I8yt1Fkk+ONLE1gHdmudPu6fZD7+6dWXl+fh4sK52dna0T+0mIfzOM+8gna8ualBD3OUk4jDlgfsF8BG+tRuGSjgckY7cU+znzTWTDZU+MaLkvJSZNV5a5x6QshAlIETF7jNOlhDA2ofp7r+65SyysHZoUeNtAK6WE8giZC94K2S+MaSaFBIqWbeYTF6dSQmC2dhiPVbwVIh4TM2G8zMWE3Ao5ZixOp/D8JzE8eJ7/YCxglNvgNcuIyyP4PWOBhhgLzybFI7oMBhN0HO8xwsgFvRFOeUwK9eyXnLMjxmaM6c4S9jdhgsIxET4dDjyVTk9Pfzn2ydjcg4/6smmM8Hpbe6tkx97ymNL1difG+KlteJbSB/i26QUSJ9QOgn6HcR+2Nj8H2R1rrsN84UPJny2MjXhOpRh0V4wfM44Yo7Gm9Zk1SeRx/Q4eJ8n0xN8TX2VUd/AVvMuzDcukWbt90knw5QajddsiwgrIkTH6QVuRiDG4p9xqHBApZeMTnjUsaqQNuKwvhIv6gz/esfw4kl+/7reyJvS7tlNiDM6Ac3SPM+X+43H+gKxYz5iDbGUf1ngieALVSbsD9PWTQrE2cns/In9wASQ6vhSzv3+0U5dFrXEIglYkYhqp5ERck3Mm6rJjQ+AD5CLP49oSbUWsjR/EBBhk6hfoRJOyJsTMAgCvVckeI8T+mUkMR2dSo0W2Lle37OVJNCXkBov65w03IqruiH4aaysSMUJsqvZCwN/R2Xz9CkJew+XSshGWb40s6YX0t+yHRmf1F/Uipv6O8iyJGDO8k9H6BeSnkKRKtpGpi40w8/pCRZUAgy/640nVREV/bFLW5WsIvsEio06ixBrW4ADjh/ANbDP1Cm3CUlm5pkcSpd5XPBF/wt5ppKb+os44co1e3TR5ReaqPIaHba/L81iHvbn9JGCvc3jU5Be6TXjcpM/JLSXJzLfPZvHKf/+ZsIPciUQJnH70Mbepet9qOqbdX4R1um8ViWFzS8aj06bWC2HrNtjtas9j3vKP5E38kr2yZR1i6vwr3h4TySPQXmN3f8nk198g4CNGe8sF81m9xZ7YuRrSf/B4eRCy6z+DW1+6fO+lEnGYvGvGyinWxt/fciCthHtKSSwAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\left(x + y\\right)^{2}$" ], "text/plain": [ " 2\n", "(x + y) " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=(x+y)**2\n", "expr" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHwAAAAXCAYAAADJLSsnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD7UlEQVRoBe2Z7VEbMRCGDeMCCCVAByR0YDqAUAHQQTL88z+GdACUAB1AB3x0AB2EcQfO+9xIGp3mZHySzncE74ysvT19vLsrrVbnjfl8PmpL0+l0S33OTb8dU59IPms71rp9eQss8s84cbpLDXpm+4q/Ev+ssmtl67pXC0T9s5kI61ROnnh9L8XvSLbnydZsfxaI+ifV4ezup/70Wc/8gQWi/tlIOcPDybSz2eGHqtchPTTOAJ59/6Se4U4NE8YPJfjuhCtmhIHE8beZ9ofqd54lfzGyL1uF/sna4cbQJGxH4nvJ0C0G1QfWq+KJOL9UDsQ/WPlXq61tpLfzT/ION4OxiypDm+eR6re2hlUfEkCSvuu2fdUe57obA/01DrhOxd6qfEM2BBKmHD1bqaC5qqinuuafpKTNDMbOvhK/RxFPSCWUphD3ekoKYcRXYQj7s7O3DNaUcbvok6Pn0niMzo3+Sd3h3LkBT+1IE9V2mnvRLYNjWXSzyDThQog0+6/EUf84h8tgGIYwCO2rnKgQFo5VoEe1uYNRPaQweQSmBqq+CQirS9zEt9HRtuXm8ay+7rgx49yojs3dACdP5GH/EI/aRv3jh3S+zvyhCNqjyo3KRM+EapTnrPwUJMw4m8VqM3eLu42O58YW9+oc6v5TMm4mq6QieKodLsXY2b5SMz2jELsc2lbx31fCAf+QrN0Zh1Uw2+iotiwYFj1E0hPmJshWlv2XxGND+pMG9bNr7tQvkuH4keoioUvjkEhMGDMgFhTzNOUA4Fh6fjPHW0OfNjrS3x4F7OaLAC86hDLXxGAoqWcWHgdMTOVwTzn7rklJ+y651jxNDh1JTjThWsZxkkzqT6TaVs0OrJFk1oFWHtVRbe1Cx2kcZ/75ze5HFt3h6l9Uz1w8wurIP8MroQa3SlYJGkLJuN6g5GBJ+Fg0u6pdNBDPIuIsr5Fky+rIWC7SmUHoO9MY4QKqzdHRQzaesYDjSM48EhpWLasThfwQT8IQJkBqNgwSNnbdfgNGFsG15Kk6slh8O6DwSs9vJvQoG89Yg7FiKXydwjC1BEUy3tkERuywSPgwAgv2QTw5gk8Tybh54PgUHXF2lV8wqMaxtmoM2bTpmLLxjAWQXc0ZhTIodaZyr4LxuMC/i3fhnTYDI65NON1+Q/Dh2bCbqiNRjfs2N5S/KvbfwOj57U/eAZ+NJ+vPk1IKyaBFkrZSeGLjGMcTNZL+GSytZwqezZhyK5bPNB9lMIQxVdynY/Ecd0SRiwyQyXqWwkNI752kTF8hcpHuRB0/J+DLIwlg8vGWqWcRPIMI6Yus3tc7OQcDk7Cxszm7bzMdpiHSqRSef1R58L1i6Q8GAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle x^{2} + 2 x y + y^{2}$" ], "text/plain": [ " 2 2\n", "x + 2⋅x⋅y + y " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expand(expr) # ou ((x+y)**2).expand()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `expr.subs(variable,valeur)` remplacer dans `expression` la `variable` par `valeur`" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEUAAAAaCAYAAADhVZELAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADP0lEQVRYCeWY7VEbMRCGDUMBgXRgOjChgiQdAB0EOsDDL/tfxukAqCADHUAqSEwHpoMk7sB5H3ml0V1O9+Gx4cztzHqlXUm3u9pdSd5ZLBa9LsJ4PH4nu6/M9r7RL+LP97roELN5IgdcePvVvlZ7Kjzc9cwO0nM54lNk90TtvniDLjuFKPkVOSU0d7paU4IHrKEIIVJORP9PHzF90cnP25p+Uxs0foBDhEcYmUkfCS/FY8C2A7UBWyrBHEiUHKk9Z0JIHzHw1LHoEEHbQXqyeXfCYEyss+Q4ZS56E/PjtmRkxVDUnULWXzpFHc7sH6IufOKJbWqbnrfS6Y/wgxDH7IvvdljtDIjPEfuxSC4eDuEYjoMA5wz9PYXwYcCLgBTiKCTEk7tYpIgZd4pM7Tqpjk3YFu4jzDXAYQQDNIDWvfBOOaMTJJtvoAy4UZBNN8K/QlIkE03q76c+vishteQ5NeAN8LHtrIkdRMpn4WPRJDmM3TwXHgqn6odwN9mtqAvnovkt4WEbNgbdq/TiSKZgzRIDr2T0N8kehORmDHifKGs7YBtFtTbgFKKBap4BOYPK/tOYeDo/JhlhmYVev4PejZxC+hwIM0XI7HiWY56sTVR8tbYnnCB5npc5qvlUf8blgW/2JC8q7k/irzMlqSlsfG3AKYUgxZyjRDGKRUNOikcUwSusReI70Lgio3vik3YcyaTmpiG16cnvkj6EV5kn2TV2zznJVsJR3BZ9JBm7lQTbsLE24BTCqyznkOWP7G2pJziCSMnrDz8JOIXdPk6OyC2o6CBKQE6k14T39nFXn0oU4enSKKL3NOG7kIdVCngbcB/hSP4t5M4ClNaT5ZD1/0oPrysbA9yJRyQ8iIa65yTLH8YV1rZoTLbJn0yj0WgmHNCuQo2bCKdV48rkmn8ivCwbsw6ZvtEXzpquRfoAhY8mokMYHkxqU7S44ZYexSxYARTtuHBXDF9ZTJTnL52VizmnWNhxRFJUY+DoJL088GznkXXvGatQzX+0b64yvdYcs6XxS5zFqSkeOHrJV04WD3j6QB/gmU4tucYgL2w55eLYrJaYQeGfN/rmXf68fYlLlamwfiL92cR70UZHsdfkH9MuwSYEqRrjAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\left(y + 1\\right)^{2}$" ], "text/plain": [ " 2\n", "(y + 1) " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(expr).subs(x,1)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA6UlEQVQoFWWR3XHCQAyEbU8KcKCCUEKcElxCWmDogGe/Jh14KIGU4FSQnw5wBzB0YL7PPvFwaGbRam/vJORymqYiouu6Pjh5BbZoV7VSI0UN/wM9/NMD8ivpGzTwsVIkDmAVJgX4P+kXzF3C+I4wgjw0t1yqK3/S6SV3UZ+T9qZxHhbB4fNYJ2ETrb8QNrmL2j9k1GHcWvF6azbgmqLbOK8nHTjrBzgBW/4Au6g1dyPFQ/Cqpj14jtYPpiTYfuDC9UkB4h5d+oti0hzFmRvreNFZ8j0e0XZcdOnLt5YgOI/hS8YRbVhoUdwArdZQb6DcVHgAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 9$" ], "text/plain": [ "9" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = x*x + x*y + x*y + y*y\n", "expr.subs({x:1, y:2})" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA6UlEQVQoFWWR3XHCQAyEbU8KcKCCUEKcElxCWmDogGe/Jh14KIGU4FSQnw5wBzB0YL7PPvFwaGbRam/vJORymqYiouu6Pjh5BbZoV7VSI0UN/wM9/NMD8ivpGzTwsVIkDmAVJgX4P+kXzF3C+I4wgjw0t1yqK3/S6SV3UZ+T9qZxHhbB4fNYJ2ETrb8QNrmL2j9k1GHcWvF6azbgmqLbOK8nHTjrBzgBW/4Au6g1dyPFQ/Cqpj14jtYPpiTYfuDC9UkB4h5d+oti0hzFmRvreNFZ8j0e0XZcdOnLt5YgOI/hS8YRbVhoUdwArdZQb6DcVHgAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 9$" ], "text/plain": [ "9" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr.subs({x:1-y})\n", "_.simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `apart(expr,x)` décompose une fraction en éléments simples" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAAAuCAYAAAAr3zfuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFW0lEQVR4Ae2b7VHcMBCGD4YCLukglw7C0MHRAYQKgA7C8Av+ZaADQgmkg5AKjtABlADXAXkfjaTR+Xw5f+qk4J2R9WFLflerXa3t9dbb29uoLl1eXo7V59z2m9j8WO3zumMN16+fgZ31l5RecSWBnLozKt+o/Efps2sb8u5mYLvhUCcSzDToe6XyRG1fgrah2NEMNBUSWvTQEYZhmDUzsNVkTyqOKQ1Ckw6Ub8Tc6b7hHgk86ndqv6eSGwk3FulUudlSmu5Jnm874IEadn1j/MLCHsnthQshjZV+xofT+o53GuHRjdLU3Jn+mgA8O7RoV+XGnp36TpVOHKg6ue2H01KkYzU4D7R4rtN6G/xFIBrrW7GtsSZpMAR0pnyfQW2d/Ll4kwp1zBOpCWFiwfKjSeeO+rTB7yFo7jBzLHaSp21fqlGwAsHtvmFgO/iZ6i81hunq0pkGYj/8pRQKGg0HY050JB6WFpvXJMugMzl74gxzwQo9slzOdI2z75gXJmTBzOi8f3ayfXrPwGRxsS++qsxiQbsQmsNrcKgO5qo8mj6xDsKGmStdVF5IusBvvrbDrdoQDCaNzqxMw7TqH1ROhoTn0GJEAODE5JIXqTKPxY591oUdZZgrL90qjLnTScecw4JNZGU61fuochnT7vqN5sIPVjCjQbjdMP1k21U0e2bKPOJuu7k2eMOD06QHXRRKEXf6UW0wPlJ+GHZqWtY4aOS0pD+LgPuUmUtwrLy/zjH5eJeu777KCA039lbleyX4aM2jxukLf6mZE2ZDRki6uffJbftX5d9tubNM93ETuTCm2plUXitdL5yoVkHDP4WXahz2KbTqSYlFQb01jxqjU/waD43nWS5UEDUtktMk36oOMDVW8puu2qiPlBvNopwCWVwwuYRLbc9K8GC0NMSr9lR4REh7woPWh4QrzqKl/XlHBQRAhU0Ve85qKW5i5zqH15QUCRM4STBUthrhDXOXJI/CxXwvvbpS+6vFbcw8jgOrivRimVl41lEb52ZKqRKMmFdAIUDhZq/CDUd4ufHIoiIZ2tERSeJZwMhITOFpwBybGc9BCM+bPq5JiYQNTeGZDichXGAIzq3SLHgUXuYcEwhNVcfCzTp5C26GbHEQmDaOQ4s7d9O1b/yYuxRoLhCkXKlX/EloUq6SiYU7FU2KxW+W9xmElIHYBiENQspgBjKAOGhSBkLauri4qB/CmgFj/xPEwQXPQJqDuRuElMEMZACRF6zJkd6F8Qb43AKb2Pzd/rWRpJAkFB8wgoAkNPdGnq+t745S3ZNOJBjz6cRKhE/kyfy1IWzEGrJwolCqQuLr8EOUGWh2E77zLH2WbzbU+l5Jmjut0mJ4E0IjZqEYTLKew46vEIalWO2Ob7E0XKqa5IFqUgjK4KPgJv/aMHgsll6/HXnGg0LSQtKkTISV/ajVXxsBv22LpbHabQdd1z+audOE41YTHALtKf0r1nxkBdTVXxvmpm0OwrMyVrvNuFX6xtQk3OprkoARfUSsOcEWhIohQB/GrDY0CO8phb82RhZPMcxN8OJQFE0Sk6visNEmCE/JC0nlZP7aAJyICKqNxR1GEZKYrBWHrQlp9NeG+qGRv5XIqxJ/ZKz0GnWOBRbtmagMdBQhlUxCX7HmczHZmRco3JjdsfKy6Niy+eylLYqQQuRieArjSj7gUm1m5StnklMihLQ2Vlu4ezWFvQvJCoAn9BxjzYl8dVGwfvGIp4VYbX+ip8J2T+OGw6I5pFxjzUNeXBnNN9rvGvrMe/8yazUJz41/hUaq44bzBmFfKflYczA7Em4cCEwgiw7CZPPLapP/qswAVQ5/AewgQg1kE6tCAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\frac{x^{2} + 8 x + 4}{x^{2} - 4}$" ], "text/plain": [ " 2 \n", "x + 8⋅x + 4\n", "────────────\n", " 2 \n", " x - 4 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=(x**2+8*x+4)/(x**2-4)\n", "expr" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAtCAYAAADC1tsoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFJElEQVR4Ae2c/VHbMBjGQy8DcHSDsAEfG9ANyjEBZYP2+h//9WADygQtbACdgMIG0AlKswF9fo7lU4xs4lhOLEvv3Rspki1Ljx59vLKsjZeXl1EMcnp6OlE5v+Rl3ZP7zH+FP+RhyalBQDidlaJ/+MZuXHrAIP/mRLyQ+8EUMAf3njDprQlP7jwCwoZGfCWl4WY4yeU/ui31Ju+8pdTvhGjVJ3YWBSi95FQKqEmqEQAfekG7wW4q7Kn6luViYiHjgeB5FKCAaAsAbyqc1p+khIBw+aigHel3O0rhjCbFKGPHtfHHQkZI9yQA6QldUiap65oYwxhNpjW4ecVkIxYDxoWaQH5U+ETuhis+9jDh8k8YMBwfS4+kf6XME68UZw/bCmovURgwLpgEJsMPw7OxsF2XxR5mRow94VXgBEmlx9JrnwDFMky7MGNifi1Az12RsYcJF0PEHfnn5ozC5qf00rrGC1xRklEgXgg95pCHXlAcdiIuq/leRYasrNd6k+jIKAJ+Enpbcr1bg95qpQcJCZ9png3junLFNMebREVGAcxSxbbcokeUHwPGK6jeamf9CWVLXzXZcPWaNZfXR0VDRhEOg2VfbjERz6GBoLwaTPIaAaYzroa6q3CWfLxa1FEs7eQ9340AdIF3oHivr7Ve12m4IcIG3B7kZo1YLnPFP1Lv1nQsZMzWEysoAdC09CQVCAgfXqdCQmRL+k1h3jeYzJFRD2AoY8ljV/66iasuSZIQ8IvAWKSD8ZdS5k2Y6q45goKTJAS6RQAy0gNm1qX8n+Wnd2wlSoeNCVip5cXSVukO/ebYcevKmqa3RZM0QyBq3LoiY7MqSFcnBIRAImOiQW8QSGTsTVWkjCQyJg70BoFW+xll/fG6CMu5LCyMjhQ/991JfhGLzMW74fKNMfxPuLlruS0ZXWSDhLzvZWlnqb2Cui/o72eV/9qd44pPuDn42IqMjvS8BL1VmV4eMsBEQsctzRkHSMpQi1Qm4/u8INmcL9RCpXyHiUA2TKt7Nx+yG2OEr7/YOHkjN73SC7Nug8u1IWPU1m1wtTbQDHdlwLD5Ah2caKSYqFBmtzi7nNjt5OsAqahxm9vPODjmeC5QTkTXAVLsdkoHSFXgvShuZQOmIrlhBQscPjXgK8Gmkg6QaorY7PqFcIuSjMJn2a1aGHjpAKnmhFwIt1jJ2BzO2R180JUOkGqO3kK4dWXANM+u4w4NpfRgZjjdl58DiCbSIylyp2u8nvcyS9b9q2dVrTpku+MV7/0jJXdO6kNDxa3vPeOZgD1HBf+dlG91mO9hzUJU5iJrFeUFItJAjIW91vzkDw8St972jKpkekSbbCx7sAGD3hHhLZEdnwWu4adXB0iFjFtvyShS/Raw9vEZfNvM9jNIOZJbNWQSnYmu6XSLW55+3w6Q8oEbo84vKe6icig8FpqmVOEWzDqjCsDBlXw8vtS2NBtRpdFqixtpKQ16btYW32wU9rNX7Vf+vOHmI+91uPV9zpiVXwVgaYBWWhgrCuMs7iYt1weWJj+QufcHSIWGWy+H6ZxkzMWYiLMsYM6Wtoftr4pbudGgZ2KwVB0gtdZNJaHj1ksyqrLpCVHe+dL78f63EIURh3W9UtFzsZppJLfyMx+1BSu/9RTCTnAJf9C4jZco8CpuoTeklwHckSr5RMp2NgjAqanP8hdDNtesSDiRC0KatU/7sQtN3u0bOvAHjVswBozPihORWxswPvOT0pohEIQB00FlTZUmmqRHCPwH28sd2Ax1Oi4AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 1 + \\frac{2}{x + 2} + \\frac{6}{x - 2}$" ], "text/plain": [ " 2 6 \n", "1 + ───── + ─────\n", " x + 2 x - 2" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apart( expr ,x )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Pour remettre tout ensemble, on utilise `together(expr, x)` :" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJAAAAAtCAYAAABBEuITAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEMElEQVR4Ae2c71HcMBDF7zIUQEgHlw5C6AA6CEkFCR2EySf4loEOSCrIQAeQCkjoIJTAXAfk9xz70JmzdDnLtmzvzuxJp7Wt1dOztJb/TB8fHycpy+np6Rv8u0R3yc9T9jUl39rCbSulRhe+0Pht8t/RB/QtOkNNAgh0gVuqBNJIcyi8AOUziUYhkwACYNU6bi8CPpnZEPAiYATywmPGEAJGoBBCZvciYATywmPGEAJGoBBCZvciYATywmPGEAJGoBBCZvciYATywmPGEAJGoBBCZvci0AcCvcpbsONtiRnLCLSC2zTVm6ksy+sGqmQf1b2xO/Qevcb2jdRkBQJt45YsgVZgY0UJItCHKSxB2MylAgEjUIHEBinTxT76aYNdB7OLEaheVyo2k45WjECj7fo4DTcCxcFxtEcxAo226+M03AgUB8fRHmV6cnKiIPAn+j/B4CFXH1rYG4XQ1gsaqgXNshSr43r4vyx37Jc91102DOl/tIVEwEr7/aBAr+H/NLDJMzP7vKNwRnr+zLhmQd9xi/ZWxiYdsCbGg96s77hZDDRoejbfOCNQ8xgPugYj0KC7t/nGGYGax3jQNUQLolNGiUB1hn/HuY96116X3ceU112KmHMc6aAFnCo/cBHtMj5VBHPyXJAeFD6SPyOvd+4PyN8U5ZY+IQAuWhd0P3AhEr2kfOmE6cUUhtN1HpsQWY6eoMk+2KDRSEAUTz265sHk6+AmoqBaMBZ2P6pA6QWBcF5ng3QT0QryH4Ao76+RZ5tyTW9DlTq4rYVJXwi0VmMqNhJR7iHKvMJeJlbFZla8CoHoQXR+phdP6e1R6UdUZ/mH3IFbtrnK840n1FV1P0pz+gR73UA6ShvwQ0ROBrd1G9XECHQGGOdSnLhFFYgphlHcIZAUk3Qq+CLyiNTFlVmn/uSVJ4/bKpCijkB0jM4glyCaNnTDUaOQZAd17VlhBz8Knq9ykndQ/XKVPcJt2XH+RSUQx/sFGHp3q5BdMnqsQUSakFZNJ9n22L2PTWBfuprKdvp3fO9x8+3cOhQTrb2Pu39D+eRxq2p3VALRKeV44j0Vf62qvFxeQZAJ5bUfm1BdHEcj5A7pYk2o7EMX//Enadx8mDQRA2X1Aco+GcU8i4CZMl02q6x1oV6R8DXpYuQhr2d5FAslI/iTFG4hYKKNQDRcxFBsoWBQl86abrQY5U5pX/jfeuBKnQqa91bULVJ1+po0PiWLG9gEJRqBqElnjlT3mATKA7oQymTTVVmrQr0aYUTsG/KKsVzR1eHGTxO6B6qRTxK3UnvcDzXMXduW+6dmXqOOzmYBMqFjjlB9CEGd9ht9IL+YzrRNS3JNPSJRscbiVluOPVxbW/lUcZvQXzrxJFmfkl5StvSBi17cTMXpKEF0BsWIftrArbEgOnI/adhcGjojH3+oh2sct78DAGniWgv+JgAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle - \\frac{1}{x + 2} + \\frac{1}{x + 1}$" ], "text/plain": [ " 1 1 \n", "- ───── + ─────\n", " x + 2 x + 1" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=-1/(x+2)+1/(x+1)\n", "expr" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIMAAAAwCAYAAAAyw8m9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE9UlEQVR4Ae2c71EbMRDFDUMBhHTgdAChgkAHQCpI6AAmn+BbBjogqYCBDiAVkNABlMC4A/J+5u5GkqWzbMA+e7UzQjr9f29XK935jpXn5+eedTk9Pd0UB1cKW0oPrPKxZhW4lL4u7L8VnhQ+K/QVTItlY8AD7KN9GcaRIryDaVk1jb6A9xgoxuDRYfuiGINt/XvoizF4dNi+KMZgW/8e+mIMHh22L4ox2Na/h74Yg0eH7YtiDLb176EvxvBCx8eKlQ2PHWMXK5Z/qNJjaH6cQnYU+K3iXuFR4UZlvxSbEtPGYErTGWDLNpFBkpUqxRisaDoDZzGGDJKsVCnGYEXTGTiLMWSQZKVKMQYrms7AWYwhgyQrVYoxWNF0Bs6Vk5OT8q58BlEWqpQnkBa0nImxbBOZRFmoVozBgpYzMSaNQb/a9TP76Hy1t8DyFn10gag2HFFjUINl+8KoX2GaSh9LxkeSi5EDpIDvibFtxcdTMTenRppv68ezlUIHiid6T0H1F4YPzRVvXuuN70f5jvRY+byn0YiuWewjXHjGoEq84PFH8VbTssOJar7ux7MYxAfl8x3liCj/nzK/pMrDBlX/C8GH5oohXCjerXEofaY0it9V+rbOJ9b1CBfhNkHjC7fRe6c1qR2F79OMo3ZY977CodpfZvQBNjDmykz5EI6puRAg5goPjag/vAQLo36jqylTYoSL0BgO1MFEbtTtfco03ojw7lJhA2PueLPm4zVc8OreQwQbHmFd+X2X4BgXjTGokL2R9/+WXcB4MA7kAvKB0h8170ECW2wBeFy4/5+BvcbbV8JONRAd1i59W+lvCljcVwXkTnWuX5Kd/QtGsI7zgK18dI0LzWf4vyYirA//74TKvUNkVc/jovEMKuT0+RDpzM06U6fnBGXeKXB4Y59jb8JQJtmPVX0uAkYMeJyM46PzXEgvGAJY6zuMELPHhesZUCa3IlFRx3gEV9kDXbO14B2QDQW3fJjZwT9gzDGGJB8LxAUHx2vNl8UbE48L1xhQJgpOyV916p4puP28V96wjeKUmxr2p3JOrxxyQmHcnsq9k3BVif5b+w07y7gGA4oeJ218dJ6Lim/OEG38eVy4xtBKjjoN9xwOYT9bGzmFah9Tdk/5eBeeiqWs1+nlTZJtSs4aQHPtNBeaH158QzHnnjbxuFh1auIyclZMT4OwwqnbHBaVx+1LVntnzHkkmSNYx0kWH13jQvNhcX1S3HgEpVlssa3R48L1DLiMWIOeOqIR+w+HJk6grHIe+Ljbxg9dpw4qqt4ZYTW4805NLMpHl7nQ3DYFJvZTAgYSu3vyuHCNAde3nWAGT0DgObdnTdRXHmXcXcxT3I9nBy0TGZ51WsrrohQfneRCOmAhs2BvlQ6fInPHF9uGPS7WauSKL6vOnKwmiTfAsiCip44PFfg4lUF5xv2kdLNlUGdWonEhABnOTfGV8ljVqY9nqRc9vyjflRQfXeXiRpPHIOrnQC4WDDsmPhd8hV0HvQ/5oLBZX88i1nh7CkczGqsPxtyxqKswMz401ly5WA3MhecEOasmaPaqS1x6m1t/VedBY840kzwLmTUf8+UiXCWyzhuFfpi/6NdgAtukOJaRjxQXoWdgIXFLEh5AyF90AdM0Xm8Z+Yhy4b3cUmtbBzAOInuKYyfQutrCxMLBCx48ls25pRzBtUx8tHHxH9NWuByaP2H9AAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\frac{1}{\\left(x + 1\\right) \\left(x + 2\\right)}$" ], "text/plain": [ " 1 \n", "───────────────\n", "(x + 1)⋅(x + 2)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "together(expr ,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `factor` factorise un polynôme" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{x^{4}}{2} + \\frac{5 x^{3}}{12} - \\frac{x^{2}}{3}$" ], "text/plain": [ " 4 3 2\n", "x 5⋅x x \n", "── + ──── - ──\n", "2 12 3 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr=x**4/2+5*x**3/12-x**2/3\n", "expr" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALEAAAAuCAYAAABnGfhTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHvElEQVR4Ae2c7XHVOhCGT5gUANwOQgeBVHBDB3xUAHTAHX4l/+5AB3AryEAHQAVAOoASQjrIfR8jeWRZsmX52Mc51s7oSF5Lq9WrlbzSkX1wc3OzGUrn5+d3VeaNKXdk4hfiXw+VVfIXBMYicJgp4K0M9pUtq/R7pX8oPLC8EhcE5kLgTmZFL2W4p07Zt0ofiXfs8HqTym9n8d68+5JhG23ehozbhGdfe3ONmFn4+xggpNhrlR9k9GPqW1BZBjttz6KV4taJ2UGOT+yjL2CZiZ8oTnInlO+J8p8o/seVpWtmZst7pPQV1+JfuvmWnpa+DM6PCg+Vbq0TxMOIrxV/GNIW5e/Czbp3rFfAEZfvyxD5S8grncHulWLbnkotXUcxG23EptJoh/nAKD8gf1X80L2na4B/r/ix5SvN4ED5x0ovukOkH+36T4GBxwCkM+6J3zJi8Tfis4b4O3afPC4pXww3+P4aBWOnT56q3CdXztLT0vendLxU/NTXVbwgZrnuRCVfQqsRr4vgjOMrYa4xTBaCPsH3Rx+zMkZAhyyahAUzK0ZDGy4SlAUD2pxKMdxeSgBrFAzXkh3wdgfJ8ieJVfepAnqMIsnoc7OCmGUbsSrEgHnUM0vSgfgt8PromfKFHqMsFH/qHjOLS3TI3UTZbrlFpw0GYOG3N6Z3DDdcLQY6oSLJrNOWN3FMGwjZJJ15cqF3VPcYZllbbBKGsTIqMGIqh5iBrD9bMfwf5WW2+OXzzTXGeqw8sUaMAilS567ZYPFMITSoa926cNM9cLtXZ1bC5IdFH90Wei69safG0zigfAuz2ohVGCOxj4QTpV8oYKzPFaBvymP9K3wT8hPXlKAA/q591NXlSKhsywcyGapBovv14k7pIbo26lnYBViASacRmzxB3Pz2CBueaJVrpnRD7lJxk164EakDroVZbcQ0XMKqUWCEskjBcBkd1hepjFjXjZGvfKnEgidV2Y3qwYArt8WrIFlXr9zSLlnEYHR91IubwQpZTEAM+NAW6OJwk970L+5o7Amt2w1qYVYZsQQwA7uLjGtd8+hnNobuK7j3K2bGDzMoq/dUYkH3Sfq9swVm1NVWOWUMFnRiH/XiJlwwXMJGafruh+J6d0LpufoYFYYQ22mdbqgnrIWZnYm/S5A7Etj+YpsDY94ojj3qPfm9lwyGSmZfTtXJjP0rUPdoXSUTo/iqQJxKGERlJKkFEvKBeYoOybhRp/Rk4IPzR8V2m28buNEnoScH+lFvyJ8NbpeZ/Ays5CczZUQtzOxM7HcOi41/qyI7+BEYNO6+YvzFBok3WlfJoIMb+9SNSua7GGScIbXUlmP4AVxwJzA4Aka9DdxCRkrdzPzsTtVPTF13kvLyBGLXyZ08O8uYmy3MKiN2S0oojWZ2sIu4jXjVbKGYzh9DVypcyYoJUR0A8kBxPfsrXT1yFTcarOspdY2puE0+WIBJH3XhVi2uhYWdcftkbRaCG316Il38/wAYlAwI+DyJfVejhdmhMsGkAE4/Kz9Gm+9ovwkIU7bBhBFGfUDVQQNomK84hv1B/Dl1Hdy4jALMKo2BGZHRhdu1ynwRNsQuPTIX3FscbtIJW2vtuIj/G77iehJzG6V0CzNmYmYzArsQNLYxM4jHvW8K26BLCWH13CLVg3EzmGiA7yedivdOAWOeS9eWjgMYf5m8AO4blyumWnu4jEg6ipvy+wN+Y3CiL1k0MSHdFtxoPnoTYtTC7FA5GQ3sJ2IcAEDDPytgSDyqrpSuXQvyjKALlcVQQ/RZTAwZf9gnOhGaU9c/NQ74FU62bRWWKsrCilkUPBt7tkYs+YJ+prlvoyhuyFVgkLsDHxzd8yaLxo1GGv3RG6I9YMkWr+9ntzAbfQCoqnLAj5Rin2+Klf4ALXafVTjQYRh36sm/xeKmNjDTD1rY5fRADLM7OcJGlmG/OWX2GVnN4ovjBgzZe18ybrhMhKkpiNnsMzGt1IjCdcBtSVnUTA3M7PLNjNI4dpqixJpx68JsFzMx/cXK0/XhUvpwn/LQ9pyn0Zpxi2K2k5kYazQji7dBfMd9n4y11Ra1l8Mu/PmQ9RRaI259mO3MiFu9WxgFgUwEduVOZKpbihUE2ggUI25jUji3DIGDs7Oz4Z8AumWNLOruNwLFJ97v/l1F64o7sYpu3u9GFiPe7/5dReuKEa+im/e7kcWI97t/V9G6w1W0coZG6l8lDvRzfDD4NSTzT5s9+8uBdc5tc4bbHjPVZaEcBIoR56BmysgAObztfn/tKCTOGHDjwI94nErjjWT33G+oeOH1IFDciR6Aum7LAHlrgrPRHOa56MjbOkapMszKHF+0B+k7ipdbXQgUI+5CZ3v3eBthNd+Z2x5saZKKEafhNDYXrwfx5m7s4DhuSaFMBIpPnAnckGK4HJH8LAY3ul8WdxGAUthlJk5BaYI8MlwM+EjB7lhMUMs6RBYj3l0/s6DjcPyqXgqYAu5ixFOg2iNThsurNqHvzPWULLdDCBQjDqEyIU8GHP3O3ITV7rXoYsQzdq8MmO8ztL4zJ/7RjGrsXVXFiGfqUhkqC7nYd+b4C7pQJgJliy0TuECx6PfXzEzLQi76nbmAvMJKRKAYcSJQsWwyUPu3Mf/KQaHvr6V8Z+5P6fI7GIH/AekbOak2QpSFAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\frac{x^{2} \\left(2 x - 1\\right) \\left(3 x + 4\\right)}{12}$" ], "text/plain": [ " 2 \n", "x ⋅(2⋅x - 1)⋅(3⋅x + 4)\n", "──────────────────────\n", " 12 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(expr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `solve` pour la résolution d'(in)équations et systèmes\n", "\n", "\n", "#### Solution d'une équation \n", "On utilise la commande `solve` pour résoudre une équation:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADgAAAATCAYAAADF7c7rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABv0lEQVRYCdWX21ECQRBFF4sAFDMwBNEM1gxEIxAz0PIL/igIQUPQDNQIEDLQECgywHPWna0t/YF94G5XXWb20T33Tvc0EG02m6gsRqPRomyMuvwPopI2Ho/vCHFaMkxt7qUEIi6G2Vdt7CoIXFgg4g5Z38y9VcCjthCFBcJoiMhZbcwqCtwtEgdhl/i9FPGt0wdeVtQz6DNfu9bOAnE8wa/H2IizBw+PyhNYgTMgv8w6tuddjIDu0nXOxwWGwHKd8/zfMsvadvQpOGJeOINLAojECOSOKXASgv48acZnmSYTIUhh7pg25dqz2SjLziDkQqlJ8BzcALMTyvFP+eHzyHPRWMtn0AzMBGznwIMbc33PqPiQKabtsSSDiMiXmuw9oJabWdR6oL0CIf+ByHzb73Nvyb2kEzEOuC5txLES3oHjtjbAL2tq2zqF90IGfwe44oVJeKmqMd0wN29vlj+DyaKQiJm4w9n3mTsv9saqwoW6KXF/3thk/OF8C9bM8yX7wLXNpnVmBs2YWKViV3kV3POZXbUNdpyStCkm1uHfuKVnh/z0DoL8qrCDXoAFUHhWrlw3zuBnBWrheNlTrMDXb2/1K1Axo2xMAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle x^{4} - 1$" ], "text/plain": [ " 4 \n", "x - 1" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq=x**4-1\n", "eq" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAVCAYAAABmOZFVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVklEQVRoBe1a21ECMRRdHAtwtAPoQLQDSxBLwA6c4Qv+HO1ALUE6ACpwsAPpwEcJnrMkGZhJ2LwZlmQmJLubnHPvPZvH7tIZj8cPVVXdIzMNJpPJ57pafg89AtByS9sOxH6CUzNcmB+6c8V+fQSgba3xqf5yvLMgugTaO3If9b94yNtIuXi2Wf2OYCtHXA+lnFH9gDS9dmEnERuEZ7DjDfkH+Qq5ixw95eKJbvh62ZwmwCUkbyAtdiqxOYIHZBZ3Gkd39ATsLDyxDYfdvdiYEm8X9olsVMr2R6CI3X6NlYdJpnGFXioqApheuY8ZInMKX+L4VV0MrNhil5EdGGiH7iOI8oz2fDLho1DMZIVdxI4ZcgMWROYG9UNc5sZ1ZWjqfNoFWzuNi2lhAWZOPbap1W/fAmOyQn/5ZvIOAX20DapFO2tsk9h8pOlbEB1NE4jlHRPRt0J5i4BxAMVcr2mXFXaZxhmpfGkEqinFR6boMVMj9t7FTuC0NoC5eLTkOCn4uXa/iDYUR6UQ+5qwJUkOsS8E2bkklaUw8hflUp4LKHPx+JrYZUf4Okdm/UsC4ZijPCQORmzJwTLZVy84wEcMphtkOsMNCneh/MKm1izUpdNeH0py8cDu4CRsnREIdRUDcRwjDibs+qtXMrFdIgPHuXHhHV9vNlz6urTNxeNi02bbVPYBtxY7xzS+6Y+pfp1aaEGci8fkZ9P5pPbtXWyIzCn+uykKoddz8fjamcO+vYuN4AzhKF8jpk65eHz9SG6fXLO5ZjK1+i3Y2sXj+cUgkv9B45PQ4B+OswLaz9DCtwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left[ -1, \\ 1, \\ - i, \\ i\\right]$" ], "text/plain": [ "[-1, 1, -ⅈ, ⅈ]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(eq,x)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAAVCAYAAABMiWD6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEEUlEQVRoBe2Z600cMRCANxEFnJIONh0koQJCB0AqIHQQxC/4F5EOCCVAB0AFEDoIHeR0HZDvM/Zq79h7rRdugxjJZ48f43l4xuO94v7+vngtT6uDw8PDsq2Om9a+LV7hSTVwdHT0nQ0+ZmxSRhoViTeegJcECKiCTikl5RJ8e1XysfcWe69T7+fwwHoNP6L+JZ0XZ7SkHAT8TfuOeiVGY98B+19Rf0o85dRRng3qUa/DIwx+oXxrKeyw5bqulh1D6KQrYpGWNIteGw3+PK2W/xF2OHAhnHXBfKQlzUHfjdaFvJ3SQGnlPILM8S67mzevxbg0d9ZaLHy0ROvTmcLYOu1disJ9pQjXzDl/aK72N/JqmPkTOflAfUb/ZZ0z8C/gexQVpSwXFOX0nryguG4abDIwRq8+kbVt9SXNza487RhGflogek0xe/M+MmuSwRCLqVcK8GNmaYJS8UufhtmnNkMLEOdppF3ajpnMKIMZnIfPNbPgM4PpUDTNq/ZncBl9SbPMNhpC6GF1o4zADQ8pnr+bGAddGZyx8zk8T4YuD5eKTO+pA3A9SlkSeMpD6k7/VC+Kkz2ojYkQa3P0Jc1yDSJucEWxXhS2WXcbJ9/QrivBFPeWviAw9dyUmzlmWYajSdDgBeNNJ9s95tJOBJmrQUqKJ3sMGJOWfYbzJJd4W5DvIH8DgRx9qeeBRpN467eEAk8wtgP+Y6JvJgqNJqMU9OuxfhEw7OaCBhOmKdOx5GkeIu+tASXNd6weUZy/NEAvR1/hMHSSiCTOYUhvGVCqpEPBHadOwouuAlI0CPxMYSDNuWHc8H4K3/ZpcMNnCvmgM2HI6Kx9wmLoLasvaQ6zjMamEvGeUCDjvB7jZZ2EBy0OwMNdILIqgIcUss3sqkMlP4ypPEFZBPFHGWUYWewnGXpsNvvk6ktPu8syGgQUzmKGFU4B7QqiMh7dIdWE529ssKWflk4o9TBl2DP7TQnGCNyD6NPFtjAET+2Hnum/0vbpMwm5+gr5Qta3R4TQUAoc0ltwBfce8jSbWivo2Kmmb2GItJa601jj3WP2p4KEkPXRH7yf2lCn5ycDiGvEZDDQ4H3yL606SMO5M+9Yxl2np4695cCz9MV69byXZbS6NE/RhskuE5GFWWRf32gaJxw4apVtaNIYHtJFDKeC61k2aHuABw9XeNSvtSfzLCv1huQRz7IhygkemgzmprQTH77dNJ5PjZnexrjG9Y5vzIzpXxaMDtLs9wdjFOT/YYtmbMsqYdp8M0dDsl7VBBrBJ8FMiHxLRw/JgkhDWkEXffe0LGHbLEYxZr9e+AfUPrb/RjrvqQ2TftqqJzFxuLHSI81IveNzwENSeWyv77QcKfuyFgPraVvU88JpI8us85vo2Ke3fwNI+r/vKbafAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle - x + \\log{\\left(x \\right)}$" ], "text/plain": [ "-x + log(x)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq=log(x)-x\n", "eq" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAF0AAAAVCAYAAAAkeuLCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADcElEQVRYCd2Y7XEUMQyGNwwFhEsHoQMCFUA6yKUDkg7I8OvuH5N0EKiASTq4pANIB6QDGErgfXzWzX7Yvv3yHolmtPZatiS/lrVe7y0Wi09FUZyLoflyuXxYV5/mU/4fih+n9H6bTckrGL+Qcwficwlei5864EzuzZSAe1ssNLaDJNkV+Ep4K569DPYa2CgDl1LxQQwAf8U/xJdqv1NZqLxRgXxfTFSy2B/VTl/kJyrQcSim7UJtX1VGyY85UHkV7TRAIL3MBb+PVHd+mjq93yEXn4mTfjJmT+mFya0YaErGKKUPUFdiVvmirlNt2CU6jkO2/Xh24Lw+tv6uPizevcqjumzIu9f7TTr+iN+KAf6V2iugq82R2n+q8j4hd1hniXTvg+VVAOlDLMZWwL1iJnPdx0hqjAfP+aB6m9SFD/hi38igenJ6LiI6oNm6aDzZCRAppEKaoO2SSnvi5VRjtm7rxPhRRN4HfEkGWjbQZdi2YAhUosYiM+RgMOWEkJEd8r/tqlCXqdvw5TRlNBvo3ijAV0AVSCwCjvFxhTg9bUjyM73YgmzaE5VjyUb9HiVstRHhCz5FKTfopJh6euHjyNHJdsJmUdROfV9ll8jlA/dL/L8QvjR2d9m53KADbBlUUsF374Dl/LKDnwV41yMf+k2XV73TAl/Kc2o4Ezy9+Ii7V+8NYI2RzYbQ36wDA31iFoCfCKK84F1M1e0E1bt+PBkLMR7dDZJO/B9jHg3diQZ2aRK3GOhMYowzr6WJmQAgV9dPGNgxB/l4Ns7zkvcm6RtrHl18iAaBKZkivWCLKH70IJhtSnaCLciXsqBDHR22cB2GZeuKL26HxyzkBv23N0zqcWml5giR6AALLEita/SV3ZTModGReQREuu3woIXcoAMqFPtDIyLYAfW04wa1fDyo37uWfYd0s6Ot+wYlFJGW8SlKwZwe7d1dwIpz9xJbeZzjt3kIcRriIioLyXfTTYqEbvx8uK8KBQv9YkHmFGS78HLaJ3po8pyNQ6eniTxYm5EfpDkWg2vcBqmdAFvlTi8Nw5kamEwyujLZravl9LV15z4L0BVBbHP+AYi0nZC3jQ+hlFPx6VmA7mfEFWyXO5sKECO8YLvVbrOczu85tPO8uHaj39NH24nKrlcJ/Qz6UbLHremtyuCBwctZEE4+83/triEWNNmLLwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left[ - W\\left(-1\\right)\\right]$" ], "text/plain": [ "[-W(-1)]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(eq)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[ \\frac{- b + \\sqrt{- 4 a c + b^{2}}}{2 a}, \\ - \\frac{b + \\sqrt{- 4 a c + b^{2}}}{2 a}\\right]$" ], "text/plain": [ "⎡ _____________ ⎛ _____________⎞ ⎤\n", "⎢ ╱ 2 ⎜ ╱ 2 ⎟ ⎥\n", "⎢-b + ╲╱ -4⋅a⋅c + b -⎝b + ╲╱ -4⋅a⋅c + b ⎠ ⎥\n", "⎢─────────────────────, ────────────────────────⎥\n", "⎣ 2⋅a 2⋅a ⎦" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('a,b,c')\n", "expr = a*x**2 + b*x + c\n", "sol=solve(expr, x) \n", "sol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Solution d'une inéquation \n", "Pour resoudre une inéquation on utilise `solve_univariate_inequality`" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left(-\\infty < x \\wedge x < -2\\right) \\vee \\left(2 < x \\wedge x < \\infty\\right)$" ], "text/plain": [ "(-∞ < x ∧ x < -2) ∨ (2 < x ∧ x < ∞)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve_univariate_inequality(x**2 > 4, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Solution d'un système \n", "On peut résoudre des systèmes (linéaires ou non linéaires):" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[ 3 x - z + 2, \\ y - 3 z - 5, \\ x + y - z\\right]$" ], "text/plain": [ "[3⋅x - z + 2, y - 3⋅z - 5, x + y - z]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x, y, z = symbols('x, y, z')\n", "eqs=[3*x-z+2, y-3*z-5, x+y-z]\n", "eqs" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAAyCAYAAACeYH3nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKRklEQVR4Ae2d7ZHUOBCGZ7c2AD4iYC8DYCMAMoAjAiADKH7Bvy3IAIiA4zIAItiFDIAI4DYD7n08kla2ZVsznjH+6K7SSJZbsvS6W92SZc/B79+/V2308uXLY51/A4/S99p47ZwhYAgMg4B08aau9FnhVOnXbVc9bDupwk91/pvCd4UHbbx2zhAwBIZDQLr5VVdDJ58r/U0BY5ykgyZLrkKvVAIlf6L022TpGWSqb4WX4rpyTfEj5V3MoGt774JwwpogH0/2frEJX8Dh9EFduJWSLeWhoB7DK0pz/Er5nxS3knjgx6JThvoxyCU6Kh25AzHeVRIFf6v0LBXcgfNFfXyjdOHuKEZofyhOgqVzRmUEEFwsilEFASdf75T9S+G2QtLSOr5nir2Sr5S+L/6Pih8o/Kt0I+n8hcIdMfxQwGDVptSHDaWfka/C4cINfFPO5gZcUx/DfEZpBPZcIbbuU+7j3tourDACRg0ICB+UDyVFh943sJH9mCA+FNuTt+DPfUZbzLV0HmN8V2kMVYmalBxL7i9UKjCjA0CtuTbKQ9EBCzfIKIGAEyQEi2DUDwHkrYSlU9pNa/UDCbpbopq7Hgn3bG9g1EdcqSr9dBm4WHMf6Kp9zz1+KAxLLmZuQeMrIyAckbGrca7yvFXfxKP0BuuvuC7STZaccykFIH/yJBD9AMZCW5Wuu4zj6gk7LqZwuOmbCJ/BtgECkk0sMYveO1vwrlnyDdozdVYWNGqujfL8nObK1Du46/ZLABn4mGt6q7HrSyy2PmGK3CGPJwq48KwN7YTaLPlOLjDiSh7RNoEbFN0B7a28CXL95u3MutSrXnaOZO+rwmsFnn0zv/6itHfbe4GzWCUXgCjzDQVWQJ8q4CJhqc4UIFPyNQ7Fr/BhFdjc9AiTfSWFNV4m8vlB6d4e5ZLd9ZUABMjSY0LloeyQKfkaB3Bi8Lui2DBxmOwqEqbF9FAxLnpMuOt4mQSUfmtatJI3oAbonwQ6A4DRGgGU/ESYsPklJrA6dvnfFRf7K2IGS3ciwIaslbC7qrAXmVuskgtQ5jtsiLnhwVWMa8TIeUvByCEgXHjMU3ucqPz/yFds7zVsLy0odsqo8AgXquG+zs7/XaySCyKsU/UxIZaKxaWq65SP6LI4GRQJRu0I+Mey18SGUsdU834kfxggcEUWq/xx2ax07QUVVUrljNDsWy/NV7NqnBCT+ufn3/QZYqGj98i5rmq+v8KIBTgGSbweiDnjmfLDFuEid+E/wsNPb8AJGcN4sK7BvvTwTojSnI+9IbDNekFFfAWpjka9XbIlXwmY2ijqQbO4GQHhNuvBv7nnm50RTrHiNhYWX3I61FhgwxOHG/IbuyFgCEwMAVPyid0wa64h0IEA8/4SpZSc+QB0sY7s1xAwBMaOgFx+r6/MzUuUUnK/mPKxxGkHhoAhMHYEWNjz+hvamlp4e66zbGzIWmUWHyMHWx6hEwX2hOMNPFSAWHVt3bGj83xHjmeFs17QibDidUD2JscrrOD4TnmdizXiWQRewqMg9ZdNN36lmm3I7PNGxnjvP2C45q7/imcpeJ2Ck/r7OMalZMl1wu9Nrn1Cpg5dyGGpn431PD45U2CDCeCzco3g+sdUStZJfPBww/zD/zrTfHL46B444SVVcflbeTwfbaWF4bVy/UWmkE2MBfIGdsQ5Cr4Y+RIe4AMmfNIMnSooKLkyARFBu6N01h5l8WHBY2G90DGC6sFnESA+r8MyqQ7KsKVv1rvM1D+sEYMgxCBa3YhDXqf3tBS8AMkRMoRMYkj4UIU3QI88Q1u8NLzUX7xh9A9PEZlbHSnBSMf+Wfz5sMVT6Rw6V/l4QEBRcaVQ3JXiTtfT8RX8pLtIddJevk5JnEuFi+eZVUf7x+Y9o2LxHkSHfZJMgcAYYjDFtYqJuVQ1Lz4f0qpnCXgV/VVfg3wpzT1nOnm6IQZZeLn6e8kWjVY92fIFfw6pzmw5FC875fAWcd3fHLx48QLgUHKsCCNlFiDirZHKslOOG2A7n2rorDOEDcrMDQgvJCiPEZd7wFdi/UCgQyOPgHDB/byv2GTLg9ISCyc8aqY5p4c64Esf/rtQfI64MPEt5ZOnVA7hZcAIi2zK4/VE8owuEcC7Cd6OywY77oMp+CVOIeVk667ioOAmVwGeWkLYsEiJghfTnHhOji//j8JnMYVJu46TBMgK7MFFQCHKI6jBvdIxC01bewZUOjZSf/oOWmAbY0QXs+bjY8Mipz198VJ5LBKy5td5/GURYqMKAsKJNTAwQ8ELo3EU8ygTXx6lZSToWgiDj4CLj+D/Ugjk6vELTSG/mnBlcfOxbl3XrBYf9Ni3VXGftqLgLCYVpLo8jgySneTbIMY+bei8zi4YfFu3xUvl8CrBhb4SM825roAQ5673IJuTkC+1sxcJI2SJD22ix8ErDJY8qp1V9puuQJRdSzKHZ3Sl4sfuJvAXQyzfs+rO6Btcdx0nSTxYegT/PMmwp0xdl48d0O5syxy1lb5ll6t0oXgpRuV5BMQN8cLaubJOPSqzJLweqr/3FMAMuWTRDXkrCbGOG+lP4ZVqkNqyscyl6mnJ87JV8npSr5r6RaDikUVLhZM+JcCxBngsTcTUo/Q9bM/oyqZe9Pcs2bHqwr1ivjl2L2YUeGUDO0JGJzdbyVxOd1Q/q/o1D+8oUdjPF7e1VIkqR5l1olZhPX1/40ZiLYpRMc6M0nwKqdNLifiLpMqUFFrHYIzXk/XMt1rfwMeD4zVw/4a4XB8MW9vnZAmemjynlLy1sjmdFDB+Y0XolvKKRUfFSSV2YP4MBTZLYA1xOz2xeMTHOZLX8kxjidXOofEaS9d31o5tMNzw4qW1McouWcmbFgWZK/t5cgpf5vHhUU6KoSUP74A/WWQuzmNL1i+y5uItdQ516k/gNVTfhrrOthj2at9ilVzKVbOeysOdPm1DVDzbKvgqdc22a43pXKrtytsrXmPq/y7asi2Gfa+dWl3vW+cky+sG4KbzVCE8ephkRwZqtOHVH+ihMDQlv7xXWCWCUR4ChlceTm1cg2BoSq5b4EZUHmNNZX7cJjh7P2d49Yd4SAxNydf3i91UtUcP/W/lbGswvPrf2sEwNCVf3ywebdUePfS/j7OtwfDqf2sHw3DxSi63iQ0pxwpsFzXqQMDw6gAo4/TQGC5eyXVPbrv7YpY8Q0ANrzyQOrgGlTlT8ssvzJgl75BMdxrPBzK81jhs8zsohm1KHl6H3KYXEyrDc3EEtmk30oS6MkhTDa/+MO8Dw0Z9rb2FRvs1Z+BtFt6yqu1V7t8/q8EQMAR2jYB0tfHt0SZLzvNinht7t2LXbbL6DAFDYLcI8OYk9H4dXf42Kbl/zZKX9I0MAUNgxAg4Y4yu8i45U4ESJZXcMfIixlOleZ5nZAgYAiNEwCk4n5GGkm9PJpUcbhXGmhOKbzeTZ2QIGALjQUA6iovOp7yZVvM57+SuzeTCW9wNFTzWcfGhA6VtIS4Gx9KGwB9CQLrIQhsWvPN/Dv4HG6O/1IEHfm4AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\left\\{ x : - \\frac{9}{7}, \\ y : - \\frac{4}{7}, \\ z : - \\frac{13}{7}\\right\\}$" ], "text/plain": [ "{x: -9/7, y: -4/7, z: -13/7}" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(eqs,[x,y,z])" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAAAzCAYAAACQTjTTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGz0lEQVR4Ae2d63EUORSF7S0CMGwGJgMeGXgzwEsEmAyg+GX/22IzACLYMhkAEfDIADJY7Ax2z9crTWl6+znTPS3NHFXJrVarpatzdfrqOT6+vLw8OWpwV1dXtw3RjjICRmCHCIiHjfz8RTJ8lb+p+dc7lM1FGQEj0I7AtR7V+Xl9LIv7XQ+ei9kf29/1EyNgBHJAQDy9kBznd3IQxjIYgUNEQCR8oHpjUR8qPGpoauIeYotxnRdDQARlzPpO/qf8I/lT+dHOxB0NmV8wApsjECzrOTko/EIXrO5ox+SUnREwAoUhYOIWpjCLawRAwMR1OzACBSJg4haoNItsBExctwEjUCACJm6BSrPIRsDEdRswAgUiMOk6blhcfhVwOA3XZ2HtKkt4SpR5CSBLxKlEmYfqdlLiqtDXAut5LFzhNwpziOF+jMvwWqLMS8BYIk4lyjxIt1N3lS9E1rOkZE4ZnSpuo90hST5zBkuUeU482vIuEafcZf41gH2vDfS2+KktLtb2S1thmcaXKPMSUJaIU5Yyy5BxsAAXjdy14n7o/oOub6snPX8mJW5DoQD3Q/HfeuRY7HGuMkuujU+OzAFmrjh11TVXmSVXtVe5S/a+Z5MSNy0sNLwninuYxuccXlpmlT/JyZG5MV4ap03qV6LMXfWchbgCiRllxrejzxmmwiofuhKMkQd1H9J3x4anknlsuWl6ycCZzK1PjqR5Th3OAaexdSpR5r46Tk7cANJLXX+j8HDPlT78WIcFws/qgoxTyTyrrEtmXiJOJco8RMeTEjeAxBIQJIgzyYxzXw4RZok0JcpsnIYhsM+67SWuKo/F43ducI/ln8nTFX4qj/usNO//C1ZrtqRn7Xbl9Bzy7swlMrN+/FX3q652ePZO1zhBgKyLy7wzcJKCEpyItW4TbHIP9hJXFVgtYkvRnNjnZzcgK1YV68pYtiKu7u8qnIN7FeRjcgx5V8RV+Hd54iuXkcxRpF1erdtdoj1hWZ3EVaPG0qY/1Xqrexo9VhfHwnH6vIpc8o9kpov+OcjAOJvf9kkdcQf/i5bWbdokygt3ElfV+SIFp5NKLO18UxwEPtI1dje53dgpHyz3WUMGfBgop6mrjRxN5afrxljXP2r5Uk49rpak/1Zl073+JM91qDvXe7msac+u2xkwKlq3wuOfoQ1FaY+70nYSt6GRNRGhK/9Bz1ROEzGPFI91Zznoz0EZKZHSxo8KBIVUq26ynmGNidva4oZyilmjVp3XnOSvf0Am1+3UGIX8jnQtUreSu5OMawrquRm8VzkBK05EAeAJvqeMpR5jjVe9gyAECr+VzPVGu5SMWZQrPCIRrNssNNIvRCtxAynZO4lScVhFGn3adWYSqLJwVYq8/jDzncqKdHszvkU/m8LNu/LW7aYAZvBeK3ElG4TF/wyNZG2SR3E8i5NACmbn1kgb5EXmD9lJ2ixQ68mRoI8bXdeW3ZqzaYy1bhthKSfyToeojAMZH6LkIzUS/r8QX+l4xhZCr7pWpMnMsemD9Vpmvf+Wj2eCtx7fzllPydt7ckRpYs8Hy4kf2+uxbudU4g7yzvqffqlBjp6casNMeUHgM12LnVCq1y3g81HXscStZ1X0fWm6lbwM4+JuwkcK05tlX0Tv3IvSVP/0q6urnIMyaZCjGyWKlF91IxU+UT5UeOtloBxASWR4rLqNxid5v7hg6bqV/JD2ja70YPHVEqvi2OFX9W6HKCVr4qoiWJPVcs6QCoU0WOq/kvTV7inllXPXPhG3P6i68DFiCHBornTd0vNbW/6ULrG+fIDjMKlXp11j3N6XM04AEPcEyAtdGdvyhct6bLsBlheq0+D17Q3yz/WV0nWLVf0u3d2VT3tLtM8nimPfwtrEapMi9pK4qvjeWNYmpRGnOh4iaal36bqFoA9Uj5S0qZrpSfW6vSRub62dwAgshIAI27RNF2nY1ceHqXeCinRZj3ER0M4I7DsCIiukZdIqzjT3VtnE7YXICYzA7AgwKfVeBB48/DFxZ9eJCzAC7QiIrGxo4tRTWxe68WUTtxEWRxqB+REQWdlbwOoHe+hHORN3FFxObASmQUBkZT36fmppFWYp6HRICSbuEJScxghMiIDIyWQUu97qk1GQee0wT1uxXg5qQ8bxRmAGBIJFZTKKXYGMb1PHXvpBE1Qmbgqbw0ZgfgQ4Vkp3mPFt3Q1aw+UlE7cOne+NwIwIyKLG46VbleIx7lbw+WUjsAwCJu4yuLtUI7AVAibuVvD5ZSOwDAJxjMv60dqpBN23nV5YRlKXagQOEIE6LwVBxdNocZmWvkk8h33tjIARWB4Blo7+x81/AU5g1O1P1fnzAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\left[ x^{2} + y^{2} - 1, \\ x^{2} - y^{2} - \\frac{1}{2}\\right]$" ], "text/plain": [ "⎡ 2 2 2 2 1⎤\n", "⎢x + y - 1, x - y - ─⎥\n", "⎣ 2⎦" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqs=[x**2 + y**2 - 1, x**2 - y**2 - S(1) / 2]\n", "eqs" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[ \\left( - \\frac{\\sqrt{3}}{2}, \\ - \\frac{1}{2}\\right), \\ \\left( - \\frac{\\sqrt{3}}{2}, \\ \\frac{1}{2}\\right), \\ \\left( \\frac{\\sqrt{3}}{2}, \\ - \\frac{1}{2}\\right), \\ \\left( \\frac{\\sqrt{3}}{2}, \\ \\frac{1}{2}\\right)\\right]$" ], "text/plain": [ "⎡⎛-√3 ⎞ ⎛-√3 ⎞ ⎛√3 ⎞ ⎛√3 ⎞⎤\n", "⎢⎜────, -1/2⎟, ⎜────, 1/2⎟, ⎜──, -1/2⎟, ⎜──, 1/2⎟⎥\n", "⎣⎝ 2 ⎠ ⎝ 2 ⎠ ⎝2 ⎠ ⎝2 ⎠⎦" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(eqs, x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notons l'utilisation de `S()` dans la definition de l'équation. \n", "En effet, si on écrit $\\frac{1}{2}$ directement comme `1/2`, Python traduira cette écriture comme $0.5$. \n", "Pour que Python considère vraiment la fraction, on peut par exemple forcer le numerateur a être un entier en utilisant la fonction `S()` ou écrire la fraction comme `Rational(1,2)`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NB Il faut toujours avoir un expris critique même lors de calculs formels ! Voici un exemple. Soit le système linéaire (avec paramètre):\n", "$$\n", "\\begin{cases}\n", "x-\\alpha y=1,\\\\\n", "\\alpha x-y=1.\n", "\\end{cases}\n", "$$\n", "Par la méthode de Gauss ($L_2 \\leftarrow L_2-\\alpha L_1 $) on obtient\n", "$$\n", "\\begin{cases}\n", "x-\\alpha y=1,\\\\\n", "(\\alpha^2-1)y= 1-\\alpha.\n", "\\end{cases}\n", "$$\n", "Comme $\\alpha^2-1=(\\alpha-1)(\\alpha+1)$ on conclut que\n", "- si $\\alpha=1$ (la dernière équation correspond à $0=0$) alors le système possède une infinité de solutions,\n", "- si $\\alpha=-1$ (la dernière équation correspond à $0=2$) alors le système ne possède aucune solution,\n", "- si $\\alpha\\not\\in\\{-1;1\\}$ alors le système possède une solution unique $x=\\frac{1}{\\alpha+1}$ et $y=-\\frac{1}{\\alpha+1}$.\n", "\n", "Que nous dit `sympy`?" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left\\{ x : \\frac{1}{\\alpha + 1}, \\ y : - \\frac{1}{\\alpha + 1}\\right\\}$" ], "text/plain": [ "⎧ 1 -1 ⎫\n", "⎨x: ─────, y: ─────⎬\n", "⎩ α + 1 α + 1⎭" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x,y,alpha=symbols('x,y,alpha')\n", "solve([x-alpha*y-1,alpha*x-y-1],[x,y])" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[ \\left\\{ x : \\frac{24}{5}, \\ y : - \\frac{6}{5}\\right\\}\\right]$" ], "text/plain": [ "[{x: 24/5, y: -6/5}]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr1 = 2*x + 3*y - 6\n", "expr2 = 3*x + 2*y - 12\n", "solnliste=solve((expr1, expr2), dict=True)\n", "solnliste\n", "# `(dict=True)` specifies that we want the result to be returned as a list of Python dictionaries." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAz0lEQVQoFXWS4Q2CMBCFhQkIbqAjqBvgBsoGOkf/GUbQFXQENjAyAhtA2AC/V3tGG2hyeXdfH71LSzKO48KWc64KeYeuiQrWiiVmBLyoL+hDG2iGiO3J2zTAM5qZKbAB1UdX1d6IHolGIFpP6kKnm7EA9JFJpZ8PLdIwy4TnD+U6MQ9IM82tb+s5g/GlTpyazQzWrdOM1lL3Fi9jn3tktyZWsYvaTqzteu7A7YRxA2vU1RtJboAePZiZXG1L4iT2+9ba0E8xEPopdoTe3r/YGx/SQ0OZAIYmAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 0$" ], "text/plain": [ "0" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soln = solnliste[0] # Le dictionnaire est dans une liste !\n", "expr1.subs(soln)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Algèbre linéaire" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On définit une matrice" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAzCAYAAAAqwX72AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACrUlEQVRoBe2b7VHDMAyGgWMADjZoN+Bjg7IBXYFuAD/bv7ABMAFXNqCMABvACMAIPG9JesVEcQwJTYN053Oixrb0RFbiut0cj8c7GwUymUzeC9SdU+Fnof9bePpIeQvKRecI2A5NA9/FYrpJxDxzMILczG77fz6BwyneDhUxLgUEtgt0hSpI7vOBwu6A41blnyZsKwXDgEpMN5RXyiGlR2mFNG1bDIwiYygSGHJGpahphWBPo7Z5jjFus4NxMAYBQ+0R42AMAobaI8bBGAQMtUeMgzEIGOqUiNnL+tg1+lqlunbbSpcE8pRXby0cJYPPamOK7oXje+rrTLeSqknbqoCZr5VW4nlkUMA0ZlvKVIqY2a2PHYxxPx2MgzEIGGqPGAdjEDDUHjEOxiBgqD1iHIxBwFBXWRL0aHuetdfekvaYznkdf8p0ra+wNXmzsBQMHQrKFfVx7j3H2vB/lI7S2v1ubPvVZmEsxwjCKIeimgEVPdrsylfdUrdOsPOdMqTI/ttUA2Ng9FXDM52L/rIoUnbQK6I6KTEwAvACAEVIkYTAiq5ZS10sx1jfd8z3sAG2Ngk49e7EIuZbf8AQFE2h/En17ZouKJLB4LSS7h2ALrsAwPKhdCqFjYBxhU45x5piYZMfnzOG8tcDJSWP6SlUy/SuDIYB9du0XerFO82Pva7QkHGU8A8qXNrIJZWmEkaeMHqfehEpHPdUGrGqBZ1GweC8ku0RdZhsBUvLg05K6VTKIkLJdsax8suyDNCtSwJe3pDTFI1KKRha31M0XZRfQqklyYWd1nnOjcuXLYOs38qbhaVg6Lhfp6F/3Rf2L3Ji6tjRHJPaYVeudzDGnXQwDsYgYKg9Ygww+VNJb7Ff1iScV3reG/2ujTr0G8PnHPKI0cvb8p+5/vMfuea+fwALf77wZijeQwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}1 & 1\\\\2 & -1\\end{matrix}\\right]$" ], "text/plain": [ "⎡1 1 ⎤\n", "⎢ ⎥\n", "⎣2 -1⎦" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M = Matrix(((1,1), (2,-1)))\n", "M" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAOCAYAAADaOrdAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA+klEQVQ4Ea2U2w2CQBBFwViAtEAJRjuwBGkBSjB+wS8laAvagdiB2Ip0gOeSgawmJMbdSSbz2Hguszsx7vs+8rWqqlIYhXFWRNU1/Ua92FcEkKACjiIR+Z7eBc/IrwsSX8sB5AYeWcMEFEc1Qog84XTmYmoS1ZMtp+zPBKC+OnF/7kx1Uj/EJC5fU+xo1HhBftah9ySCyACuCRLY4rrCBz6Y93aNIDci+LFdcVmWWsE7rviraTX1tbPG+YtDMRPvSeyaom9R6hsCur4sxMO3gFqgszcR4uE7RBpEFF3bWNGEEDm4ZOUI6uE1mda4834Tgw53r9wsJU5/kG9LAlkZChbCfAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle -3$" ], "text/plain": [ "-3" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "det(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On calcule les valeurs propres et vecteurs propres" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKQAAAA0CAYAAAAE05MCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFVElEQVR4Ae1d7VHcMBQ8MikgIR2QDiCpINBBSCoIdADDL/jHJB0QKkigg5AOEjoIHfDRAdn12XdC2LIwsvye/TQjZFvSabVvre87Vu7v72dTckdHR2eo78e2OiPdSlsai18ykIrXlcPDw1fLj11eoYC75d04rlCnHdYE4fdx1EhGLbrwijy1unuJKv2FX/OqRoPtes/GcLsNIrbGUBFhdejCK3uqTa8eFxQk3RYMdTG/rP9bKvoTYndxvVGfSu5TYN4DupMKIe75EpKQG3hev4c/xvNLhFkdymRroZLbrrwi34OGAffsvbYrQQYNgMTrSFCpubapDX6AjEi+dC4JXwHrCs+K7hshBfsb/nVOuCPgNimvsYJkq3EJ8lonAzmNGVtWKbZF61jmO/byv8E9W8usDtjUctsHr1GCzGqhxIWBNLbo/ls8K4XglsaXja2muQgG+uJ1FIIEOcV4EGHd7PkA/DYKDXnYVX+GP2nIH2GecSYZgtcX2qkEaRzbckWAgnowvi3v1xE2TtgQ9w15P8CzFaU4zYEBcDEIr2MQ5AXI2weHHIuxNXQdW0bGBR3y3yEB033FNSdwk3fgYRBe1QvSUQ4nKXsgsmgly3ANIYX6wDEO/hbeFR9FSfduHuj9i3ptwhebAAlqkZXX0QgSBjgH+VfwVSvZ2DoiLcXHGTXTV45dFJ//rB4oDvlS0j/b5eY1alIDUGuoGcdpNBpbHRr7GiHHX5Icu91T4PqBcBXho9bRAbuN6wOkuS6fcWF8A/cUZTaH8jRwm43XWEGyJWkdi2WzYkNBMO45PF8WLnAHd5OQjmINCbahlLSPgUM8tzl5HU2X7ciELw4H5G537ETbZUcGsvAa1UJ2rMAg2fg2o2B6cwkZyMVrqyABpPXAJNIEzw4ingNsdqNPGWjzBEmwS43B1sUmbfXp8pl1eWLwh7AgjtuhHNf7bpUPEM9xv++4Bczxc6NDfKvNGzMHIvC5QZ0wK89D/kPIEzyNi8eBMixKIAOwJbdBOfmUNulsZAtYi9M+YxxDNlbaIuQz0NplswpQL7vaan2PyxR0X/A86xLJvNj4vxpwa8DoM94n5ihBAhC31BbjEVxz7MKT5m99sMLuNeDWgNE3a2+YY7vsHYjQHTxzrY9jFHfrzQct4V4Dbg0YfVv2hjlWkGwd//ioFNxrwK0Bo2/q3jBHddloCf1zhgTE4//BZRm/FrnvNeDuCSPH9r2N73vCXMgjSpCukACG3TSXFYJbc24eCdcacKfCiM/JtoSXCnOlkdguu0iPwjnD5vgx+yGECnCXUANuDRh97vvAHN1CloXvIyy+uVfezxCK3jMucYrGrQFjgxiT8xolyJIwLvUQQDWz5jhS9AkgDbg1YGwQYy96iBIkAHHNkYvjDBcOZFKUkp0G3Bow+jbuDbPtZftU2/0gDKBxs73sQZi3QoMMPGmWHfwkizQGEjBggkxAon1EOgZiJzXpSoz8JIwpOJvnT7apWvOMrN5gyaTzKkqQIIsz+VP4G3h+P5oL8eaeyYAmXqUJkvuvxfF6kMifNanWPJ9pkmlnB5dqeLUx5LS1Kq72JkhxJpk2IBPktO0vrvYmSHEmmTYgE+S07S+u9iZIcSaZNiAT5LTtL672JkhxJpk2IBPktO0vrvaSBcn/G0O3Og/sbyIGRPMqauuQhGObiwcq6DbnwewMz/i9nV8I/a/jlkksaGNAC68SBRn8qbg24i2+ngEIUgWvkrvsembt6agZMEGO2rz6Kld12fzhKJ5FXDjc88iSOWOgFwZ8vaGQQn9VC8nv2N46nr9OYc4Y6JMBTl4fae4/ss5cuG2gNFwAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2} - \\frac{\\sqrt{3}}{2} & \\frac{1}{2} + \\frac{\\sqrt{3}}{2}\\\\1 & 1\\end{matrix}\\right]$" ], "text/plain": [ "⎡1 √3 1 √3⎤\n", "⎢─ - ── ─ + ──⎥\n", "⎢2 2 2 2 ⎥\n", "⎢ ⎥\n", "⎣ 1 1 ⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}- \\sqrt{3} & 0\\\\0 & \\sqrt{3}\\end{matrix}\\right]$" ], "text/plain": [ "⎡-√3 0 ⎤\n", "⎢ ⎥\n", "⎣ 0 √3⎦" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "P, D = M.diagonalize()\n", "display(P)\n", "display(D)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAzCAYAAAAqwX72AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACrUlEQVRoBe2b7VHDMAyGgWMADjZoN+Bjg7IBXYFuAD/bv7ABMAFXNqCMABvACMAIPG9JesVEcQwJTYN053Oixrb0RFbiut0cj8c7GwUymUzeC9SdU+Fnof9bePpIeQvKRecI2A5NA9/FYrpJxDxzMILczG77fz6BwyneDhUxLgUEtgt0hSpI7vOBwu6A41blnyZsKwXDgEpMN5RXyiGlR2mFNG1bDIwiYygSGHJGpahphWBPo7Z5jjFus4NxMAYBQ+0R42AMAobaI8bBGAQMtUeMgzEIGOqUiNnL+tg1+lqlunbbSpcE8pRXby0cJYPPamOK7oXje+rrTLeSqknbqoCZr5VW4nlkUMA0ZlvKVIqY2a2PHYxxPx2MgzEIGGqPGAdjEDDUHjEOxiBgqD1iHIxBwFBXWRL0aHuetdfekvaYznkdf8p0ra+wNXmzsBQMHQrKFfVx7j3H2vB/lI7S2v1ubPvVZmEsxwjCKIeimgEVPdrsylfdUrdOsPOdMqTI/ttUA2Ng9FXDM52L/rIoUnbQK6I6KTEwAvACAEVIkYTAiq5ZS10sx1jfd8z3sAG2Ngk49e7EIuZbf8AQFE2h/En17ZouKJLB4LSS7h2ALrsAwPKhdCqFjYBxhU45x5piYZMfnzOG8tcDJSWP6SlUy/SuDIYB9du0XerFO82Pva7QkHGU8A8qXNrIJZWmEkaeMHqfehEpHPdUGrGqBZ1GweC8ku0RdZhsBUvLg05K6VTKIkLJdsax8suyDNCtSwJe3pDTFI1KKRha31M0XZRfQqklyYWd1nnOjcuXLYOs38qbhaVg6Lhfp6F/3Rf2L3Ji6tjRHJPaYVeudzDGnXQwDsYgYKg9Ygww+VNJb7Ff1iScV3reG/2ujTr0G8PnHPKI0cvb8p+5/vMfuea+fwALf77wZijeQwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left[\\begin{matrix}1 & 1\\\\2 & -1\\end{matrix}\\right]$" ], "text/plain": [ "⎡1 1 ⎤\n", "⎢ ⎥\n", "⎣2 -1⎦" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(P*D*P**-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Polynôme caractéristique" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADQAAAATCAYAAADf0S5lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACCklEQVRIDc2W7VECMRCG7xwKAEvADlA7gA6gBKEExl/wz8EOsAWuA7ECxQ6kBKUDfJ/MJpM7RzhGhOxMZjebTfLu7ccl32632S6aTqdNrd+bTdv4nfSbXfvOtdaocfFM4EfeTvJc8krjyutS4hc1wAzlRDeym0luS9eJdMmIdRwiOm/JIN4DJN9XQ9X9igwR6osnmXJ1aij4ZGnWl+I6KE8sCAONydc0DYs5db4ESilCUmJAwfckrzHwZAfREAaSz9LhDF+1SfGBF4arqNYQxY/HnxqBzJmxOI5umJsu2JxIGOoemhROeHKR0cT9WqoO9bSwBrS3NuBEZi65w5A81ig57e3/mb/rfLDF+ILM3dUaIkIFCxGRgk0NeCA55vM46P5b0J1EoxXfI52PFh89yyeTCU4ADtDIbMLrVxk/iidLwgdeHKGungAamoJ5uhDPWUiZhJG0x5lbw/kgHelYSjnqxynNKFlm4B1WyaTcSpzuW8QR+tBCISUF/2fSOaTwiwa8LgHq4I+qPV+6gHtaDW6yy2nXz8yPQTqTOjzqD1hnuvejeNVpnmakYNe3bSaZDH1PRz7ky7L9FESnJb1+xeYdKtWPNpCXRCw1IuqUBTymG5ssXcppcqnhnjrmPS+B6v8oPuBc8o/6to9PxEY46pqCBKJBP+dNlGnuejpyaiRslMcgwgX28Dj9BkFAwssmco0EAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle t^{2} - 3$" ], "text/plain": [ " 2 \n", "t - 3" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('t')\n", "p=M.charpoly(t)\n", "factor(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calcul de limites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour calculer une limite, la syntaxe est `limit(function, variable, point)`.\n", "Par exemple, pour calculer $\\lim_{x\\to0}f(x)$ il suffit d’entrer `limit(f, x, 0)` (ou `f.limit(x,0)`):" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZElEQVQYGWP8//8/Aww0NDQYAdmrgdgYyP4AEmcBMgSA9GwgfgfEJkCsBMRwAFIAUhkKEgGyy4AUyBQ4YIKzcDBGFUACBj0chKHhJQQLN0ZQZAGDGBRBIOACxKC4OQfE94B4NwDm+hiAOyllRAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(cos(x),x,0)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAKCAYAAABWiWWfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABIklEQVQoFX2S4U3DQAyFEyaIYIOwAYwAI6R0A7oBVX8l/6qyQdgAygbtCKQjpBMgsUH4vstFojoFS6+2n1/t+O7yYRgyrWmaO9wjuAUd+Rs+MfgC8gncgw58wP3gs9xmJM/EC3AAN8BcW1A7jmEYWBFvwBp8gRIswTu6U1bXdQlam04gL0AHBlDJ68F+0vz18Dvz3ICuTrowONc5A71fvYFztcTgPaLrK36+kyoEAs/hIdb2+GRgrKk9EZc2m7Uoeo2C1axwLBT/Not/9oadXNF8uphYGh28F9HbrCdx58TgXW8LXLcH7YzWrz5OT6MlWSMM7wXvodvoQBzWxDvdp6P3/D6BZhzeZWgmg3iHU2gjm27hXO/C4F4glsBtrKsLjX8B1i+VmyjeP9EAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\infty$" ], "text/plain": [ "∞" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(x,x,oo)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAz0lEQVQoFXWS4Q2CMBCFhQkIbqAjqBvgBsoGOkf/GUbQFXQENjAyAhtA2AC/V3tGG2hyeXdfH71LSzKO48KWc64KeYeuiQrWiiVmBLyoL+hDG2iGiO3J2zTAM5qZKbAB1UdX1d6IHolGIFpP6kKnm7EA9JFJpZ8PLdIwy4TnD+U6MQ9IM82tb+s5g/GlTpyazQzWrdOM1lL3Fi9jn3tktyZWsYvaTqzteu7A7YRxA2vU1RtJboAePZiZXG1L4iT2+9ba0E8xEPopdoTe3r/YGx/SQ0OZAIYmAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 0$" ], "text/plain": [ "0" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(1/x,x,oo)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZElEQVQYGWP8//8/Aww0NDQYAdmrgdgYyP4AEmcBMgSA9GwgfgfEJkCsBMRwAFIAUhkKEgGyy4AUyBQ4YIKzcDBGFUACBj0chKHhJQQLN0ZQZAGDGBRBIOACxKC4OQfE94B4NwDm+hiAOyllRAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(x**x,x,0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut créer une limite sans l'évaluer avec `Limit` puis l'valuer avec `doit()`:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADwAAAArCAYAAAAkL+tRAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEBUlEQVRoBe2Z7VEbMRCGD4YCIOnA6YCPDkIHASoAOgjDP/5loANIB4EOoAM+OggdhNABeR4hXXS+w+PjfIA93pm1pJW0p1e7+lh54enpqZg1Ojo6WgXTObxG/jHHt5QXpjkPsGXG/xN+gNfhAVyjWQKsJbdECPjvJFq5Ros1yYwL5oBn3MDF3MJzC8/YDMxdesYMWoMzt3BtSqZT8DkO+9Pw8BdmKXjgSmnAIH2FvVvfwffwJXVnpMVIwDTyPuqFfABfUQ53VfIFeWW38AH5oEz5R6eRaxggd/AaIJylYRKws2j91NBIwBkKQ64KMRFXCFZI9ysVH7wwLuBGGIA1JJsq6gR4qpDGwb7qAQDLun7dEU3LzQx5vsn9ou4Y/gZLm7C75QnsLpoCdOXHyFwivdNrAbuJ+V7kLl0SZY8B5b9JPQNXyZ/YgFRAt6Qug/tMbtnJW4F7p64uXdvM4oidkK+AukgIyDsZ0hb53Jo3yJaRJYuHRn39dAU8alwCaaIEvKmud9mrXLrjqP507F/pjme0emd+D8CVAXctAHihjY4+XbrNON6s7SQAe70cJnfotvSaPm2/MVbwcIhWz03J3fUAFuSwfBfZIMo9ez1ubP8DVu4VVD1Bjiu6W3tOK3OHdme/QKb+3mhktNTbV99R8SRc+h2H3/7Tc8Dt52y6eswt3NVe7LJpR++qqpf+S0krA/U/VekLnMK6kKeu6YknNG74MUIq4DxAqDSjbg+BR5tPSJV2lJVvx3pDz7Hu3rGfeqUNOB2TO0FSFNe0uQguTUawnoGGcl4ATmPef9I9I9uQD3qNZyk6jYoMBY2ynETjYEPGAfmC1PPbR8Mb8mEspAmETUaRuoy17XcNq8eILd0bNGL57+EjFcmKzvClldAu8jLEexaN/qW9FwtfMs/hACTrsYfMC4eTK/sAKHhBC2yH1PpgVVKt/0A6rAfxf6LevgFQlDoGJy+9pmrEUB9cmg6pwvauwfAwh7x0J/J2aGNt9ejem3CaTAdSoVjvQ8Ip3PQIIGh1JR1ka6RH5PVOpMslfI+0fF4OgFN3KgRUWpvyAA6KSBvdNPXNU9q6RPzguH20soPT3X3yyUnr5mDyupDnO6VhYqV7gFfaGi3SWFB/Y80Oaa583AGXitVHYYO0qa/uWfESylpW1irrlH33WiZfxHSfdBiQ1Y1EW73B/uVSVE/U9Rw8UPCDvkOp2BlOQfoZdcEtkI1FUZcbSD5xZV/krjd3/wCK1A0yACJVdgin4EMd7iMvjiH20TPCQyBl825W5fIgb10wwMSDBxQ7my8OkMFMlPiWkyNIPcQJcq/ZRh4AkwaLkwaLTxwwH3tTAoheIUg9tKDs0eQk6Kluhi6j0r3/AcpuhjpcePAEAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\lim_{x \\to \\infty} \\frac{1}{x}$" ], "text/plain": [ " 1\n", "lim ─\n", "x─→∞x" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAz0lEQVQoFXWS4Q2CMBCFhQkIbqAjqBvgBsoGOkf/GUbQFXQENjAyAhtA2AC/V3tGG2hyeXdfH71LSzKO48KWc64KeYeuiQrWiiVmBLyoL+hDG2iGiO3J2zTAM5qZKbAB1UdX1d6IHolGIFpP6kKnm7EA9JFJpZ8PLdIwy4TnD+U6MQ9IM82tb+s5g/GlTpyazQzWrdOM1lL3Fi9jn3tktyZWsYvaTqzteu7A7YRxA2vU1RtJboAePZiZXG1L4iT2+9ba0E8xEPopdoTe3r/YGx/SQ0OZAIYmAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 0$" ], "text/plain": [ "0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lim=Limit(1/x,x,oo)\n", "display(lim)\n", "display(lim.doit())" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\lim_{x \\to \\infty} \\frac{1}{x}=0$" ], "text/plain": [ "" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "from IPython.display import display, Math\n", "Math( latex(lim) + '=' + latex(lim.doit()) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut aussi indiquer la direction (`dir=\"-\"` pour la gauche, `dir=\"+\"` pour la droite)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACMAAAAKCAYAAAA+euenAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABTUlEQVQ4Ea2U4U3DMBBGXcQAEWxQNoARgA1S2KBsQNVfyb8qbBA2oGWDwga0I4QJkLpBeC9NUVFdqVJy0pPtz/b57LtkUNd16MPyPL/Gzx1cwYrxa8wveoL+ADeugznahjYM+ggGZ2N8jWAJl+BYGzH3se2GQD+lP4UJfMEQHuGNuXUwmC5kWTaEct8H4wRWUEPqnC0s9tft+uiF/c4vw40K8Kb/DM10fIOtrzZFMzUHhm6KL87bTZ8M3HSq+fzrdvFPbBPzG7hlzrpYwH1snZq+YGwwFk804mObT9XbQ15Y/wxP8Fc/ER/JWUTsW/IL8xVTbx9zjm4hV30EU+HMnB8YuumZgemqoDyytnm1zgXMAYEDSpoJrSl3bP0ZyJK+aVLz9n76thb8O2j2m/9SL8HokcMKGg8yEIOaoe2KnOHW0Kwf/y2+pvOuawL7BXQ21qM1mzBoAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle -\\infty$" ], "text/plain": [ "-∞" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(1/x,x,0,dir=\"-\")" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAKCAYAAABWiWWfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABIklEQVQoFX2S4U3DQAyFEyaIYIOwAYwAI6R0A7oBVX8l/6qyQdgAygbtCKQjpBMgsUH4vstFojoFS6+2n1/t+O7yYRgyrWmaO9wjuAUd+Rs+MfgC8gncgw58wP3gs9xmJM/EC3AAN8BcW1A7jmEYWBFvwBp8gRIswTu6U1bXdQlam04gL0AHBlDJ68F+0vz18Dvz3ICuTrowONc5A71fvYFztcTgPaLrK36+kyoEAs/hIdb2+GRgrKk9EZc2m7Uoeo2C1axwLBT/Not/9oadXNF8uphYGh28F9HbrCdx58TgXW8LXLcH7YzWrz5OT6MlWSMM7wXvodvoQBzWxDvdp6P3/D6BZhzeZWgmg3iHU2gjm27hXO/C4F4glsBtrKsLjX8B1i+VmyjeP9EAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\infty$" ], "text/plain": [ "∞" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(1/x,x,0,dir=\"+\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Graphe d'une fonction $x\\mapsto f(x)$" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot(sin(x)/x);" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sympy.plotting import plot_parametric\n", "plot_parametric(cos(u), sin(u), (u, -5, 5));" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sympy.plotting import plot3d\n", "plot3d(x*y, (x, -5, 5), (y, -5, 5));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calcul de dérivées\n", "\n", "Pour calculer des dérivées, la syntaxe est `diff(f,x)` :" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADkAAAAVCAYAAAD8dkbIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADMUlEQVRYCc2X0VEbQQyGDUMBTqggpgNCKgA6IKYCoAMzebJfoQOSCjLQAUkFJHRgdxDjDsj3LavL3mE7g/EMpxmddrWS7pe0u2d3Hh8fO23j4XDYWxXTPN/NTstoNBoNgLT7Cli9HKMK0aokAXcEsm3kTYXwhQN8f+iCPA3XDbdFGwhQXXD8RH5cBx7i/CbOPnLWpk5eAOpqHQnmGMYyZqdNnXyg6u8ywLUI4j0Q6EMrOgkYz+JkLZnVgxizvxU6XuSZsL2z0CHv0FeXQGEzzjY7yGv06bCrY+zNeAAbx5jSMfplZ+0QmypG8ige+BonLpJPjE/gHnwMSzWcT6r0NOZhSpIgOnhQTxinpJACNYEJfA8L/ho+VIdMxPjWNfgSFswFUtAVMT+rJvMHe6iXnUdjphhIPzHfYBM7h+PsVc0oXmEzDmK7Ct5kSsPowiw7aXODTZVg1p8jBWERBLvHOHyzydIEtNF+GsalJJYdTBdI1ovH7f01z98jy/WsTsKYva0MSICX5Sp6E46uum6370obx9jZZYduSStrYC8Rt8otbGFqsdE1SaBRzObaL/zLwrrtfWeyR35uOhRz/bp2UvDSnycx9xk2i4DoZCEkQZiUPlZ4DJBlWxGTxYTvfWO1z/x7Q7domopnklElL5FFFDbdRQbo3e6pGEg7ugNvoPcsnTKOIswLYfeXxU4+xPCe0K46Vui6cjJ4/lA/3cRgxsBqeZ6eEetHsOva1S4UjVnzxZJn1kTiFlTnumdHUHPjawNZxNgtSeEDXxPwYot3WLAZ8yi6Zl+Yi20e2cmJnZTc1/6wbQJ0u8V22Wfcx6bZEW28WeMT4EutYEnOY73Ux9h3+GloksnJ0xxzWhqgc+3ZPVHYpPNb/eLJQQQsxXewdptiY7W9TaNyzq/QpwTyS+12eb63mduNhUmyZuH8XNWODHOLI6aEh7nF9Gb1HX7yTL7ausxrxJp+Z635L8n/wDG8u+r/yKaf/yuNqT62a60CbzSxY//70fASaOn7rUNrkmRreUF5L3gEXkU5hrHSD4bWJJmz8gJc+ZtaVMYY/3ZFcy+/9TyfpcGqOPAfGKP0/wtdFxjUk+2N/wAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\cos{\\left(x \\right)}$" ], "text/plain": [ "cos(x)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(sin(x),x)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAVCAYAAADRhGlyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEJ0lEQVRYCd2Y61EbMRCAD8YFeEgFMR0kUAHQAY8KgA6SyS/4Cx1AKshAB5AKCHQAHcRxB+T7ZEnRne+wZzLHGDQjr253b99a6Vw9Pz9X72GenJyM+vajTcdq9Q7G6enpF9z49AqujKKurGrFrIEcgfkasRvAsc/gHyJuaQE27mLcJjDZH2ztyyfkmqwJ8FJFK5Yl8ALEjggH6zOAjDusb8Ut48C2IXb9BH4u7eO5V5+Qf4++LeDELWywjhsGmM0J86rEL+Fa2y9a7OrbJ3WqozKA28xHomk2y2HlDWM2S/wyrfexL2ylhlG9+hR1qntoAA3UEw9WXNtoBraN59Vx2Gvve+pQ/Bo+qXt/gCF7HUaEUw1650ECzeBaymXw78BfJ5kFz2PErQOvwOfeylpdVo1yUsIOwNd6G7Ry2LOzjJLAewv7BK/6juL7m8BDpj30IOJq/kScQN07gwKRl9EhhdROtszAAh7pNtND1iFgQINgcKzoB6aBsY96GOVqYX0jjXnO1IEzYD7EeK54rvVlcY3hbaGt/zXYpo/I05Y2n9QddAE9OL8zDZq3kNTrckFMpYVfC2J7tUCUS52+RsB5iWys5TFQpfBUPZPIm+Tk4EW8idFwnTIQG6zTu5FlbnDk97q16Ei2ZJ/QaeWFwyAK0W5bQ+qraw16ZAtA3aOZCkSoUTcwXduggqbxOp+NYS3eYKZqTBm/k1YO+KxOUW5TM60xf4BuixvmvOTBUumcDs8dyO3y6Re0Mrm2DG0LcoGdMYDP98Ihkg3gBTOyBqxtp8zwb+FWcPyegtbfxPOSkwbZoeEmw3esCG8FC29P+DvHSz5Ba/b3fQT96BRWJ4QE5i2MMEt3HZijztpPlxSI8vWUNQ+ErpF4rNauYaUH+UArUf0rMNuTjlinALe9b9W+JLvi/YV9gtf+rbzcksB5jevSIX4cAgiThs58DoHTAA2tDfgnIMzeRo0QH6DvMqXLN1PN0DTWYV9SdzoFxVXQ7UE60ipfHoYJaktuICLjRZ+gGxwPs2SLSfMTLSVeOd941oe2sQbyaQCDRujILevmttkGV+tzhSQr9R66lZKabsXaLZjkbLH2U8tPRQOahjyewOo0SRp6ySyNHYJvvaZEIcrbjOsaQM5cn6Jeg2flq2tcCgEnbaZ/FzyhXw5A2LRVWKuCyFg6HVFTgAK330eePE0NWLrnGayQRaANWUUamYKjLp9TcMSbABMBCOMDv8otqyGSMrBXmfi2sYhP6levgarQdcy0IvXF69mYdd7O8jSG7x2Hf2MahDfziIMmbQ/Ymeg+nEGfRWCw11f7UPCKMm0F8y7cfZgT7rEKftMBpALcgl03hT4CV8XqU2fo+286gDFCHmbp0OolaA2h6spV/6Z7YHIsVoVXp64bQ2L9L4h8v5X9SsqH21/2375ZGBXxkAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 2 \\cos{\\left(2 x \\right)}$" ], "text/plain": [ "2⋅cos(2⋅x)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(sin(2*x),x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vérifions ce résultat :" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle (\\sin(2x))' =\\lim_{u \\to 0^+}\\left(\\frac{- \\sin{\\left(2 x \\right)} + \\sin{\\left(2 u + 2 x \\right)}}{u}\\right)=2 \\cos{\\left(2 x \\right)}$" ], "text/plain": [ "" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quo=(sin(2*(x+h))-sin(2*x))/h\n", "lim=Limit(quo,h,0)\n", "Math(\" (\\sin(2x))' =\" + latex(lim) +'='+ latex(lim.doit()) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dérivée partielle" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAASCAYAAAA6yNxSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACOklEQVRIDbWVP1JbMRCHnx0fgOEIpqUice/C3CDACYAjMOncZcgNMF06xpTpoHCTij83gBuE4QbO9ymSZt/DNBnezqy1+mm1+ml39TxYr9fNfD4fN01zhipf0Bf0DPxRoE/5RHAPv+Cww+l0+gtdrFarXbCfjL+ZP/dJYEjwc/Q0HgIZs/GKLiPehy2BGfrEoVudA26Zb4Gbod5EAh70zEHeeJN0iW3y+W9sYBNuEgg9gY8ZB2UdWzIneT5hPEbN0FHG7vC51g6+O0wfmC+yT1m7BDswA2+EhT1AA5eXUXzOWfuhAtyhl+iMuX6Ss5+KfMt+NwARd/0Q/aox8meD2HzXOUBaxvbmMZAlM4hZULbRtI6vF5Cgso/6rKOIWfq3BNh8AW5PHOgQ5B4sPsnPrD2CSaTp+Lu/fEO87Xd9gtj4CWuVgE3ecptRhi0JAQtu4KsyiSO+hZQHWZpYf7MjljJQCbDJdO4w1ptj24T2QkvASuDUcC6C+WQNHMVYNUt5wb2v+KYMjQSZyGrC2G06SS3ADWxf2IQy98NlkFgSm667X/LRh2nqiXR7JyM26WTwW2zrH2UGZtdLROb+P0im1VRgrpWmw6zi4TZnkuynb/3ymgGfiSTK+8asUhpJxtbRzQ2BTtEbVMIP6At2LYc+WcyI793X8Qf1m6DUDLz7Ifrn97G/mYhZ9QUlGRbjo0cPQ81OEmxLZ5ZbT7I3Ahxk38Rn6lfThm6VqrcScJAEbEBvbu2XYLX2zJP8Beym28A9KyaCAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 2 x y$" ], "text/plain": [ "2⋅x⋅y" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(x*y**2,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dérivée d'ordre $n$:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAOCAYAAAA45qw5AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB7UlEQVQ4EZ2UMVKCMRBGg3IAxyNoa6XSU+ANFE+g3kDGClq8AdjZOVLaaUGhFcoN9AjKDfC9+IchaCzYmWX/fPvtZrPZUJvP56HX6+2EEDqocoh+oh3wqUBJ8O/ju8BelDglfBOHmw4IbjebzQd0OB6P98BusS+sP0rB+J/xzeDclzglfANHH80qpghPP0OLCeFc4l9b3LiFvpNoayXLE+stcDuSCZgttjB1LXFjN/ggWSnJakFudAp/6Me6UifBSSHYUwX82YCxtsWDQkyE4VjsecVpYM9QO3daYRNP/EsIdFOJadIjB1xshi0OXCQyN3CuVdYT9AZtsTafRfX/3BiHQzWqAvlciE/n3xbj96QObBKv8BhNcdt89+vJmyyBttE7z66gSvhvi6scr3CXO3IAPgWzgICNebMTA1rtNvZIUhLWttgJX06Y3JmFk80EzjZ6l5FY1PznUgiwHQ3s4l75dkNFm731iP600JOkl7GI1U+8T/UR3eU7Fo31jkNsNQuHKdtUJxLvpgoyeSbgXwBP2Ng+rEmdD4dLvsWuDuMVvk6dH08j2QSrd9gCczJL4kbxBBXBE6r+z4v7n78QMH1Oeah1u913bGqp2LI4FA5HJmAWaIyJlBFqQifXiTZngOeTsmvOzBv6yVpu+AZy3MLdfgvCvAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 24 x$" ], "text/plain": [ "24⋅x" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(x**4,x,3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut créer un dérivée sans l'évaluer avec `Derivative` puis l'évaluer avec `doit()`:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{\\partial^{3}}{\\partial x^{3}} x^{4} y$" ], "text/plain": [ " 3 \n", " ∂ ⎛ 4 ⎞\n", "───⎝x ⋅y⎠\n", " 3 \n", "∂x " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACoAAAASCAYAAAAt6kybAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACrUlEQVRIDc2WMXKTMRBGleADZHyEpKUC0rtwbkCSE0BuQIbOHQM3iNPRMUlJFwoXUIXkBuQGBN/AvCckjfQHUWVsdmZnpW/3135arWRvrVarMJvNdkMIp6jyAr1HT8FvBXqC/xm+E+xJL+ax8CcsJMkzkh1NJpPP6HyxWDwF+4j9xvyulwz/V3xLYi56MY+Fb7PQe7SpCKSt7hLtEiDmDf61iUSn6A8S7wyyfmG+A27FGwHzyN2IuhaRqITuSN5LOtyAxI6JnztYl4xIeNhJZtUC/uZCMffIzzrfRJgYN/c6xexjX6GezHHCrom5dFzF7jG9YV4KkHzn2EMr+kBwSNKF80sQY8DFltjuBYuB9D0xH1Tm1+g5OmXuem7Ce5HlbYq7Aqhx/UfoSwd/JQruJbpMCxiXxaeo7DiDtcVvJeuEtpTJ8nfj7CfWgrgR5QD1WaxFzNYMoxp1zMceqz3btARzCfzzyP0e+U5sXfHnYLdgEg7Yel3z5Nayeu+MqcSLHrGmonwkmTHWnRRh7pH7AtQEir8eEJMTZ1gCn/KktsRm8hKyJXLVAz6rLdZWFIfHs4ctO2YsQUW7z3z4rsZeTrjVGfZ0JhAvjgsRY3JtJOkYMWepekT+PJveh7jxePRMTCiRJhFY7C1wKxl3lhaJBvyXODZuDisJN+NlMt4fkuHl8/IM81iI4WmV/sQXRnxkkIubcNiDUzBvbk8kFiuUAqyg6v8E8eZygOnLl4dhEUmO8yzFGVt+MUdMfBYkm989hkWG/RYdLOSG/EZxM25UAvaYapIA7itxhRp/g94zLm1gTBIr7Hvpa/ET9U1Vyilu+e/pf5NE2AL4YkTZzoNNWUmhVjsKY1vG022eqo0ThZAXtn6+/BWbQ7hpkY0fPYQk6kWykvbmBVjpTeZRfgOzog5Xj2YsvwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 24 x y$" ], "text/plain": [ "24⋅x⋅y" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deriv=Derivative(y*x**4,x,3)\n", "display(deriv)\n", "deriv.doit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calcul de primitives et intégrales\n", "\n", "Pour calculer une primitive on utilise la synatxe `integrate(f,x)`:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAVCAYAAADsFggUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADaElEQVRYCd2X7VEbMRCGDUMBTqggpoOEVAB0AKYCoIMw/LL/ZaADSAnQAaECEjoIHcS4A/I8QrrRffhIzHkyczuzJ2m1WmlfrVa6wfPz86DPPJlMRsv61zR2fdBjmk6nX3Dv4xtcHEUbhYneAoaj+3i5SXlTePuPFcZ+dwjlcRq6Zrj2jXBwiE93lJ+68A07P7GzQznva4Sd4+BlF2BFG9rS5qCvEfZENLyLznZSYO8JQx96F2E4Zu567ASlshFtjjfKsm5aLNocYgjPM4v3yIsEnOn8ijpblNfIQ6JVRt0bbhfWjjalQ+RtuWkPncJGGJF9GKudlMQ/Uz+CR/AhLJXW+SIKX23udQ4YC3Jyk+QR9QAQpU4LxiP8AAvENbynjDIQ9Vv74AtYx84pBaAg2idFo7myjbgtf2kz2KD02fENFqRTOOWqYmOzKdzY3VUcSYEQmHzSFB3zuAB1btApwIryU0odElAd36aexkaVVjDUUX+WlPMSW0ZWSN5R7no8wlex/Z4y74/iUGhztBEXdEejurBcuVo/YNxDVRht6exF3odc8FK02W8U3uc61rUJW/XYueMu0gTucbiFBblkG1mVdFogmugH4/NN8mg7Z9CnPGgaFGWOGwqYym05ocVGrUsgpN8vReM36SxyykGCKrmuM9gocOeNviv4tWOJap0YV93kMVpf65qNkrAR641dywvT7pnAF1HSGS5SQO6RDsBSGmlb8BpygTqmngBtMmFUttkOY7BhXlWvSB3IhnJQqH+UzzoFjMnmGHUXzT81on8ftl+9UjJXmT6dkMxxgpJuM2X2m2t0sNG+OpAbkqI4CPwwVjC8VNIcgj+nnTZQtTParq2JjLDHTgGLs5gH/GmtOuuRSkdih/oYnWqkqOMNmZ4FOuDO5mQ79efyVHcOnwtVEih5Fm3OcgVk9tXyaqYT8t1KXvpxQem2Se+s0q2IjlHgrZh21PYl8gBGdMAozPPhJm2jZCFg9LkJPmFKaYG2QLumsB7aboy50Tl8BglkcTxpl4g+x52sBLDSTP+hEZ1rvMmXWQ723Ew3amsVR3KZNXU9xkha6iZdsJDwPrSvl4ARCV4O5lEj400UbWgrPG57CVhEyMun7Rfpb4HURhGtvcxhCYkYHT5lXvs7SENKJeP81yxdVn8A2nkm2OycCy0AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle - \\cos{\\left(x \\right)}$" ], "text/plain": [ "-cos(x)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(sin(x),x)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{\\sqrt{\\pi} \\operatorname{erf}{\\left(x \\right)}}{2}$" ], "text/plain": [ "√π⋅erf(x)\n", "─────────\n", " 2 " ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(exp(-x**2), x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut créer une primitive sans l'évaluer avec `Integral` puis l'évaluer avec `doit()`:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\int \\sin{\\left(x \\right)}\\, dx$" ], "text/plain": [ "⌠ \n", "⎮ sin(x) dx\n", "⌡ " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAVCAYAAADsFggUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADaElEQVRYCd2X7VEbMRCGDUMBTqggpoOEVAB0AKYCoIMw/LL/ZaADSAnQAaECEjoIHcS4A/I8QrrRffhIzHkyczuzJ2m1WmlfrVa6wfPz86DPPJlMRsv61zR2fdBjmk6nX3Dv4xtcHEUbhYneAoaj+3i5SXlTePuPFcZ+dwjlcRq6Zrj2jXBwiE93lJ+68A07P7GzQznva4Sd4+BlF2BFG9rS5qCvEfZENLyLznZSYO8JQx96F2E4Zu567ASlshFtjjfKsm5aLNocYgjPM4v3yIsEnOn8ijpblNfIQ6JVRt0bbhfWjjalQ+RtuWkPncJGGJF9GKudlMQ/Uz+CR/AhLJXW+SIKX23udQ4YC3Jyk+QR9QAQpU4LxiP8AAvENbynjDIQ9Vv74AtYx84pBaAg2idFo7myjbgtf2kz2KD02fENFqRTOOWqYmOzKdzY3VUcSYEQmHzSFB3zuAB1btApwIryU0odElAd36aexkaVVjDUUX+WlPMSW0ZWSN5R7no8wlex/Z4y74/iUGhztBEXdEejurBcuVo/YNxDVRht6exF3odc8FK02W8U3uc61rUJW/XYueMu0gTucbiFBblkG1mVdFogmugH4/NN8mg7Z9CnPGgaFGWOGwqYym05ocVGrUsgpN8vReM36SxyykGCKrmuM9gocOeNviv4tWOJap0YV93kMVpf65qNkrAR641dywvT7pnAF1HSGS5SQO6RDsBSGmlb8BpygTqmngBtMmFUttkOY7BhXlWvSB3IhnJQqH+UzzoFjMnmGHUXzT81on8ftl+9UjJXmT6dkMxxgpJuM2X2m2t0sNG+OpAbkqI4CPwwVjC8VNIcgj+nnTZQtTParq2JjLDHTgGLs5gH/GmtOuuRSkdih/oYnWqkqOMNmZ4FOuDO5mQ79efyVHcOnwtVEih5Fm3OcgVk9tXyaqYT8t1KXvpxQem2Se+s0q2IjlHgrZh21PYl8gBGdMAozPPhJm2jZCFg9LkJPmFKaYG2QLumsB7aboy50Tl8BglkcTxpl4g+x52sBLDSTP+hEZ1rvMmXWQ723Ew3amsVR3KZNXU9xkha6iZdsJDwPrSvl4ARCV4O5lEj400UbWgrPG57CVhEyMun7Rfpb4HURhGtvcxhCYkYHT5lXvs7SENKJeP81yxdVn8A2nkm2OycCy0AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle - \\cos{\\left(x \\right)}$" ], "text/plain": [ "-cos(x)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primit=Integral(sin(x),x)\n", "display(primit)\n", "primit.doit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour calculer l'intégrale définie $\\int_a^b f(x) \\mathrm{d}x$ on utilise la syntaxe `integrate(f,(x,a,b))`" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZElEQVQYGWP8//8/Aww0NDQYAdmrgdgYyP4AEmcBMgSA9GwgfgfEJkCsBMRwAFIAUhkKEgGyy4AUyBQ4YIKzcDBGFUACBj0chKHhJQQLN0ZQZAGDGBRBIOACxKC4OQfE94B4NwDm+hiAOyllRAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(sin(x),(x,0,pi/2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut aussi calculer une intégrale impropre :" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAOCAYAAAASVl2WAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZElEQVQYGWP8//8/Aww0NDQYAdmrgdgYyP4AEmcBMgSA9GwgfgfEJkCsBMRwAFIAUhkKEgGyy4AUyBQ4YIKzcDBGFUACBj0chKHhJQQLN0ZQZAGDGBRBIOACxKC4OQfE94B4NwDm+hiAOyllRAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(exp(-x),(x,0,oo))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Développements en série\n", "\n", "Pour calculer un dévéloppement en série la syntaxe est `series(fonction,variable,point,ordre)` :" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 1 - \\frac{x^{2}}{2} + \\frac{x^{4}}{24} + O\\left(x^{5}\\right)$" ], "text/plain": [ " 2 4 \n", " x x ⎛ 5⎞\n", "1 - ── + ── + O⎝x ⎠\n", " 2 24 " ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "series(cos(x),x,0,5)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 1 + \\frac{x}{2} - \\frac{x^{2}}{8} + \\frac{x^{3}}{16} - \\frac{5 x^{4}}{128} + O\\left(x^{5}\\right)$" ], "text/plain": [ " 2 3 4 \n", " x x x 5⋅x ⎛ 5⎞\n", "1 + ─ - ── + ── - ──── + O⎝x ⎠\n", " 2 8 16 128 " ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "series(sqrt(1+x),x,0,5)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALkAAAAyCAYAAAAA2npHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJxElEQVR4Ae2c7XXUOhCGF04KCLkdQAcQKiB0AJcKgA7g8I9/OZcOgAoIdAC3Aj46IB0Q0kHu+ygeXXvXlmSv13bCzDlay9Lo69VoNPrw3ri4uFg5DUfg9evXn5X6pZ4/hufiKfsiILz3leaj3GP5z1Ppb6YiPS6NgMAF5I8u4GmcdhFbCfZL5f1dfgS+k1zIO6FJR1QCfqrnuzTnZaz47sr9lEt2SElezhMxZfYMgp7C5IabKyl42uMkqM8U81zPe+0cl6GVQL/X25ncodxduVsKT06v4nHqgYDw/Efst/V83JbMhbwNlUSYgLyt6O9y9+Q/TbA2osT7QgF0hgt5A5lxXoTvT/DVc2NmdXOlP8YsNI/7CHj/IjzFAAQwWxDyDXPQhbwHmgIQM+VAzzc9kjnrBAioTz6pGGZWZssGuZA34Mi+AODGdJhN5QxTIYA2fyaBx6SM5EIeoUh7BBw2NVPhcZrTY+dCQH30RWWz49LQ5i7k5T3yXKyfBKTvjJRjNgcnSuiR+ina5i7kBd0gwNj6Ywp0LV6A18wsaHOI9VMgF3JDIv18pehzCbsf3adxmj22mmkRdGbeQC7khkT6eaRo0xBpTo9dAgJct+BwiNl35UKe6ZLKVMG+Y3/c6WogcFJVE+XkQl7QZwEo8W2ryf+qyjooKNNZtkCgMlnYIHhINntb5PWnJAUo7PHiI/w6MErH1AnZYOHWInl91tP33AM0O/n5plzZMPhfyAU49osZ60zPvHNMuq0GUzbTk+pNG1hh35FjVEO0qa9wcbEKwAaR6tF6aWhQZp6oDwJsEgTFEi5oVQKBQJuQr+R/JCa7lM6R6ZUh1Z3DABr4VP7GjojebVGSvEFIY8XLQPkt907+iA1xTstGQP2Fgnsr99AWngRwHIpgG5kGZ/ts56Syj6qKDS5L6ffluCHI3W1uCTYEnIwVhmZl5d04FSOuhdD8EDfcnK4WAjb73jUhRxiY0m1aRxiif6K2oTVx29C/SoyghwVHIiMGMMf0OTIhH2SP5zK/ivHC9oWc4bLkJlif3QkLT1WaTr9Vr7HCTKuj8hdPqi+amYVGTsBpSwBAadD4G9oehopsJ8QAs/A/+QkWXIQaZL6BudJiSrJW4tO11sW3wlF4f8thVjI7nyisWPHCK6dkq4Mg5PjqpEgqgdDw9UujEnqncDsyvS//UzlG9hM56Kt4JrXhVR7lo5l/yG9mFnXpIpsxTIhzfMXgdmXUN1ztwET6omenMClu8r5QmdzfKTH1NpqsdMgN5iJnDmDKOpC8+Bg59pv8KFjMZAYTe9707yuFf5BLKSWxbdB+Q8iVgY0yhJfMzK6pp4wLVPEjWHzehWDzxTpan0pPKuQqzwThg/wlxCCGchra9rbPLtmn+RWOCC8de5gpca6+oK/ZpSqZNUMTxEt7WCfFNPIfKwwTk7wQdAYQAv5Ez/rGALKIAkO2+gg5A+ngpn4iKRMyeiPHaENgmE7MbFnJz0ikICMyId60PZqxHm98u35aHbODS20wASrZ+4Z3clIdwZXP5Ood3ajHnH2hssEZwcSVYoRVYMootEXvtPOBHE/OD+hHNDby10ZoclNQbfHrYSinpiavcygzu1ZK4fZd4jf569qPTmBgUMmVnl2Vi1mLB23fVtFgOii+AUSVkDJSeaMlVuKp161KuvEwU8sG5gZDLcDqFNpXC096VY9ef2Yj/hvrGSosV+Yu+2K9Ol3v4P5bdX0oF82NDuZfbeG0Uw5Bx+5mezdq+nV+8SEH1n/r0V3vlza5EmKmrMhkjRNzBYHEIfTr8SwMmHKKSXm0CTFlM4rZ2hvyaRnCHQQ9VRHlva94bD2Axd7bCSnvDaEduyCVsbO+KKmrykcmmLUxXXICnsyStsjR75i/yEcqP/qwF5m5wijK/klLPeeqkRQYTQSF7ePqfBP5Q4cXlM36gfqhOUroDKaCfEvy2hmP6ofATdYXKg+liIA/kD8lkH3aTBvoRz54aNXWCkeRlczW9XLPTMjPFWrmSZ3hsHphlY8AY4NRGYgRh0asF4o9RV5Tk80mzCytpHrRKcwWTK3rWrA1jQKtLcFs6WKaOlz1n7svUBbZv2dbw4U/YgoWw1r4SuGYKfQhygd5etvBm9PyStog+u3chJypm22dSCoEgUA7sGCgsxFu3JneCQ9aTs9ACiPua/U66UNlI7S0gd2GBpDUVY62Ub878vfRPGZH0t7JqKrzhZ7MsG00W1+oTsjF+nqgrY6NMKVjxkeWIpb45eibsO0sP3KGTY6gY1mEgyc9MWNZy/EPZPD0odM9uJWQuxlHcmRkxNRQX1AgHCzWAJg0VBjNTho6A+GPpgs8U5LKZleIOjKbMAABwwBF+PsIt1W9L6CWbqun6mozJH3QRnP2xX1VqC4nbfVrDVO7kBn6gnbRN+CLTR9nVvkRcJQR9vkTOWZg4o8V1le+KONsMf+gpQagIYYuPJV0fKrqFFb88g8ZJFtVSmU+kyvZBdqqnOuYWLgh4Fyue3NzQQ1kVOOWRLbe6NKou64rHeU0DAHrs1/BXBmWx7ip5tCUuRaoTmxtwdZ5KJPLY2h8pYmWNuiHNmeOdCbkp0vS5HMAUVIm2vywhHFkHjdVtgPUhPyHC3keSBY9BlieeyQOafIhh2IjlX4tsmGBvBKOl7sr16JJu2sEW1zhH5kEWC/zQfzY1HawAehP5Rgw7BpAYevs0uu/IyPALmDYLHBNnkf2W8UStk7z7A0OtsvY2kQrc4bwXo6tWvb0GQBsjzmNjIDwRZGALwrK/5ICEFIkwDBX0OCmfVPsMU7p0OB1ISYPtkltS5DTuHq8Xp1GQsAUUthX3xsp0+uezYka2HlloKPx66eCvW9sduTrwXkEwqmpFE3YAnZzJQ8YHBwIcQRtGiKbqpoB6nwMkg/1APfvDAFmzHgq60JegLMElgUMWiF1p70zp2pwYCPGY2mFMWgIcxoRAWFqC30zC90m74Ev9jN711nBrAR4qTc2ezT5SrKyqG/cqHVNXtiPElw0A4vHVwVJMGtwi7uxWVD3K8uiPgJzdlYQ9Egu5BGKIg/gcf0zp83rtwTR/tyD5t+8uCfNdIqpEk2XopKdqQQB0+J25yikWcwtxJIWLIFHwsm1Yj4iaWiLJdTtT66D+gMtzr64fY8c4XBNHqEo9nBqiXZmWnRaDgLsprR+reRC3rOTJNzhAr+SxS2qnlk4+8gIqE/YFODGaKsJ6EI+AHCByTE9X+/4ieUA/MZMoj4Ii3w9O7d3XcgHIl6Byj0UDh6cZkBA2PM9L4om+e8LLuRbdI5A5qie7xYbH09vkaUnLURAmLPDxYU3/haDrd1O+g8OH6UWoK3NXAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 3 x + O\\left(\\frac{1}{x}; x\\rightarrow \\infty\\right)$" ], "text/plain": [ " ⎛1 ⎞\n", "3⋅x + O⎜─; x → ∞⎟\n", " ⎝x ⎠" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "series(2*x+sqrt(x**2-1),x,oo,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Interpolation\n", "Pour calculer le polynôme d'interpolation d'une liste de point on utilise la commande `interpolate(liste,variable)` :" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle - \\frac{a y_{b}}{- a + b} - \\frac{b y_{a}}{a - b} + \\frac{x y_{a}}{a - b} + \\frac{x y_{b}}{- a + b}$" ], "text/plain": [ " a⋅y_b b⋅yₐ x⋅yₐ x⋅y_b \n", "- ────── - ───── + ───── + ──────\n", " -a + b a - b a - b -a + b" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('a,y_a,b,y_b,x')\n", "pts=[(a,y_a),(b,y_b)]\n", "interpolate(pts,x)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAuCAYAAAAYyOqiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFVklEQVR4Ae2c61EbMRSFTYYCgHRgOoDQAXQQkgqADsLwj38Z6ABSQQIdABXw6ABKYNwBOZ/Yu7Mr7IwfUrSS987IeuyurHv2SPfqYa+8vb0Nui6np6drauNJ1c5hFR+ofNT1tpfUvtVMlDkTMY6srUpfKP2osGllfRwfgU/xvyLINxyKILuNms6UHqpsq1HWJyMjkAtZGFUeImOxUPXjiKuyNQUzmwvV34WHg5uhChwzGfgagIUZuZ1XYT176T1L/S8qf/LKU2bv1B70tTaRRrbfo/w/g5KlAutYsZFloPRXwXSjeF/helHIVAemhzq79hJeK91o34sCuv5Ue4txwoOSReAcEgQQ5DBi2IjCbMbKlJxdVKcbpfTkdgdfwpPatD+7Vvk8EZosDMH0pLo38VIVFkZEdUAURq09KqvyxPTiXv4DAkHJohfHKLLebLfKMBkI0925RHVAFJ6HLDYDwtQdz1Vh/9BcCAQli98CvdhdlTHNPVK65aQqjwOI2UJ2FA4UIMV3BeRe95jZYk2F+4lr0fXaN6oLEybUHvShnZ8V0AWfxRxeZd2IOIve7pmufEQhiwCi90MUSABYDwq+1Attuv+HLv5SgCCMHowikMyRRfnWaKXyLgok+KO2jmicYsjyrHhPwfw2Lk2tNzd3SWKRBYK4HiWgMEOPiuvZkNL0QMhgAsDcx+iCbCg0r7vCLn9IJ+dLWRuVZ2oPSSC+W2nOXe9PplysWAAxOkCGK6XpfciD0k3HlGkwswnrlRCrZbbcU/l9oCMrzYwySNZ6ByWLQNkivOPS+jQzhGka6J6WHVfRN4XfXMtRpA9LBS1/ytPDdZLc9Q5KFgEEYJgcG0E8zD5mdS8E4n7nn3AHz89SB88kli/6/nE6Y07Rx+8clGWnd2ifZSRsbgUEcVMAE+EaoF4p2BYAMxrWYppm6UT5nKbFlxPaCyGcc1uC3qFHFl7wjUItAgnHFYIwfYZEAEh4rQB8VboWlXHtvi7II3GhdrfWkZRnhofYqm72eq+EPvxUvWwDCLBw7mwUGeg6xGGm86xA/lwBQjGbwIxBotokKZ+FqM3oaaMh5odOwDIAHWSgOHu9g5MFYHrJHwGRm4kK7kK9D7eav1q9BqEQqEY/FkcZFfEzGS1rWWqyCBz8CNZBSljTcS91EZ30LCbTuRBK43O1lkFCO7iuwRl94EcQSpJoOi07WUoiSXRderJEh7icL+jJUs67jK5JT5boEJfzBavyenGI7hRmcfTYFW7tdyif9KeN+v6VSa9F11hdZebji+3djDtENdWZ2ph6p9LJB8nyS70op5fByjFT53MDJPc4lE6qh6kzK+3rSo/ApTdDoNDLVAj0ZJkKpv4mEOjJ0vNgEgIcOkecX0diqZf7AaCXNgLyT9g8RGxCwHFYzhrdJCOLGjBUA2xLn00r29JvzbJUnq3kqKPa3Dxe0sI+CVkqEDkwVJ+IVxrPmyOZ/k8nWg0OnMHLd55+4HoH0oPOkELHaDql8lkgRmttQ+AyyqCoDYNKxhV9J8c8Y+04J9Expk6pyII95AdYax4dOK9ayn+aFKdjKrJACn6ENckE+CTyOJVFtjgdO7WCK/JwLpcV1YlL91nQ5B+NzFnHVCPLBzgFIqeyhgo2Q/pwT+4FuevYGbKICDi21wK0mH2aMeTOWsdOmCERhF1hzE89lR4DdNZFJeiYfGQRiPyjwkbhRClCx6RkEUE4IrCpuF41VJoRBt+lCClJx2RkEYg4tDuKfYcWArH0n72UpmMSn0UgMnLwm2j3o3GPFbu6nv3frJeoY5K9oYooEAZb7kspG4l0hqJ0/Aujbzjv10TJrQAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle - \\frac{3 x^{2}}{2} + \\frac{5 x}{2} + 1$" ], "text/plain": [ " 2 \n", " 3⋅x 5⋅x \n", "- ──── + ─── + 1\n", " 2 2 " ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pts=[(0,1),(1,2),(2,0)]\n", "interpolate(pts,x)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle y_{b} \\left(1 - \\frac{x^{2}}{a^{2}}\\right)$" ], "text/plain": [ " ⎛ 2⎞\n", " ⎜ x ⎟\n", "y_b⋅⎜1 - ──⎟\n", " ⎜ 2⎟\n", " ⎝ a ⎠" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pts=[(-a,0),(0,y_b),(a,0)]\n", "interpolate(pts,x).collect(y_b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Références\n", "\n", "- [Numerical Python, A Practical Techniques Approach for Industry](http://jrjohansson.github.io/numericalpython.html)\n", "- [IPython Interactive Computing and Visualization Cookbook, Second Edition (2018)](https://ipython-books.github.io/), by Cyrille Rossant, contains over 100 hands-on recipes on high-performance numerical computing and data science in the Jupyter Notebook.\n", "- [Python Data Science Handbook: full text in Jupyter Notebooks](https://jakevdp.github.io/PythonDataScienceHandbook/)" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" }, "toc": { "base_numbering": 1, "nav_menu": { "height": "171px", "width": "166px" }, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "308px" }, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }