In this lab sheet we will see how to carry out basic aspects of Calculus (limits, differentiation and integration) with Python.

Building blocks

  1. TICKABLE Calculating limits.

    A video describing the concept.

    A video demo.

    It is possible to calculate limits easily with SymPy. Let us consider the following function as a running example:

    First let us define this function in Python as a function:

    >>> import sympy as sym
    >>> def f(x):
    ...     return 1 / x
    >>> f(2)
    0.5
    
    

    We can now pass it symbolic variable:

    >>> x  = sym.symbols('x')
    >>> f(x)
    1/x
    
    

    We can compute the limits at \(\pm\infty\):

    >>> sym.limit(f(x), x, sym.oo)
    0
    >>> sym.limit(f(x), x, -sym.oo)
    0
    >>> sym.limit(f(x), x, +sym.oo)
    0
    
    

    We can also compute the limit at \(0\) however we must be careful here (you will recall from basic calculus that the limit depends on the direction):

    >>> sym.limit(f(x), x, 0)  # The default direction of approach is positive.
    oo
    >>> sym.limit(f(x), x, 0, dir="+")
    oo
    >>> sym.limit(f(x), x, 0, dir="-")
    -oo
    
    

    Experiment with caculating the limit of different functions.

  2. TICKABLE Differentiation.

    A video describing the concept.

    A video demo.

    We can use SymPy to carry out differentiation:

    >>> sym.diff(f(x), x)
    -1/x**2
    >>> sym.diff(sym.cos(x), x)
    -sin(x)
    
    

    We can carry out various orders of differentiation. These all give the second order derivative of \(\cos(x)\):

    >>> sym.diff(sym.diff(sym.cos(x), x), x)
    -cos(x)
    >>> sym.diff(sym.cos(x), x, x)
    -cos(x)
    >>> sym.diff(sym.cos(x), x, 2)
    -cos(x)
    
    

    SymPy can handle differentiation of functions with multiple variables (you will learn more about this in further Calculus):

    >>> y = sym.symbols('y')
    >>> sym.diff(sym.cos(x) * sym.sin(y), x)  # Differentiating with respect to x
    -sin(x)*sin(y)
    >>> sym.diff(sym.cos(x) * sym.sin(y), y)  # Differentiating with respect to y
    cos(x)*cos(y)
    
    

    Finally it is also possible for SymPy to differentiate hypothetical functions (ones that we do not know anything about):

    >>> g = sym.Function('g')  # We create g as a generic function
    >>> sym.diff(g(x), x, 2)
    Derivative(g(x), x, x)
    
    

    Try and experiment with differentiating more complicated functions.

  3. TICKABLE Integration.

    A video describing the concept.

    A video demo.

    As well as differentiation it is possible to carry out integration.

    We can do both definite and indefinite integrals:

    >>> sym.integrate(f(x), x)  # An indefinite integral
    log(x)
    >>> sym.integrate(f(x), (x, sym.exp(1), sym.exp(5)))  # A definite integral
    4
    
    

    We can use this to verify the fundamental theorem of calculus for the specific example of our function \(f\):

    >>> sym.integrate(sym.diff(f(x), x), x)
    1/x
    
    

    We can also verify this for generic functions:

    >>> g = sym.Function('g')
    >>> sym.integrate(sym.diff(g(x), x), x) == g(x)
    True
    >>> sym.diff(sym.integrate(g(x), x), x) == g(x)
    True
    
    

    Experiment with integrating other functions.

  4. TICKABLE Plotting. It is possible to use SymPy to create plots.

    A video describing the concept.

    A video demo.

    To view these in jupyter we need to run this line:

    %matplotlib inline
    

    We can then create plots using the plot command:

    >>> sym.plot(f(x), (x, -1, 1))
    <...
    
    

    That’s not very clear, let us modify the limits on the y axis.

    >>> sym.plot(f(x), (x, -1, 1), ylim=(-10, 10))
    <...
    
    

    We can also choose to modify the labels on the axes:

    >>> sym.plot(f(x), (x, -1, 1), ylim=(-10, 10), xlabel=None, ylabel="$1/x$")
    <...
    
    

    Finally we can also combine various plots of different functions together. To do this we build each plot separately (telling Python not to show them) and then combine them:

    >>> p1 = sym.plot(f(x), (x, -1, 1), show=False)
    >>> p2 = sym.plot(x, (x, -1, 1), show=False, line_color="red")
    >>> p1.extend(p2)
    >>> p1.ylim = (-10, 10)
    >>> p1.xlabel = None  # Try using strings here
    >>> p1.ylabel = None
    >>> p1.show()
    
    

    It is also possible to save a file of the graph. Depending on how you name the file the type of tile will be different:

    >>> p1.save("my_plot.pdf")  # Try `.png` etc...
    
    

    Attempt to create plots of other functions.

  5. TICKABLE: Worked example

    A video describing the concept.

    A video demo.

    We are going to use the above to attempt to find and classify all points of inflection for the following quartic function:

    First let us take a look at the function:

    >>> def f(x):
    ...     return  -x ** 4 + 9 * x ** 2 + 4 * x - 12
    >>> sym.plot(f(x), (x, -20, 20) , ylim=(-20, 20))
    <...
    
    

    Let us find the roots of the functions:

    >>> sym.solveset(f(x), x)
    {-2, 1, 3}
    
    

    We have a quatric so one of those roots (of which there are only 3) must be repeated, let us see if we can factor our function:

    >>> f(x).factor()
    -(x - 3)*(x - 1)*(x + 2)**2
    
    

    We see that (-2) is a repeated root.

    Let us confirm the limiting behaviour of our function:

    >>> sym.limit(f(x), x, sym.oo)
    -oo
    >>> sym.limit(f(x), x, -sym.oo)
    -oo
    
    

    Finally, we also see that there are 3 points of inflection so let us find them:

    >>> poi = sym.solveset(sym.diff(f(x), x), x)
    >>> poi
    {-2, 1 + sqrt(6)/2, -sqrt(6)/2 + 1}
    
    

    Let us now evaluate which of these gives a positive or negative value of the second derivative:

    >>> for point in list(poi):  # We convert the poi to a list
    ...     print(point, (sym.diff(f(x), x, 2).subs({x: point})) > 0)
    -2 False
    1 + sqrt(6)/2 False
    -sqrt(6)/2 + 1 True
    
    

    We see that 2 points of inflection give negative second derivative (so they are local maxima), whereas \(-\sqrt{6}/2+1\) is a local minimum. This confirms the plot.

    Further work

    These questions aim to push a bit further.

  6. Consider the function below:

    Identify the roots and limits (at \(\pm\infty\)) of the function and confirm this with a plot.

  7. For the function of question 6, identify and classify all points of inflection.

  8. There are various algebraic relationships on limits:

    Confirm these for the following particular examples:

  9. The point of this question is to investigate the definition of a derivative:

    1. Consider \(f(x) = x^3 + 3x - 20\);
    2. Compute \(\frac{f(x+h)-f(x)}{h}\);
    3. Compute the above limit as \(h\to 0\) and verify that this is the derivative of \(f\).

Solutions

Solutions available.