{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## How not to feel bored – 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Библиотека для символьных вычислений `sympy`\n", "\n", "### Основы `sympy`\n", "\n", "Прежде, чем содержательно обсуждать логику работы и функционал библиотеки, её необходимо установить. Для этого необходимо \n", "\n", "* на Windows: зайти в Anaсonda Command Prompt и ввести в нём `pip install sympy`\n", " \n", "* на MacOS или Linux: открыть терминал и ввести в нём `pip install sympy`.\n", "\n", "Когда библиотека установлена, полезно проверить, что всё прошло, как нужно. Импортируем `sympy`:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь, когда убедились в том, что библиотека импортируется, импортируем все её функции сразу, чтобы не вводить название библиотеки каждый раз при вызове функций:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sympy import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Библиотека `sympy` (сокращение от Symbolic Python) – библиотека для символьных вычислений в Python. Что такое символьные вычисления? В отличие от обычных вычислений (разделить одну числовую переменную на другую, сложить два числа), в таких вычислениях мы работаем с переменными как с символами. Так, мы можем сообщить Python, что строка \"x\", преобразованная особым образом, это не обычная строка в Python (текст), а переменная в том смысле, в котором мы понимаем её в математике. То есть, мы можем записать выражение `\"2x(x+1)\"` и Python будет понимать, что можно не только поставить на место `x` любое число и посчитать результат, но и работать с такой строкой как с математическим выражением: раскрывать скобки, упрощать, находить производную, считать её значение в точке и так далее.\n", "\n", "Рассмотрим пример. Сообщим Python, чтобы далее он воспринимал `x` и `y` в выражениях как математические переменные:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "x, y = symbols(\"x y\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на них:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "y" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь на выражения, их содержащие:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2*x" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * x" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x**2 + y**2" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x ** 2 + y ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Обратите внимание: теперь `x` и `y` вводятся без кавычек! Python и так понимает, что мы имеем в виду те `x` и `y`, которые мы зафиксировали в `symbols()`. Если бы этого не сделали, он бы относился к ним как к обычным переменным и в случае, если бы мы не присвоили им значения, выдавал бы ошибку вида `NameError: name 'x' is not defined`. \n", "\n", "Выведем выражение на экран в более красивом виде:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2 2\n", "x + y \n" ] } ], "source": [ "pprint(x ** 2 + y ** 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Или в ещё более красивом виде (LaTeX-style):" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "init_printing() # для красивого вида последующих выражений" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEIAAAAXBAMAAABNOYSfAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFklEQVQoFWNgAAPGUGMBCAuFRBJmZ2BvQJGDcJCE+S9wfcGiAkmYUwCrChRhVmy2MDAgCXtgcykDA0KYayMWZzAwIAkvZvCCKOGdgKwULszAtcWlECLDpoCkAiHMwPf//wcsKiDCQsoioQkIfTAzhIoYGA0gwgVMRsjhCVMRkMfACTGWcwHTL2Yk10FVcCXUMDBvAJvBwsB9AG4He0dH34uODqDpjAyPGPgUoBL8MAaYD7OF9yODvwNUxf0FjAJQJpCCqWA/wKAHEZW+YM/AilAAV8FtwLAZIpzvWMdwDYsKdgPenxBhcSW2ygQsKhhN1X8hCSMxYe4ARvwBJGEkJizmahjkEpCEsTCbGEyxiCILJalfgHAB1wE260eiHncAAAAASUVORK5CYII=\n", "text/latex": [ "$$x^{2} + y^{2}$$" ], "text/plain": [ " 2 2\n", "x + y " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x ** 2 + y ** 2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIEAAAApBAMAAADgwVfgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnariVSZZiK7RO/kCJG0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACMElEQVRIDaWUsUscQRTGv/VO3Y2358XCYHf5D5S1FotAsNtGSaqcrVgckYSU16YTJSkE8dIlWHiQRkRQLOwEG2sXREgXC60kXN7uzNuZudmF0XtwN+/73fdmZ/fuO4DLW159+4XFs9YAK/H2syZ5aB8femssHNdXn1c15yLONOXWbsI89YPbmOb6h5NFTYaPeKlJl/aHvoN3MXaHtsuY4dlQyr+fScKO0rKbsAiDXtpU51gC3rf4608luXvHjbVepeS4YfEB4Jff12gHmGhVs6MMTOlyShcD/Ws6wpulkkOEXeneMaZynNFfwN9+3zAo4ceyTxSjLscZrZdcPvuQrWEzk/zGWOiRLvOCla1Bm74klVmJvfcxpoHxVsEkI94hvYyWWYnH/QQHwIsm2wtW3qHSAbTMSnwYNLFOT2VWTE5Fac1jsp/WHcEgihZuoqhFbf0S4Mwq3KjHuKXfY2ouKz5DugOQZ5bxdaN6D4RJ2Thxto50SKjMMt7CaKLugix2sbUWQ88s43PUWvQkT+3BnLCVvjA9s4y/47pLzyvO/XbD1nDWyCzj6U97PaBCr9JiK+YNS47xkfhv47MBkUeI0qOVxEHT+0PUTJ1mM9pa0Ukr8Vib/htODWeZ8Ips/vIu+WuNsiGTH5lSU/taL1qZOIu7A5k49wHLKRNncXcgE+c+YDtF4mzuTkTi3P22UyTO5u5EJM7dbztF4mz+FJImboiSiRtiB5G4ITaASNzTd/gPPZd3XwjhbbcAAAAASUVORK5CYII=\n", "text/latex": [ "$$- \\frac{x}{y} + \\left(x + y\\right)^{2}$$" ], "text/plain": [ " x 2\n", "- ─ + (x + y) \n", " y " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(x + y) ** 2 - x/y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь попробуем сохранить какое-нибудь математическое выражение и поподставлять в него значения `x` и `y`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAaBAMAAAD4TDc7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInZUiRDNmWbvRN27qzJGkhbKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABeElEQVQoFYWSsUvDQBTGv7SNSWNr8wcoBB2Kg1DERRx06CqELiIUCbg4lqJFt05OToKLLgVBEAdbnSSLCo5Kka5iHZwE2w6Ck/VdXq4kStob7r3vez/u3fEOGL7U/Is9nAA0aPVRTKam/IxidHs0AyRELzPqLMUrfNCdY7koxrCoojzQthCFADNUmsIbVCeaGbOhPH3uQKsGGSOk9BKS/X4XySCCuBWSR6zOQuYfZouL2xQKcxt5fp1kCmWoTWCVGYGWYs/+VCSzsgi9C+wzcw3oZqyXrnrSZ5RcBelbYImZY2ACKUcIzXVvTlyXeqg4RNICOsIGiAEylthpyV7GFzpt4NwzsSnCpananpSM5mCWDL/XPVCsvSLhIYNzUk08knPALj1v+X0Pp2FGaxrf5JTZvQDWpuO7uTCjtrI9chrsjrc58i7vQ1/LoX9RZ5fmFlhyphWs08mDed8FkEF6hRblk1IXZRKM89kaSfEFvaVU/eRf0E22fgGONkZjm56VuAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left(x + y\\right)^{2}$$" ], "text/plain": [ " 2\n", "(x + y) " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = (x + y)**2\n", "expr" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAaBAMAAAD8uecGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInZUiRDNmWbvRN27qzJGkhbKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcUlEQVQoFYWSP0vDUBTFz2ubJrFGKw4uCkERVxE3lyLiJuYDWAi4OBbRCkqxky6CRXGwUydRHBpx6BAcFBwt/QAKCm6CrYOr8SY3CU3pnzfk5Jz74773cgP0XdLKm9EXAGTI1gBktCL+BiCKMRABEu5G6R6dhJd/0XFj8z2QIZ0K4pkei92IiXwdmKHKFD4gmV0Q0cB6BUkDov69C7nYjlyz0QyoJSg5qI7TgtpOYIGd+gvtB7hgd9UN0Sxo9Mm2uLYDSHM6suz8LmRSLWCNQyIT8RJOO5GmDhxxeA+MyyZeO5EaBUsclgFD1XFG7sC2L237wcvlHEkzRFA1Rvx5hmc5dqs3jGyS5BErsQuQeAZj4UZPVHvBcCOKfAKzwAmH7sUKqBYjiKjtFSxgm8NbkuzyYTqCJB3HMYE7DlPvrq6yCQbATlAjd9GsZFM6ZwN/jOzCCT8ipWsZH4nIZOA2EJ/eD0xE3R/OW6Lov3SK4l/hHwOaSee++g0UAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left(y + 2\\right)^{2}$$" ], "text/plain": [ " 2\n", "(y + 2) " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr.subs(x, 2) # x=2" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAaBAMAAAD4TDc7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInZUiRDNmWbvRN27qzJGkhbKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdklEQVQoFYWSP0jDQBTGvzSJSW2bZhexuDgJRdxFKbgoHg66FAmI4NhBseISXeqog4NOQaEIDi04BqEKXVV0cBJ1cBKkLoIO1kvfnRD7Jzfc9973fnkvlwvQe+m5R9abAAwY1Sgm7Sk/UYzJohlAC2bZ3XpR4Y0BsWw35jgoKHW+jXdC9Klpj54exAt0pxNjAPfACm9z/b4Oww0xp5TtAgtACYg3mw3EQwjGKJ1pMXH+usEqk8hdMJU6ikCfS/Yal/nRpZw4nWBSzRFuaLfErHIpxO7krQgGc582YDrEnPPQjn2kXEoFo07efANqlcwjwELSaSVbvn/o+xc8LkH9YrAafwyQzlACea4DYCiL/j2ylwOp2DqjlGbpvAGfLmddAXnvCRohss8+kLRh1sidBSZeN3ESZsoMO/wnzJB7BiwOq8VsmLEeNjwgYZObeBZVEvl9WtmAKJmFECPulDx+HbQuZdCmSk1aeRm0aZJJS3Fl9F+3hfELcoRI1lnYN4YAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left(x + 8\\right)^{2}$$" ], "text/plain": [ " 2\n", "(x + 8) " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr.subs(y, 8) # y=8" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь всё сразу:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAOBAMAAAA/Njq6AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEIl2mUSrVGbNuyLvMt2wmzq1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAb0lEQVQIHWNgEDJyZWBguCcAJBwY2AoYU+YDmRwNDIwTGBjsgUymBXAm6y8BlgaIKEP+Z3egDpACBqb/s2HMol3/AyCiHA4M9QchTB4BBu7vEKY8UGEGVHQDA8NqCJN1IgOHAYTJcM0F6Jys888MAE7oGVYTyKhqAAAAAElFTkSuQmCC\n", "text/latex": [ "$$81$$" ], "text/plain": [ "81" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr.subs({x: 4, y:5}) # x=4, y=5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Оно ещё и посчиталось! Для вычисления значения выражения можно использовать специальный метод `evalf()` (от *evaluate function*):" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEcAAAAvBAMAAABDOcobAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIomZu0QQZlR2ze/dMqswxovtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABrklEQVQ4EcWTvUvDQBjGnzZpmhD7gS5OKhUEnQqigmJ1aTel4OLWA10cbPsftP9BA05FkM5OXQQFwW4OZqiLk0IHQRzUdikdlJq0TbjLxZ6D4LvkeZ/ndx+5S4Dx1YQSH09Y6c25SYSQ+bkgZNASI/hD6KW6KV4wg9msmILc+AUkdUSQXIP0xUBK4p0wBqA3EG0zngSpwRhA0OK2GS+WDbBTA4EkTgkDhQkHYSq1ajOT82kXDTZcyQgliVLZcR6Jo9in1kOhNrICmZEIFVkodIGYA83gfhiqBgtZXWU0LrDzNNglwEOhW+Do7DhR1vv90cFxUOTsDUhqr/RBcpC1XDkc1zpRarM+kN6NwLpJpyTTvLs2zZbd9+1qI9KE3ANizPt4Zyp0B1AurhB76LC8kN6C3j3MftgX7pYXChetc6o8bGDfRXzOaW85jYOqulYeB1GZK73LuQEtvBdMZ/+ulRMDedEugmodJRE0LdXwLIKIbuBKBCFHIt4flh+zDq3Oux5nF3LLY/FtCjnqs+bzgZNf3Ir/ENH2Et34aqmmXPoGtDlhROfo3ler1RXL/wZ2emBcPS5rnwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$3 x^{2} + \\frac{5}{y}$$" ], "text/plain": [ " 2 5\n", "3⋅x + ─\n", " y" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr2 = 3 * x ** 2 + 5 / y\n", "expr2" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC0AAAAPBAMAAACCUFuUAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMt0Qq5nNdrvvIolEZlSFnHVmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA9ElEQVQYGWWQoUsDYRjGf7cdnDvdOJN/wKJhX9BiETbFOMsntonJZjILBsEk6MJMHjL7umXYbDaTsL6mcJbp+bx3QxSf8PHwe1+e7+GFfwpgQzBoQvywP7Z57I8Satmh0NreO6xT/zI+ZHFGpbXq5CPx00k1M96BG0JzJX8aU/BbRzf9xaHxaTtt6CZ/+OOzcalF+HKSyFg+K1tmpeCDBRfP5ApOo+gDlV2bnv1w9KXJF28vLfeX4XJipK71c+gpVTnV3M35lDi9UimtWH6fMicYEbkRDOb81fpvHnDnfZt7omsIL952WPK6m6oc53mm4207vgHx8D/Q5eEDlQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$13.25$$" ], "text/plain": [ "13.2500000000000" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr2.evalf(subs={x:2, y:4})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь посмотрим на что-то более интересное. Посмотрим, как с помощью `sympy` можно упрощать выражения:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "primer1 = 3 * (x - 2 * x) + 5 * x" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpnNuzKriUQQ7912ZlSugimNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAgUlEQVQIHWNgVDIJYIAAMQb2H1BmJgPDKihz/QSGfAEIO5uBIR+mmIFhPwPnmczwOqAU6x8GJoZjB7SBTG4FhosM5wVygUwlBoYABmeQTl4FEPkHRDxnYBRg4PjIMJOBtYCBZ6YH2weGAgZpJaVsvq+TFnA8YLD///8zp86BR/cYALatHoL2WOs+AAAAAElFTkSuQmCC\n", "text/latex": [ "$$2 x$$" ], "text/plain": [ "2⋅x" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primer1.simplify() # упростили!" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAASBAMAAAAQ6mVrAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpnNuzKriUQQ7912ZlSugimNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABIklEQVQoFW2RMUvDQBiGnwRtE2tLJheXkI526OCuIIhjN0ezlVKk+QXiTyhuFQdnFdyN0NDBQQT1D5TgIpQOLSIoVOpd0sRLzQ133/vcc9x3HJqz3SBnKHyD4leOgcJbcKUqxkucFH7bpWMpTiWIg8Lb0FGbSZQs72M+tQ5P4tOJIlKfixqmK6rVGToPwdayIrg3ojwRvGTzyrN1vKyUbC2sUtgV3IEGe5Gg+/7dte+7UXAwuWEtgLItwUxOcqS9SG58cyTe8o5mYUzpRcafIrle51E067HeOyhM8LKK5N0Vl33YdJx25fPs0giziuTorvEDO/P5h1kL3oaxkV4kOWZzMF1wZUnbjVmxruwtyuQbo1jlPPyvZMg9zUzOCePBKfwCUylOCVhpJzgAAAAASUVORK5CYII=\n", "text/latex": [ "$$2 x + 2 y$$" ], "text/plain": [ "2⋅x + 2⋅y" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primer2 = (x + y) * 2\n", "primer2.simplify() # тоже упростили" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Или раскрывать скобки по известным формулам:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "p = (x + y) ** 2" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHwAAAAXBAMAAAA7AzYUAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABwklEQVQ4EZWTP0gCURzHv+e/y5MzlcAhCNHBrbQQbNKgIFpysfkIoq3MxQKJaHKqpoamA5fGosYC94acWoumpjJxSQo73+vde++S0gf33vt9v9/PvT/cAaQpxbkQnQ3fC4wK9WB4kCYFZrypdUbFBcYfGh2XGO/ImwcEZtlxdVrlLv/fcTijXTqydXi/HJKzFJg6Vqirn9AxDbw682AmNWwG2vXiDtV8MTq+hZAz6ZT3zCQKZxDs9Vo0xRJZIJfnoGySijKRxETR4DmGW8oxlHh6aQ2RMpQUSTCTKyi5ZsUvjiUATxsqErFdFLbgp3tjJlf8pqvr/rmu/gosAYyVcIYZc14zqnBfiKsLigeBBrH6nVqrHb3UanSnFSCPG0DBM4Ix0WQK4cYtizd7dX+pL7atR3/Har5f2FvjCvBoKiFiSglsQDOhdxGG2sA0DbB3c2WymYOX0/YCngJc4Vt3CwUEUriSca5sL+zjYQB+XqlkfZ3ok25ATekfMs6VaNy3ZwzA73u9T6Uc2zy17i6T7Mo4VwSSTNnxJN3boCU3mSLFrEL+K4hbxZRBY8zkCtX/7A+Rcfi/FUdALNeTTbG05rbyDc2eaaNh+OmaAAAAAElFTkSuQmCC\n", "text/latex": [ "$$x^{2} + 2 x y + y^{2}$$" ], "text/plain": [ " 2 2\n", "x + 2⋅x⋅y + y " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.expand()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMoAAAAXBAMAAAC4681qAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACgElEQVRIDY2VsW/TQBTGPyeO3bhym1agDJWqqBkqFppSdWDCoCAQCxEoiNFiYYPSBVCrqjBlQmFBgikSYwdAMIKI+As8ISYosLCloKpSI1Co7/l87+IzwsPdu+/73ffOtpwA4vJO1AOqDOPxq8sGNSNZ7ZVKRgRYdLFV2DUQJK3hXq7HDBfuNlvKkkXbQakv5cz8By+CjJgVpiNvP6tCi57oGgiSHv9fl3LF2AVQ0YUPuU2OjOv/MpVX2la1qnj0XE3pceW1NyKp2A9kxWdOkH7R9PYBFm2PPdMqygcyc8e4mxOC9F7JDfqcRs8H3iFZfvJ+lkLrdwJ7DbvH9hkIcp/jEhWSECsVjYlK+SsRTo3mzxFkl53mBX4zBkJs8d407+gZYqWiYV+p98YJJ7k7DEYj8nIJYUyNRnvjxNGaomfrx9ohufEoTwp86sJaWD5/jbzZdVgNURoIZWoEk9cKp/g3m2acWwngol5LvvvWLZTpqAZCmVoXJZd7hWGxS+eNxzQDzgGeYal3WnheuIniS1FmCWZygsk2JvvCige303n0o9OhJ4NBJcDbxLPwDVO1HEKaglUZmjx9tFld8qRN4H0I/JKO/xOXA7EwEMrUCC5/6VkVmZU+MWtUibv4Q8yQ5/ZxkqqkCyeUqXVR8lx0BiXVJH0v34HBzLviHlpkTjbwWusCRihT66Lk22e38NHQ5SmcQ2e/uuuHZLoNP/l+5BNjhDK1LkquLjj3kyCN8O9uRNZ67eYTagJrdXFIpezCCGVqGWNykhRPMoNJSSn/54yENAWrCE1mkdovHdM3MR/S0kAoUyCSGJNZWl75EKt5FpBj5sj5ObixGOW7OWYq/wWo4ba0COsODgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$x^{3} + 3 x^{2} y + 3 x y^{2} + y^{3}$$" ], "text/plain": [ " 3 2 2 3\n", "x + 3⋅x ⋅y + 3⋅x⋅y + y " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = (x + y) ** 3\n", "q.expand()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И даже по тригонометрическим формулам:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "trig = sin(2 * x)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIMAAAAVBAMAAACXjEALAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpnNuzKriUQQ7912ZlSugimNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACiklEQVQ4EX2TTWgTURSFzySZNpNJ0kFEsN2M2VS0hUDdKGgjblQKzU4EpcGVpZWmCNaNEnAhVLFDaRFBoUILxo3pxoULOyLUTdT4sywa3BRU6I8NdSHU82bmzUxK9MGbd+75LnfunR/gH8twfeX/GF5aq6xk3XXjdisKiXGXWMkcyXtZnbUgfVXKd1I0nT4Wtfah/bdHp0w/TctKGbWkCp0BxlFgGHjqQS1IivgNpczA9VWA8RF4ZmHM8JkUCSmAciB9FcIJCyPAWN5nUtySAjgeSF+FcNTpd4nowspr5VhBfXGgOioSu7kfLs9O1IFrlFo31XT1INS31ayHterwuZtAe4Gx+oc5OejQC0iMYsigJ25tJkcjFeATZWc9vqAuImbPALQcHMGyfRhIiZK6CcTLaEesgNgcOmr0XpIZyY026h8M+5B+rBehNiYtFF2MD3hvXAHSFcYZbiwNGE6JHDpshk/YHGJZQYbY47Y468C2vvVKeMTI45SQ6jrvZgp1v39zVwm4xTDpjoq1ErClXd0R6aIEwAfA/ueAVSgGFEv7mheDeF2cEHTK0CxnEG2Tkehicz8eNagdHN/AA2cQtYikhbSNtlqoxAAwUxrj8wE+c/cxNWEi3vgJcH4Qa6fb1sVzSeXQlcmMMKGMmMEWol4XfJNr5w/hHtN7uPn3jKsLiBa/WzjJmDjdmJ6L14GIjf6dnV+c6Eb1unp2fnZw/uLgc+bcAT+DdC9TsMitXZowsGfiMm6vvCkxJtZ67G9fKHWDl1ZLz0tXqUgVOgOMrpDdJFOmDEN/lLTkW3Ti3sDdpcTEztorRdPpYyXX5IcDfsnuOiNF0+njmNXkhwOl5kYpI+z6WmJ+5vgLpcacVZklfn4AAAAASUVORK5CYII=\n", "text/latex": [ "$$2 \\sin{\\left (x \\right )} \\cos{\\left (x \\right )}$$" ], "text/plain": [ "2⋅sin(x)⋅cos(x)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expand_trig(trig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Производные и решения уравнений в `sympy`\n", "\n", "Для начала найдём простенькую производную первого порядка (первую производную) некоторой функции $f(x)$:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAAqBAMAAABLi8ixAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABsklEQVRIDe2Tv0/CQBTHvy3lVw0BjAkDiWno5IS4iHGgDiaOxERnFuMocUEXY+LCpE4OTk1c/CM0Ia4OOLmKm5MQwiLRIPR61wMew7mYGDvcvfd575NefzxA/dpKqTuAttr8kQfk/z3yhf/iezGXbIc8EwWlc4bKeotqIZnkGU64QfZQUPKA2CXVQrH19pkluP4gQhaYtUdnApFp1hrHNwh/jRM6M3qMJ/zzFoB3uZNzmQGLjvnBSMRiezuFkstCb+VcQsMwloq/MsLrRaDkSE2cCzRvL+xUjG3bZUSqX0DLFTZ3pzgDVX0lesrC0Rp4RhdR2NYRqwWc5XFX74ekbxfUY1VcI++u0Z6BuQarDNdovX7+Vq8ve6AGOLjzQoknB6OrM8RJy6v5i7hfvDoiXV4TnAO8uFpKJMHz7cF0kegjzWqTXvaphHCgCc8oQ0/fhzoo097BxgmeCe+2VitGeplWokJ7mVzk2C95Dfw8zcHgUzu09q+YJs7hp1Mb9yYLszjvo/9fYBbn3p/ZpRlReiZpRpQ8aUaUPD4jSpLXLGZETQ1mRMXTpBlR8eQZUfH8GfkGJ2VWxSuNOmUAAAAASUVORK5CYII=\n", "text/latex": [ "$$x^{3} + 2 x + \\frac{1}{x}$$" ], "text/plain": [ " 3 1\n", "x + 2⋅x + ─\n", " x" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fx = x ** 3 + 2* x + 1/x \n", "fx" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHUAAAAqBAMAAAB/8gmtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIomZu0QQZlR2ze/dMqswxovtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACAUlEQVRIDe2Vv0vjYBzGn7QmbahpgziKJ7rcIFIIeJznWgdFEFxuM1xFcDiti7gZ9A9oV5fa4caDc3FS0EkHA1YFJ4VOinB3bQeLihLz480vSV5rXG64d8j7vM/z/eT7Nn3TAhGGcBABspCFkVZkFvx/tu2H9w89K67/r9zWvgP2HEd8PyqbmWKeorIJuT02PfF4Y/XoGsg5zWL7jjQFI/2o+h3fistiVbGdC9lW1tyL2K3f8a34OyxWiMOMEcEWLHEF7BAraGK3kamQoBcnlkqWrHlPRl0kYfBUJF2YycthP/sbqFeDIctlD4H58vd+JaVpDT+rr45pqFD+A2T5G++5sPcMCPc0FigqCZFvpsnOjVqX7czS2VRLQEfFqYmr6tGuqtZMQzKu3E/VGMYnz2jOaECoouNO90pmKbk4fRPUtostk50ROdmlHXYNjOjaL1WqhlRrdqqOmCexWaEPvOzxX8hEAcVC8fwLvnoCm+2RJP0rDhjfhvQjB0xLOeQ3kp8UT4nN/tK0B4/tyixG3YVf2azf9axu8cF46kHDfheCMtNbDmdDGTcYdOVb1Tv+RtEtv7WbXs9tXJ1+BFMTKGcm7LZxlEuj6L48i9B4CZviNfY0LezmFL+KcUr6WvTKrwENZ5uYo+XhGZdLN9AXntOS5FN+i1VoFeEZ97m0vkLiZ9dbh0gwQzZnAAAAAElFTkSuQmCC\n", "text/latex": [ "$$3 x^{2} + 2 - \\frac{1}{x^{2}}$$" ], "text/plain": [ " 2 1 \n", "3⋅x + 2 - ──\n", " 2\n", " x " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fx.diff(x) # дифференцируем по x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вопрос:** как найти значение производной в точке, если совместить `.diff()` и `.evalf()`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем производную второго порядка (вторую производную): " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHEAAAAyBAMAAACZnCkhAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpnNuzKriUQQ7912ZlSugimNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADBUlEQVRIDYVWPYgTQRT+cpfdXLIbk0oLmyV2J+IhNoLglYcipLVKGgv1JMHGRkiw1wt6WoiQCOLPFZpKkCAGhFSKqbVIwEJQIRwiGNQ7581sdt9sZjdTvP3e975vdnZ23+4CbNhNlsTD7dZc7eocYySsU1HarkcZPbde+/l3nQc+Rwk9v39k6hNLVb2S+qXnc5k7c+KNXnMWLBah85u+R5/0ieaz0LnsadWnWmZIQufKLi+HPGc5ZooTnHeqPDNh5pzwC62UTWrOMWe7zwqXGTZD5kx3meQJw2bInHm2RdY/s5yxzJll6gybhak5ZE6wFaY7XGTC9tk/mwF/DkiVTspNza1L9tC1jaCaBBrAQWR+k6TtUcx6GI0JLBqjJi4BOySr9Cm6e2ivEZiNWzMQOQr5yxZqRUFPxlRbeYaC5vxBrGGIJV4BanShIwo0JkN1VDHOWahS/S2Fj0WK4qyiax8O7l0fywyxznVRt/6SqNGiCGtwEfDczaWuTGOduTVRdzwSHVdOuuB80d21h0Qi1unQzCUpqckoQm5qIU0zAkd7vZ1e7xXB/XBQCqcD5D1CUE6rjPQeUOhLToS46yTnV6SKQqJW255K51Yx21LeWGcXVh0uqRpkR64qVrvdrCGjjLHnFDt0uFQSt1TclTLF/FDcz8mFVdymTAz9nKkPAymTpzizv/+TJP6TcLO0gTvvDxwbEyeG7rTrbkfSKHjqKOKkGUAOdKdVzqyparseqCrDAHIQfeIdX6YaRCrZ6bkzgt3TPqEaRCaOv4yINJpu9xUze8xFZncUtSBa/gcveOTE/Zgme2T/PCin/Jfe41BtiYcuacj+cVr551KUkv3l69l70DCD6h/rxqAoi/xNjVWDPqSC/lGU3Q1L2GqyxADD/hFFLVENbrD4VNg/ghi1mDB5c3n/CJPs9sCc+LXn/SNec/pHSFtBMJ8PeP8A6apWX65raVKyxS9TvDAfJYm12gstA95F8tjUrkZKi/4YA/mXAM3A+RlIPs7/pSLdTLb41btyf/4D7RXB2QqROHEAAAAASUVORK5CYII=\n", "text/latex": [ "$$2 \\left(3 x + \\frac{1}{x^{3}}\\right)$$" ], "text/plain": [ " ⎛ 1 ⎞\n", "2⋅⎜3⋅x + ──⎟\n", " ⎜ 3⎟\n", " ⎝ x ⎠" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fx.diff(x, 2) # вторая производная по x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь рассмотрим функцию от двух переменных:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEIAAAAXBAMAAABNOYSfAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABNElEQVQoFWNgwAe4NJUd8MkzMDAHMD3Ar4LFgfUAVAWvMgM3VsUcE6DCrPwCfthUMB2CiS68waANY6PQ0gowrimDEYyJQrN8gXF7GZ5AmLwwi0FcOQeunzAVLbwfIEw2BZgQkOYQ4HwI46bPPgBhoqhgCVJewMAgpCwSmsC4gBtqOkyFUBEDowFEUwGTEXsDs8IdCI8BpiIgj4ETYjHnAqZfzBPYJgWgquBKqGFg3gAWY2HgPgCVZGBg7+joe9HRATSdkeERA58CVIIfxgDzYbbwfmTwd4CquL+AUQDKBFIwFewHGPQgotIX7BlYEQrgKrgNGDZDhPMd6xiuYVHBbsALDU5xJbbKBCwqGE3VfyEJIzFh7mBggCceJFkQExZzNQxyCWhSaNwmBlM0EXRukvoFiBAAC0U0O5xOJwoAAAAASUVORK5CYII=\n", "text/latex": [ "$$x^{y} + y^{3}$$" ], "text/plain": [ " y 3\n", "x + y " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fu = x ** y + y ** 3\n", "fu" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И найдем частные производные по `x` и `y`:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACEAAAArBAMAAAAEUfw6AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFklEQVQoFWNgAANeZQZuCAtGsvIL+MHYEHrhDQZtVBEGUwYjNJFehidoIi28H+AiQsoioQkM6bMPMDCqKzAIA8ULmIzYGxgXcE9gYGV7wDCfgYFzAdMv5gnMCncYGJaxH2CwZmBgYeA+wMDANimAgUGAT4HhEcg0fgUQCQL3BVi+gOkFjAJgAYYaBqYHDAzSF+wZWCECDJsZuA0YGPId6xiuQUWKGe5PYGAQV2KrTICKCAfVL4Ay4VQMnAVmsB9gfIYqwqHADHQVMmBTqkXmUsr+jwY+UGrgAOpnVDJ0DUOxn51BWaECRWQWg/4CSxQRB4Y9KHwQ5xO6CO8vBkFkMca9zB8YUGKG7Yv4A94EFDVFCunToAIAQlFCYmXdX1EAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{x^{y} y}{x}$$" ], "text/plain": [ " y \n", "x ⋅y\n", "────\n", " x " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fu.diff(x)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIoAAAAYBAMAAADXB3gfAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarMolUmd1mIrvNRO9/G2jnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACk0lEQVQ4EaVUT2jTUBz+srZJkzRtHEpBRYLD7SBo2Si4k1V6GB7W4ug9eHEXdRZFhkPCmFAEJXgRmYcMT+Kl/sHrevHgRXKSHcbmP1DwsAkycCj19/LeS7taROiD5vf9vu/Lx68vLwEGXUptwh40A9CgeYOn5ELjh0ixRmD2CzQEKWsfj27HKamcPd3HgVFBWk4/VXApT4CVNRwHkm8Le81qVfYyTvZG7WYo8VS8u0WME5nuSTksjcjETk7loe8I0XgWu+7iM2GzJ2U+1vU5Di2f15Ou8kuIj3FO2pasbYK9Ke+lDHzgUHV43QghUoyX5avSdnG5RbArhT0Vi3FiveFVpgDqT85k220aYHhkf81VApONSilKfSyEVZwc9ehAVYmLdGCG39NJWfMxXIdS4Pzc0LjmJZx11lHKVIDnqNhZPwQyLDnSgUfcHaecnSihehn6dsTrwdBuwlfvV1lHKbeBSukUEh61aRfgOjBLPa04BeqO4S4g0YzoJMxWBNjFLCTp+eWqIiUb0hkSeoVkrdG497XRKHD/1j58RNbhDXISsBT1N6U0N+20TypLoTbSNxjszFIGVl3rO80d0cBmoNgCilnm8sVJxmRcduX63n+ktG1K0Vo4wRzAofA0UhxG+/KFbitd4oTpdPRlTsl9+QRs2bSNLzh95cwtvOMwSpku4TXWyyuMStEOSL3OPTLlITsvWsEShyZ/VJ13uQPJ1W+BcX0mRKbdXiTO8gCp3+EemWLdoLdRKY7tilv7lVc4OOuQsBSLhsehTBFCqiVAn6I26ZzQDw9iUfM5lG9j1C3giBs7/gIKzWAy3Qyk9lSC7rqIYnfbiw+cP3aNcQobKFqdb4hkqF6gV+5/1hNh0oN/uv8ASGKOzd9vxzoAAAAASUVORK5CYII=\n", "text/latex": [ "$$x^{y} \\log{\\left (x \\right )} + 3 y^{2}$$" ], "text/plain": [ " y 2\n", "x ⋅log(x) + 3⋅y " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fu.diff(y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь вернёмся к функции от одной переменной и попробуем решить стандартную задачу: найти точки экстремума функции. Для этого нам понадобится функция `solve()`, которая позволяет решать уравнения (по умолчанию выражение приравнивается к нулю). Посмотрим, как она работает. " ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAA/BAMAAAA/PtpxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARN0yEM2Ju6simVRmdu+ZijTUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVElEQVRIDe2XMUscQRTH/96duuvp4X2CO4yVTZLG1k0g6QJ2kibnBxAU8gVE7D0CQpLGsxDCNrFKkSapA0KK1MFPYAwxkBSyvje3uzM7856GE0GCr9jbmd/8dmdn7u7PopNlXYxWvSw7RKfdfjCajoftDvkjykZr3ZC/lHGpM1s0+BTQ7v9SVQ0oseLXNy71LVb8aPZS32LF30Wcrui7ugu8PTDPoPj7eI2Jn+oc9hFvYp3nKPuNZWwDJ5pPOErQOlb9qUP8SLDTVy5AuHWG6K/qPwa2gB1tAQhHXUS/VH/N3Pi+cnsMce1U8pu8Kl026+d89MpiLH0lFqzf92VghglqAz56ZTEWGPl+/JSeqmak1FO56eCpAXf4Php/gCMm0wM++lVifDEo8PG+j3lGHxD3fZvaBW6u4g01Q39vQIhWbxUzCX36lWMsAt+Ihf7k2XhC4FWa0lcgrBzHC+m7LtHQHzv/yFYvy37zp185Hqc/ENopwceL575TaVdxeH982qyM9xtVLPg1adntVapY8O3Qfzi7803+PZnjugeYXCkPwQKWxJwQvu3rlwSPUO24Yv4N8TfkXOIKH3OJM1g4Ff0823h4MwklNxolv8g2NidCvRKNkl9kG6vPBN+NRskvso3Vz4LvRqPkF9kmqKbLjUbJp0Em2zSf+stoVHyTbbpvo1HxTbbpvo1G2R9mm+7baJT9YbapvhONop9nm+o70Sj6ebZpft2JRskvsk3z3WiU/CLbNL/nRKPka57Uf+ffzvcnaa+kvv9h/675/vzoOu/P7eQCQpnX3kLMCE4AAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left [ - \\frac{\\sqrt{2}}{2}, \\quad \\frac{\\sqrt{2}}{2}\\right ]$$" ], "text/plain": [ "⎡-√2 √2⎤\n", "⎢────, ──⎥\n", "⎣ 2 2 ⎦" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(2 * x ** 2 - 1) # 2x^2 -1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь совместим: найдём производную и приравняем её к нулю:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJcAAAAZBAMAAADOC6HiAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAuzKrIs1EmVQQid12Zu8hkQ4ZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACDklEQVQ4Ea2TT2gTQRjFXzabTTap/w56EezqRegp2FOxYnrwXA/eBM3NYwMiCBXtTW8WRIp6CfWg6KUICmVBFxREVFywgnpR8KDgwVRtQSrE75vd+TIzVQgmc9jvzXtvfxkyCaDXaHfQ1dEoeHWRg4tCNDhDCHtFDUEcGAJDI/yjWg1hFpsO5PrNCcfpf3vErbYw61p978+6zXVMR47ntRwj23rLNKt3FiUMN31l7zbDan/9KV458wvwH+CgwKpzIkXcFZWL5xYsSHN7hGClFnZI/YYoEer0siPhvbFglSQPGXZ5Pttc4/EyD4wxlediVUv/hp3IWt5nnkvyChC+mBi7Db/uNQyT5BOCZZnyrZOtjT1tkntplB4jCT30KuNxMoupffvto/kpwbJMNU1YuJbiC7szKVDTIJ4reNU4hG/drmnS5YNgWaYCC0bd8/zZtSXgPcdXY173EGGnavMjPK7MiOQKw3RWjuOHX+O4zh2+gA3gQ5P0lnVgmc3e+t2TovyEYYBk5slwn2Apd1dRafOUFfyEumIxWATj44c/tdHLLNju/GS40CjNG++Fu4odtA1D5Na6mVmwGfrOVG+6dUr6JCrfFz4Gc6aj9bbtZmbBCu1Q3SYKnWO6zjM8l1x8axpal0+uPjMyDSvu2ZgEbp2OVC/4oS5Fv9Pv1DCn/6jhGH1t5Y9ut1/b2//f/QEQzcsNXzsFWwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\sqrt{- x^{2} - 4 x + 16}$$" ], "text/plain": [ " _________________\n", " ╱ 2 \n", "╲╱ - x - 4⋅x + 16 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = sqrt(16 - 4 * x - x ** 2)\n", "f" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJUAAAAwBAMAAADqXSUhAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnariVSZZiK7RO/kCJG0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACnklEQVRIDe1WS2gTURQ908zk0yQYv6XgIiC4UWrriDt1BKHUjdm04EZTpBXcJKBY7So76SqhRSGCNS4EwYWDogspVPzsVLISdxUEcWXbtHVT6/jey8y8TzuSiaUL6V28d8+55555eUmYC4SMZPWwFbIlUP4CsbXAYsjCMPAjZEugfD6Dgh1YDVe4BBSscC2ueu/QnrGS2nlKJVrDFWMk0atI9RWFaA122sZqtKZoIxWF+DvUDpg0LB2pLFV6mHVV2drGsiOnNnWGO5bQPmdrGQGS9BaStsy0hvbXC4jJUr0IQ3GXBUGofHoan+Xis2qV/MTaiO7B+N2S3HfEcRoys422b2BrbsDZtFjYmgP/h08598/fAb/7t5t3P/or2avrOnnZtxnRutxYwZRMhEBPFe0aZi2FwoBKMKz3kS02do0X7/GUZQ828DquaBjcN7kIJE+AvwS07DrdVZUxJK90za0bxKujgve+PFHyUzdhR5fIswdFGM+5iHqVM0Jpt5A30xmxzKhisFeP2D7OgTY43H8Dybxuc45mhk28+AwlnavRf75ONXG69tKsGQkM5aYwc2Yg4zHN/SWIF5+hRC+tUcN3qrqQJc/MNfV0fYyL9hXMOw6nWFYkXsIMJXkR7TR5dLJrGYgQ9S42Jh2DhdfcxSNBbIiXN0MlTPPkV9PMUyG9+yXgSZ3k2k/gISX92HDuew76GeHPUOK5cJR41Wj/fRt9dPcivYqdXs73T6Ojvy8D/gwleb1xz4XZSrzIe7QP0QUImFfwDcIMJXnNkftiwtRiR4Z3xJe7v6RLHAvZLwgzlOSVKmrse0R6ZUJo0G7nJh4JmKeTzjthhvK8oh+XRoCbd6ymsOcQb2g587yUhnJeIVqB/n9bFkdsGbeL/gAlJSC0CeWJTgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{- x - 2}{\\sqrt{- x^{2} - 4 x + 16}}$$" ], "text/plain": [ " -x - 2 \n", "────────────────────\n", " _________________\n", " ╱ 2 \n", "╲╱ - x - 4⋅x + 16 " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dv = f.diff(x)\n", "dv" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACEAAAAVBAMAAAA6IZrnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt0yiUQQzSKZu6vvZlSXY1v9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAf0lEQVQYGWMQUmZAAoxKBgyuSHwgkyUASYRjZpUBqkg3A8tXVJFtDAxnUEXOJzDsb0AxZxMDw34DFBGgTfqouhgYmD+iizBNgIikK4EAyOkz0VzIwDsBXeQJAweq7cwODIwJKLY3zZy5CdWu+v//v6OKgIMFRRcpIk6o4awTAABPiCEvIWRrOgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left [ -2\\right ]$$" ], "text/plain": [ "[-2]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(dv) # приравниваем результат к 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так как вообще ответов может быть несколько, результат выдаётся в виде списка. Извлечём из него единственный элемент." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAOBAMAAAAoFKpzAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92ZlRfaCDxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAX0lEQVQIHWNggALWNHUHGJuBIYKB8xeC18jAsBvB2y/A0B8A5zYzMPQ7wHlAhj0yh+UPMo85gYFByBgETIDCachSvEApBHjJwIqwgWUCA48AXC44LQ1oJQzo////iQEAjikQ0wptu4sAAAAASUVORK5CYII=\n", "text/latex": [ "$$-2$$" ], "text/plain": [ "-2" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(dv)[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Пока мы проверили только необходимое условие существования экстремума. Пойдём дальше и посмотрим, что у нас со второй производной (может, это просто точка перегиба):" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKcAAAA7BAMAAADsnIfnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlQiZkSrmbuJdu/RefXFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEMElEQVRYCc2XTYgURxTH/z3b8z3jTmJAdqPsBIzgxYxODskljBAQdInrxYMg2+TiwY+dHBQvIX3Qgyg4IsFIFAcNfiB+kIgKgzoal6CsMCfBZScuhBzEQ9YPNl+Y8VV1V3dV9/TM9G5CfIfp9/713q+ra6CqHhDKolPfhMrvKXkBhnrKC0za6B1pADF85lVDxXFTTl987xBSTLguq6H9AaeiSl4Vp5CoA6kSBXO3s07pZfL+wFgJ7wG3M448F6cAZCe3naZSBv2CQccRab2YC0vUxPLAw+Tl9ylmUOBHYBN35vGTIFQ53SgRgkP1lcD+efB4abRCj/4SUrXa09o1YGsOWNcZyt7b2XQ2v/Uw6Jd5sYpudPn8gZPPKLGzFRCbvoM6JTHo1k/X5tBsW5Eo23K2O/QqtCMHpnI29LdWC7jaFhpt9A494BDYTJlpwrFC8RsGmjJEVdV2MmzafgsDxW1v/W6vYMWhoJqX0X6i6Artb4UxemuqWPzkl2KxwibQw7/vnWdg3HWmcuXme6YcBvqhoNPajAOKOB5zFuWBTLNsa6Gghj5tlwGPhcd2f71ZAJbq4pWhoEibApUYFV6aOdECMlWYtiagyZsvjttS+0fz9H0D3zljS+gM5RIEdMGeDWJUQEUc9Mwa30ZGMrm6GG8MgUtwoEN3B8WaOhuKyA54xnFDxwctWjpuUWMIXHKhY2VtNqDYL6+rkRnAS2vICrfwKwRJ52s3a7UyW9N+E7/7qzsr+kxMShieuDQOSxJr2lemAzac7cjk1aN4LGdLAhqv6GJxekUP7H6g7FHxW1/bEoPG7vzVwNRkrlda1zw+065ZIRP4fSpkzZuc/naR2YdAmN25c+7Mm/y9/8vc1ndesB5G26zplf/gU/ht79/mJk2VyNqSedvnHgJrS+ZtblNioXhb4qGu9cRWyC/SmYm7/kEt79F4W+LRPvbEPOQX6dhHOOwfTI34NGpLVMsqUOfcY1epSBU1NZlFC32Svz1Ys1xOck5oBh1tu3P/JOdzn7UlqtWDoSvUTLp3mKQUXFVrHhoet9oSVyQvaxB0yaN3JqyVUmb6fHjSVJJ/zlNBw5VSeNQ4ZbUlrkjeFhC0mj2esiYgQ7XnZfwqJ8cW08HeJym78Ng4At6WSCqoC1qOuJGdTZa5rEBbwMWcnK39CXxJgti2S/jeHRYiiEdQHek8G/RepKkd/spkA45dMrDSCZjzSonsYDvY56NfLJQ8U6wiqPUBonSsGq0Lnz0Ts3hLji1/39Gj/xwDDhqa9Z0K9AffTNPPItJ6aNeTM7yL9HOf4F3zBOw7jAI9SGuq5ideyQ199OXgdGJEzbCjvzG6+iL2WpECTdc15d+nlBXLJIZ2obFppxS77snWjcFm9Iz9QgG1LtL3z5XcRO6NVjxCL6GABuX2GUEjHXRnQ3FzXgPN/MZCPrS47wAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{\\frac{\\left(x + 2\\right)^{2}}{- x^{2} - 4 x + 16} + 1}{\\sqrt{- x^{2} - 4 x + 16}}$$" ], "text/plain": [ " ⎛ 2 ⎞ \n", " ⎜ (x + 2) ⎟ \n", "-⎜─────────────── + 1⎟ \n", " ⎜ 2 ⎟ \n", " ⎝- x - 4⋅x + 16 ⎠ \n", "───────────────────────\n", " _________________ \n", " ╱ 2 \n", " ╲╱ - x - 4⋅x + 16 " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dv2 = f.diff(x, 2)\n", "dv2" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALkAAAAPBAMAAABKEHMHAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMol2mSJUZrurRO9iHDTAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADCklEQVQ4EZWUUYhUZRiGn7O7M3tmZqc9KOHdzlwEYS65qYSS0bmwhAgbxFmJLloQ8yZwMOgImU4IBRbtualLd6I7L2ogMsjAFY1utnag22hH8ELBandalVlbp/f7/3Wci278YN7/Pd/7nu985/v/OfBYEX7Zt5+LRB30Uxvk/5LVY3VTw2RbvAHV91uQqR4STJ+UVK3GuV6v9wCSUxFzom0HkvbDaHJFpK84poSPoTTYbexTMusetpDvEr7IVdjK5jpnW2NTmckk2cPmmZGbHPw5eTd1oLv2EjzPgfqA4jy+tPAreNMu1MBfHo6nQYehGpfIT5Fp8jSF5qhersav8D01+NgDZPcy1qYwqDhPv/qPMGeT/Dtise7gjxYdnyvMk1vJrUjNwRhK8xYpzHuAVycZL5NZHlCcp1/9HizpBpvDYuxAtdZ41gzjNYrdobZROERwH47H2g39PFQmKTXJrj5SHjI5FIFVbzjKS7YY/Nag8/KxFiVVXxt/avoD5cKm770Fn5jPIFv3va+73r1ivYv5CO/A6zOOj9zVYvDKQhx0GtxitqLr0jM8kWowukUzvdyAX8xucI5JN/e1AWXDYxa1ZNUrjg7XtDjIdYMenI6s+p3SMqPXYVbiRGtkMSVctvsMKqoe/Mlr3QHFezbttNgVqPrSjJw6sn3QFv8D37RKFYp3x6fIr8NBqcF7b2jumbKoQb6u6mw5+sXqgOI9crjQ3OdSY3lr3WCf3j/doeoN7WquO1wmvwYvODdnIoabogYfYdX1f7JT1Vccs4TFJZWJjHxOWDf4sBep+rfWe6FJfqXgeg/+NQ9sg9K8VoPfFxYe/CQ+ZI/rK45ZwuJrOGHrSIVs5OC2Hf4lzZ18m9FyUXNvU9Q7cj4KVzXImqgDuE3uOrPxgOI9crgYToMblMqcTZKrHi7YeS9Ugluwh4mY75hIyWl/OBIVGhpkRdQB3Cf7HD8MKt7jSguC6XdiOynbe72Oh2JiX7HDp2J48u1r2sBEEOpZ+rLZyf8sfQic6F2keljuR4pj/wFZ/CduvI/1tAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$-0.223606797749979$$" ], "text/plain": [ "-0.223606797749979" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dv2.evalf(subs={x:-2})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В точке $-2$ значение второй производной меньше нуля. Полученная точка является точкой экстремума, а именно, точкой максимума функции. Конечно, в данном случае можно было обойтись и без этого, просто посмотреть на знаки значений производной функции при $x > -2$ и $x<-2$, но это вы можете проделать самостоятельно." ] } ], "metadata": { "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }