{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "In lecture 22 of mcs 320, we consider symbolic, numeric, and implicit differentiation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Symbolic Differentiation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider an expression ``f`` which depends on ``x``." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sin(2*pi*x)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = sin(2*pi*x)\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us compute the value of the derivative of ``f`` at ``x = 1``." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2*pi*cos(2*pi*x)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1 = diff(f, x)\n", "f1" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2*pi" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1(x = 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compute the 5-th derivative as follows:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32*pi^5*cos(2*pi*x)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(f, x, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or via the method ``diff`` applied to the expression ``f``." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32*pi^5*cos(2*pi*x)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.diff(x, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With functions in several variables, we can compute the derivatives all at once. Consider a random polynomial with rational coefficients in the variables ``x`` and ``y``." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x^4*y - 2*y^5 + 4*x^4 - 1/3*x^3*y - 1/7*x^2*y + 3/16*x - 1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P. = QQ[]\n", "q = P.random_element(degree=5, terms=8)\n", "q" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(x, y) |--> x^4*y - 2*y^5 + 4*x^4 - 1/3*x^3*y - 1/7*x^2*y + 3/16*x - 1" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(x,y) = SR(q).subs({x: x, y: y})\n", "f" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(x, y) |--> (4*x^3*y + 16*x^3 - x^2*y - 2/7*x*y + 3/16, x^4 - 10*y^4 - 1/3*x^3 - 1/7*x^2)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = f.diff()\n", "g" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Observe that ``g`` is a function which returns a tuple. The ``g`` is the *gradient* of ``f``." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(x, y) |--> 12*x^2*y + 48*x^2 - 2*x*y - 2/7*y (x, y) |--> 4*x^3 - x^2 - 2/7*x]\n", "[ (x, y) |--> 4*x^3 - x^2 - 2/7*x (x, y) |--> -40*y^3]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = g.diff()\n", "h" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(h)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Observe that ``h`` is a matrix. The matrix of all partial derivatives of a function in several variables is called the *Hessian* of the function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Numeric Differentiation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numeric differentiation is available as ``derivative`` of ``scipy.misc``." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from scipy.misc import derivative as numdiff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us apply this to the problem of computing the derivative of ``sin(2*pi*x)`` at ``x = 1``." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this to work properly, we have to use the ``sin`` and ``pi`` of ``numpy``." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import numpy" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "nf = lambda x: numpy.sin(2*numpy.pi*x)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.279051952931303" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numdiff(nf, 1.0, dx=1.0e-2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The value for ``dx`` defines the step size $h$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can improve on the numerical value by decreasing the step size and taking more points, specifying the value for ``order``." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.283185307180939" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numdiff(nf, 1.0, dx=1.0e-4, order=5)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.283185307179586" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2*numpy.pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. Implicit Differentiation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Take a random point on the unit circle and compute the slope of the tangent line." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x^2 + y^2 - 1" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x, y = var('x, y')\n", "circle = x^2 + y^2 - 1\n", "circle" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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ZLz393jv2wHdQteSVO+8Y/9xP/nEupW++CL88592TlwkExx1FEyebDM6L1sGhx1ms3ynZviW9EtMyEh0vLdPiQMGwI8/2iSWEyfCEUeErkxkYy1awPvvw1ln2Wv32mtt+YiCciejlygpZGST1q61cS5//rN1VT7xRJtXqnXr0JWJlK9OHbj3XpuWpk4da3X37GmzPUt6KWSkXEuX2qSWDz5ogylvvRUefhjq1QtdmUjFnHyytWp22MGW9u7Wza4hSvooZKRM335rn/zeew/q14eXX7auoeo9JnHTrZstiNali31w6t8fnngidFXZQyEjG5kwwSa3/OYbO789bpxNyS8SVzvuaC2aY46xU8B/+IPNUqHpaKKnkJHfeO016NfP1mBP9STr0CF0VSJbbqutbMmJCy6wry+9FM4/Xz3PoqaQkV899hgMHAi//AK/+52dKmvWLHRVItUnJ8cGa952m319551w0kk2JZJEQyEjAIwYYT3H1q+3haFeesmmihFJogsugEcftQk3H3/cTqOtXh26qmRSyAj//KeNKQA491zrQVarVtiaRKI2eLB1ba5b1zq2HH64LbAn1Ushk+WGDbOp0wEuu8xOH2jtF8kWhxwCr79urfa33rKvf/45dFXJoreTLHbjjXD55Xb7+uvta3VRlmzTpw+MHQt5ebaCq4KmeilkstRNN8EVV9jtG26AK68MW49ISD16FAfNhx/akgE6dVY9EhMymoW54u6807pvggVMqjUjks26drWgyc21Fs3RR6szQHVITMhoFuaKGTnS5iEDuOoqBYxISV272jWarbe2wDn+eHVv3lKJCRnZvOeft/XQwdaBueaaoOWIZKSePa0Lf2pizaFDNWBzSyhkssT778P//Z/9ZxkyxCa71EV+kbL162ezA9SoYV36L7kkdEXxpZDJAl99ZSP516yBI4+E++5TwIhszhFH2AzkYB/K7rgjbD1xpZBJuAULrKdMfj7su6/NPluzZuiqROLh5JPhH/+w2xdcAM89F7aeOFLIJNjKlfZpbM4caNMGRo/WWjAilfXXvxavsjl4MHz6aeiK4kUhk1AbNsAf/2jLJDduDK++CttuG7oqkfhxzrr9H3qodWkeOBDmzQtdVXwoZBLq2mutaV+7tvUq22WX0BWJxFfNmnaquUMHWLjQrm3+8kvoquJBIZNAzz4L111nt//9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\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotcircle = implicit_plot(circle, (x, -1.2, 1.2), (y, -1.2, 1.2), aspect_ratio=1)\n", "show(plotcircle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A random point on the unit circle is defined by $(\\cos(t), \\sin(t))$ for $t$ a random angle in $[-\\pi, \\pi[$." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.85589892691278" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle = RR(pi)*RR.random_element()\n", "angle" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.281255911213967, -0.959632800818730)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a, b) = (cos(angle), sin(angle))\n", "(a, b)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 2 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotpoint = point((a, b), size='50', color='red')\n", "show(plotcircle + plotpoint)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we want to compute the tangent line through the point on the circle. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To apply implicit differentiation, we must declare ``y(x)``, that is ``y`` as a function of ``x``. For this function, we introduce a new variable ``Y``." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Y(x) has type \n" ] } ], "source": [ "Y = function('Y')(x)\n", "print(Y, 'has type', type(Y))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "diff(Y(x), x)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dy = diff(Y, x)\n", "dy" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x^2 + Y(x)^2 - 1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ycircle = circle(y=Y)\n", "Ycircle" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2*Y(x)*diff(Y(x), x) + 2*x" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc = diff(Ycircle, x)\n", "dc" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[diff(Y(x), x) == -x/Y(x)]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol = solve(dc, dy)\n", "sol" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-x/Y(x)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solrhs = sol[0].rhs()\n", "solrhs" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.293087013047082" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "slope = solrhs.subs({x: a}).subs({Y(x=a): b})\n", "slope" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.293087013047082*x + y + 1.04206525573827" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tangent = y - b - slope*(x - a)\n", "tangent" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 3 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotline = implicit_plot(tangent, (x, -1.2, 1.2), (y, -1.2, 1.2), color='green')\n", "show(plotcircle+plotpoint+plotline)" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 10.3", "language": "sage", "name": "sagemath" }, "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.10.6" } }, "nbformat": 4, "nbformat_minor": 4 }