{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Symbolický a sympatický SymPy\n", "\n", "Už jsme viděli mnoho nástrojů pro numerické výpočty. Co ale symbolické výpočty? Každý ví, že derivovat umí i cvičená opice, bude to umět i Python? Nečekaná odpověď je ano. Symbolické výpočty naučil Python [Ondřej Čertík](http://ondrejcertik.com/) v balíku [SymPy](http://sympy.org/).\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tento notebook byl z (velké) části převzat a přeložen z J.R. Johansson: [Lectures on scientific computing with Python](http://github.com/jrjohansson/scientific-python-lectures) - díky." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Na úvod\n", "\n", "Někteří z vás možná znáte nějaký systém pro *počítačovou algebru* (Computer Algebra Systems -- CAS), např. Maple, Mathematica, Derive, Maxima, Reduce. Pro Python existují dva velké projekty počítačové algebry:\n", "\n", "* [SymPy](http://sympy.org) - modul který může být použit v jakémkoli Python programu a je dobře podporován v Jupyter Notebook. \n", "* [Sage](http://www.sagemath.org/) - toto je už kompletní (a velice obsáhlý) systém, který si klade za cíl být open source konkurentem komerčním produktům.\n", "\n", "My se tady podíváme na některé základní možnosti SymPy." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import sympy" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "sympy.init_printing()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Definujeme symboly\n", "\n", "Pro symbolické výpočty potřebujeme pochopitelně symboly, tak jak jsme zvyklí už z matematiky na základní škole. V Pythonu samotném máme sice proměnné, které jsou v podstatě také symboly, ale operace s nimy se řídí zcela jinými pravidly než potřebujeme pro symbolické výpočty. Naštěstí tu je třída `sympy.Symbol`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAALCAYAAACksgdhAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAO1JREFUeJyV0bErhWEUx/HPxb9hlkUG480mZTCZlAwsJqXUTep0MugWk81C2cQfwKSUxaQslM2g7JTBq+f2Du99u4vf9Jxfz/ec83ueTlVV/quJZpGZt1jASkRcN/wOzrCO/liryS5+cZCZ4w3/qAZOI6I3BEXEEy4wjbV6yh52cImt4nXamTJzEq/4wDFOcIPliPgZCRVl5iF6g4KHkjMivupaO5Nan43zRhMYCWXmah28rFe03b4zBGXmEs7xjBm8YDMzp0ZCmdnFFd6xGBFlxf36L/tNaPAQmTmLO3yjGxFvjWaPmMN8RNwX8w8Rxk/hQXLWmwAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle x$" ], "text/plain": [ "x" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = sympy.Symbol('x')\n", "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Co když napíšeme něco trochu složitějšího." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFYAAAASCAYAAADBnymNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAA25JREFUeJztmGuoVFUYhp+TEv04idSPApFIBIkuiAT1o0wLUdLuRRCUQv0JwqSIUpTX1ygUhQzBooKUICjsBtkVuopSpCnVwSBRSMpMBaHCrJz45Duyz3aPM85sRxRf2Ow9a9Z8a73v+m6z+xqNBmdQP4bXYcT2BcAvwEpgIXAbMB24HBgFHAS+A16OS9IhThF0yu2smta/JW29CdwFvAhcBXwFLAfeAC4DXgJet93HqYOOuNXisXmKe4EvgDB8M7C26Jm25wFfA3cAt+eG2obtWekVkyV9Ru/QEbchwtr+CJgC3CnpCPE8hSA1E1gi6YnCdyOA64FXJf0HfFK1O0m7bD8PPAVMOl5hu4HtCN1325w+QdK33XIrp4LHgDiJJ20PK4wvS1FfKIqamAGcDbzVxqb/yfu/9Bb7gefy+YfQrHC9luPrQiNgSx3chggrKYy+AlwC3Ftw80cifwAPNgmVP4Hw9qawHdFxX378gB5C0rrC/t6WtHDwAjbl+CpJi0qFtWNuVTl2AXB37Md2f7r3hyF0uZrbPgeYBrwv6UALfoszyb8nKez1GuPzvrk0PqFqvFtuRwkr6WfbUe0i5FcA6yMhS4q2oozIx/2tQsX2bOBRYOtgJLSYvwO4qMnXn9oRwUOwWlIUt3aELYb6oLARvt/Xya1ZV/B74fl+SX81mRcVMARfe4yFHwKeBQaAGyTtozXiYEdWCBOtz2oghC+i7IVViN//AfxU2Nu5wNjIu5L+rpPbUcLavieL1S7gQuDhqtyaxe2mqJSS9jdZeA7wTHpDLLy7DQEiapZX2JqVwq463nbL9siMgPWSGiWx+yrSQNfchhQv2zfGxnPyFcCPwAO2x1XYngic3yxUbD+eC2/O3rMtUU8QjpUGqjy+a25HhLV9DbAG2AlMlRTpYH569ZIK+1Exo5i9U7HwgkzoG/M093By0axwRcEh/5LWyu1wKrA9PhvocPspkn6NcUlrbH8TIWj7Wklf5vwIn1uBDZJ+Ky08E1gEREMd82dXFJsdkiIyTrbHnpf3S20PSNpZF7fhtsdm79VIT91WmjgX+BhYClydY1cCo7PIlHFx3iNPRR6qwueZcnop7KEKz4ze/LpsKYdlbamFW18nrw1tP52Cj5G0ndMIrolbp2+3IgdtOd1ErZNbRx57BrTE/5XYnF9WcKIaAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\frac{x}{2} + \\frac{\\pi}{2}$" ], "text/plain": [ "x π\n", "─ + ─\n", "2 2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(sympy.pi + x) / 2" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sympy.core.add.Add" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# co jsme to vůbec dostali za typ\n", "type(_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Můžeme také přičadit symbolům nějaké vlastnosti (to se pak pochopitelně může projevit v dalších výpočtech)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = sympy.Symbol('a', real=True)\n", "a.is_complex" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "b = sympy.Symbol('b', positive=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.is_real" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAQCAYAAABpyU3qAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAc9JREFUeJzV1k2IjlEUB/DfMJSiEbLDiCYrG0mKxkcSJdnbkBQpNhaUjpNi6SMLWYhiR8pCUrJSlMJCTTZmYzJZ+FjRlNGd7mJM7zvyzjMN/8Xzf+qce+//nud8PF2jo6P+R3SXR2b+rfoDEXHTTAtHtrCdQA8u48sE22szjK52qZKZg1iBlRFR3v8pdHe6MDN78R63cB7nsBVLsK26PS2uEXG2xfrBwhHR28K2ASexCYswjId1r6HiM8vUsQovUATcwXV863SzzDyIZ9hVL34JL3GocGYun1LEx6FE5UJEnJ4gYEsHovtwDeVr9EfEh3G27Xhca25fExEfblPcneAI5uD4eNEFEfEED7AnMxc0EfE3EfFDM9hYuT8z17ewL8Vs9DUh/KPmsLhyKczJML8J4e2G18/K7c5Y2GI+fK3cExGTFngTOd4Onysvm2jIzNV1uE3E88qb/7T5dAofqG1xb2aW3BxDZs7DlTZrrmIEF2uH+Q2ZOTczxy7VRKq0RESMZGZpXWfwKjPv1/N2oAyRoRZrBmofv4G3mfkI72qnKf27iP6ENdMZ8TEtOIXvOIzduIedNbKtLnwb6+owW4tj2I+SXndxtPi1/Vf51/ELdAKH+g4oRA0AAAAASUVORK5CYII=", "text/latex": [ "$\\displaystyle \\text{True}$" ], "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b > 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Zlomky" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGIAAAAUCAYAAAB23ujSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAA/VJREFUeJztmVuIVlUUx3+TYopRQg8JodlVehDLioTQqLQLFd0eeoluFPVSBEmQUP9ZgeVDd+yGRpo+1IOFdKMeCsTILtCFoCtdDBKNSrvQdJ1Ytga+2bP3OXPO980Mwfxfzsw5e6//Xmvtddn76xscHGQSE4/9JnoBk/gPU8nAzDYA5wCHS/o1N2YSzWBmJwDvANdKWpd+70tTk5mdBLwJrJB0b4Xgy4CN8W9WeMfYQ4BvgYcl3RDvvgIOK0zZJWk2PUY3nDkdmtrEzJ4FFgNHS/qlLiJWAT8Bj1Qsag6wBnBhB1CPCyINPpO83wvcnxk/bJE9RlvOkg5NbHJXbPIbgTuLjjCzY4BlwDpJvxUI+4AngO9jUSuox0Uxfmvyfo+kfsYXbTlLOozaJpLeMrOPgevMbLWkf0rF+mpPV8DTFQtyb54OXAXU1g8zOzDGPyfpb/6HsHodmtjkKWAusLwqNXk0ONH2woKOBVYDD0jaamZOXofzgGmA58cU+0denRsKfOA7bowd1oazqEMLm7weT3fEyyMiwsxmAscBH+U6JTObGoVoB7CSZiHt8l7JfJsdMldF3n4V+MzMTmXs0IYzq0NLm7wdz6WdLztT06HAFGBnQcDtwPHAlaX6kcLMpgNnAy9JGkg+e049IwwzE1gAPAbM8/FmtpDeozFnjQ6NbSLJm4WBiMhsajo4nj9mFnNyePweSW8weiyPDmJESEuy5NWHwPVm5l3HzUB/7MSeoSVnVocubOL4AfB2OBsRQx6dnhC6s54EPgVua0h4MfAH8EKDOY/mQneMUcU5QocubeKY0WHvERGxO4mMIfhu8LbWMWCWbqp9WGtma6Ng3RSL9TR3vufgCMfR4rt4euoYL2Q5K3RoZZOQ6Zt/FvBlyRE7Y0HzE4G/A48XFFgUOXIb8AnQGaJLw6m5bqkKi+P5BeOHEmdJh7Y2IezrR4T3so6QNGhmfli5xMyOkvR5vPcQuibHaGb9Qbohc8XhudYPLFsKLd+OtDszs3lxOnVsSr6tB67wXl2S/90IbThLOnRhk06nv1Z1jtjsjgDOAvY5og3ipHmh7wZJuzJDLvXiGI7/GvgZOBI4N2rUi8DdyZyhevZXy2U14hyFDm1xZpzVttQ5wmvF5cBDXZCdCMwp3OkM7Yb5sXNOidy8J8LZ+/KNHqHJnAVhvCaFvxvOOh0aw8wOCuc+L+mbutvXW+NCapGkd1sS+nyXc4SkYUWppbxZcY/jreIt3cqbCB1Cpt/aPggskeQboPKHofvipHhHF5yeW9/vlQLAEuBPoHgtPwboqQ5mNiMcuzl1QjYiYpJ3C6d5zpz8YYieIJoFr1PrJfnvIsPwL360z4Fbut5OAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left( \\frac{4}{5}, \\ \\frac{5}{4}\\right)$" ], "text/plain": [ "(4/5, 5/4)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r1 = sympy.Rational(4,5)\n", "r2 = sympy.Rational(5,4)\n", "r1, r2" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADoAAAASCAYAAAAKRM1zAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAA05JREFUeJzll1uoVVUUhr9zEonyBkEF6UNFSVB04YBFYZp0iNRSy7cshIyoKEMhSu33DwpfKo+VKMfIlHoIKnvQ0gejix0LgqLofrGotLCLlGWlnRgw1ma52mt79LCPD/2wGHutOeeY45/jMsfu6O/v5/+AYa0GbV8HrM/XeZLWVMavBS4FzgPOBUYCT0mKdS1h+yTgO2AlsBSYCUwFzgFOAf4C3gOeiEfSPzV6xgL3AVcAJwA7gQ0xJOnnYl5nC0PGAY8Cv7WwdzFwWxL9lsPD1bn/c8BsoBeYALwJLAeeBc4G4nCfsd3RxMbTgbeBucBbwMPAF8AdQJ/tIF7v0VQaJ/ljGrKwxtg7gW+Az9KzLx8G0Zmp/1Ug9rsK2Fj2nO17ksA1wKwkX0ZEw4nA7ZIeKa17KG27H7i5lmgsBC4DJqVsCkkNYrYHzND2qNT7tKQDwNYa/btsr0qDJ5WJpje7gR3AY9WlwE3AHNsLJO39T+jaPgtYBvRIitNuB6YBw4HnBzD375T7K98np9xSzV9JvwLbgOOAC+PbQURtD8vi8zUQYdMuRNjuDSNbTUp7rs/XlyrD41N+UrP805RnNgvde4HzgUsk/UEbYPvYrJAvStp3iOnLsiBtkrS5MjY65Z6atXtSjjnIo7YnpBcflNRH+3A5MOJQYWs76sQC4KPItcFu2plKw7PrMgyW0F7MyjtyY90E23Fl9QAfRC5K+qmFxwrPVlF8/6UcuiOKWAb21VTQXtu9WaTmD5RVhcAxwPSospKahpzt+Xkfvg9MkfRDjbqPUxZ2V3FGOYcLon8Cj9csuCDz9vVUPpiwnpjdS9OwtX1X5uU7EeKSdrfQVVxt3bY7K/fvSOBi4Hdge4NoFp4bazZfmkSfrLaAR1htw6AXmuyzJFu56HS6a8K1AUmf296Sd+mtQKNhCHXA8cDquEMbRI8UtmcA8QROTnmR7bX5e7ekhaVuK+b2Sfq+oueGJBnNw2vRsDRJnx2SCr0FbgHeAFbYngJ8mG3k5AzZRcXEQRHNHjeMLOO0fAJfldrHLmBc9rFVnJoycrgu/18B1jbxalepqb8ym/qealPfMVR/02w/ANwdhyDpS4YYnUO4V+Tnu0eDJEPp0aONfwGCaBxzmZrdmAAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle \\frac{41}{20}$" ], "text/plain": [ "41\n", "──\n", "20" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r1 + r2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vyčíslování" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "y = (x + sympy.pi)**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numerickou hodnotu můžeme získat pomocí funkce `N`. Často také využijeme metodu `subs`:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAQCAYAAACr+QluAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAA6tJREFUeJztl1uoVVUUhr+jRYR2Q1MpIrqC2gW7SdA9LEg6VNpbWg/aQ5kWGlFQv38hWmD3N4uy6CWxoki6+ZAeigRRNCIFUdOHLMwKLdP0xKCxZZ3l2nuvs6Kn+mEz95pzrjH/OeY/xpirp7+/n/9xNI5p/bE9ArgdmAxcCJwOHAA2Aq/FT9LhChvx7o3ALOBK4BRgd773gqQVNIDtu4A383GmpFcq5jwNXAacD4wEfge2A+8BL0va3cF+R85DCnPvBJYAE4GvgOeB5cAFQJB623ZPxQLPAJ8lwfeBxcCHwKnAdQ2dckZsDNjbZepDwDDg09gQ8BbwJzAf2JB2aML5iGKAzUBvTFBBGbYfA9YAU4A70lmtsZnAw8BS4F5JB0oEjm3glJ5UaJzgO8C8DtNPlLS/wsYCIHg/CtxXGqvFuadOjvHfzlmQ8nwg+44DdqR8zysv0BS25wDP5cndAKhdKHWwcTGwPlQhaVKhvzbnomI64WC2IdMWJqX0IuQO256cYRcnuEbSl3U3UiA+FliUcb7KdjimCW7NdkOpvzbnro6xHXOm5+NHhaHLsw2j63KB4nurgKmSfqyzk1wnku13GQa1YTvCbThwUuaNq9Ip4WSacC4m33ZYlAZWSPq40D8q24jXiMergROAi4BPgGuAZYPY3xPABOAeSSH1wWBehtyD6ZQ4wJsqDqU2546OsT0bmAt8C0wrDQ8phFevpD5JeyVtzLK/E7jWdpTDjrA9MVWyuEkIShojKZL2mCwQZ4cibF/SlHNbx9ielSXwG+B6ST+Vpvyc7TpJ20pEfwNa6rqiRgi9kVXxcf4BJO2S9G6oBRiRdhtxrnSM7ZDkS8DX6ZTvK6ZtKi1Wxp5sj++yn+F5QYvEu992f+uX4RFYkn2RNLtC0vY80PG2RzbhfJRjbD+S5XJ9OuWHNkZWZpyOs13l4FZi29plH38Ar7b5RYIM9OXzYMLstGwPNeE8oCrZDik/CazN5FUOnwGnYvuDvBS27h4tOyHlm/NkipUsxs4B4hK1RdLBTLQzqtawPT8T8tLyPcZ2qCxC55dSf2z4qUy0X0ja04Rz8Vvp7nTKIWA1MNt2mes2Sa8Xnu9P4s/mnSBO+CzgtrQzo0w8T+3MnDcgzgeJW4CFtvtSlXFTHh3JM5NvhH/ccsuoxbmomBgMDM2yV4XPgSOOkbTT9qVZanuz3P0KxKkslBSfEv8W4lvn3CzPsdGTgX2ZxOM+9GKV4utyrvVJwH8QfwE027Fm0rNRSwAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle 26.436$" ], "text/plain": [ "26.436" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.N(y.subs(x, 2), 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To samé pomocí metody `evalf`. Pro obojí můžeme zadat počet platných číslic." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$" ], "text/plain": [ "3.1415926535897932384626433832795028841971693993751058209749445923078164062862 ↪\n", "\n", "↪ 08998628034825342117068" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.pi.evalf(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pokud chceme vytvořit ze symbolického výrazu funkci, použijeme `lambdify`:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# první argument je seznam proměnných (podobně jako pro lambda funkce)\n", "f_x = sympy.lambdify([x], (x + sympy.pi)**2, 'numpy')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xa = np.linspace(-10, 10)\n", "fix, ax = plt.subplots()\n", "ax.plot(xa, f_x(xa))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symbolické úpravy\n", "\n", "Toto je velice důležitá aplikace, která nám může v mnoha případech ušetřit nemálo práce.\n", "\n", "### Expand a factor\n", "\n", "Začněme pracovat s polynomem, zadaným jako" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMMAAAAUCAYAAAAwRIk9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAABUBJREFUeJztmnmoVVUUxn9af1gSBUlJ0SRlBA020UDzYDRhg/0TWVIZFGaT0YDx9RWlUpRNFBWURVCRWGDRRDZYNFiaRVYUaQOaaVJkRZOxZPU4775zB5X3Ou96P7gc7j57n7PXd/Ya9x6wevVqOuigAxj4f0+ggw6qgo3LGm1PB44HdpK0ijaA7X2BucA4SQ826dt28gc6HNCQgwG1YZLt/YF3gImSbqPCsD0aOBwYAewFbAY8JumsOv1nAgcCu0j6pU6ffiG/7S2BU4ETgT2AbYE/gI+Ah+In6Z925iBgeyqwHzAcGAL8BiwGngbulrSCFjkoC5NuAn4G7qX6mASMT2X4roX+k4GhwIQGffqL/GcADwAH5MKdBswAdgfC4j1pe0CbcxC4DBgMvATcEcYQ+Au4Hlhgezta5KCbZ7Ad2vVpkCnpAnoZtsemFTtS0qvrMP5I4Fvgi/QQsxt5hhyzENg03X83y9nX8q8PB7aPykXwbFEO2/GR3wViEYyWNKPKHHj918AgSb+XtIdCXxsKLemiVjiozRnODQUBnigZ/CJwbC3BaX1CmHOAqZKupo8gaXZhHq0OezytRsjyQqvyV40DSa/UaV9q+7607kekt2hLDgJlipB4MpVhlzr3e3BQGyYdA/wNvF0y+EogNOhG2xsV2m9NAu7vS0VYD7yZ1yCBtZC/P3HwZ14jXNhQOTg5rwta5aBLGWwPzth7YVn1QNKHwKPAbsCYHBOad3lq4YX0D7yX18OKjc3k7y8c2A5vf3b+fX5D4cD2RNvX277d9huhrKkIU1rloOgZohoRmr6kwTuvA8Ityfb4dMXhYsaUVS6qCEk/pQzb19xqRf7+wMGUTKKfk1QbArUzBxNjPsClwCFpCEZK+qFVDoo5Q5TqAivrvU3SN7ajahFu8C7gLeA0SVHSawjbi4Ad6tyeXRLzT5cUyVVv4Edg65q2pvJXnQPbUR25IhPgNVa7Shy4F+WXNDTfETIdnEZhnu2TJH3QCgdFZYj6bGBQk/cWNe08Sb+2Mtks/W1R0xYueVQIDQRRRcyn97BJQd61lb+SHKSFjtLiJ8DRkuJDV42Dab29BiR9D8y0HQrwOfBIesqmHBSVYVmNdegB22dmorQ067SXtBojSppW8ryxScTD61JWWxfYHpgf5KuaW03lryoHtiM0uB34OBVhWRU5UB+uAUmLbYdhGGF7iKTlzTgo5gxLUtt3LXu47RNiwkn4nsBnwPm2S/tXGDHfASVWp6H8VeXA9lWpCPOzVt9QEdqRgwbYJq9RHWvKQZcySIrdt9djS9v2zsVRtiMheSo3uI7LpGRSepbYDu9PiG34QNceRTP5q8qB7esyNn4/PUI369fuHNgebnvzkvaBuem2VeQzkla2wkHtpltsopweguaubjw4YrpZQGTfx0paU2mQ9JTtOPA0yvahkqKc1aewfQoQv8CaBAo4yHZYrsBySVFlKGJkWopnSh7ZQ/6qcmA7avo3pCzx3gklCegiSf9x0XYcAOGlJtuek+HOikyI4zTCsAzjxtUZ24ODMmVYlnXqe9I6RIlqdVqCL2v6X5NnQm4paFpfIj5QLIoihuWPPLDVpQxpRUJ5ZkVFpOR53eTPMVXlYKe8Rik0coYyvJYhDW3KwctAzC081t6ZA6zKxDn2Qu4sKyTU46Ds1GoIdjOwj6R5tBFsXxwEAWHB5tTp07byBzocUJeDslOrkYx9nS64bWA7ymjxkWfUWwTtLH+gwwENORhY5+BTbNjMze35dsGOcW6mGDaVoY3lD3Q4oD4H/wKxpkbFq+kt3AAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle \\left(x + 1\\right) \\left(x + 2\\right) \\left(x + 3\\right)$" ], "text/plain": [ "(x + 1)⋅(x + 2)⋅(x + 3)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = (x+1)*(x+2)*(x+3)\n", "y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Polynom rozvineme pomocí `expand`:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALUAAAAUCAYAAADLE3ziAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAABF5JREFUeJztm1mIHVUQhr9JFI0oLmDwIa4oBnEJcQG3OCqjqA9GiRiCkgFjRA2IkqARQ/GjolHRBFTQFzOoLy4QFJeIGjGgomgSjKDgEjWgkLjB4G5GSmoufa/Xcbpvd99O0z80A33uOaf+qnPqVNXpGRgbG6NBgzpht146S7oeuAY4LF59BNxhZi9QM0haDlwKHA38BrwDLDezLf2WrUE7ptAbtgE3A7OBk4DXgbWSjqd+GAQeBk4DzgH+BF6VdEC/BWvQjoG8ww9J34cHe4QaQ9LewE/AXDN7vt/yNMgp/EhC0lTgMsCN/VZe42aQ41xgCXAqsD/wHfAhsNrMXsxxqn3ipPuBkiFpHnAWMAs4IWR50syuyLNPVfF/Nu55UUs6Dngb2BMYBS4xM5+gdEi6B1gWYdFzwA7gQODECB/yXNSrgU3BvWzcFgtzNLjOLKhP5TAZG+fhqT+J3b8v4N5gRNJg2gRK0jDwGHC2mb2RVghJVwfZEWCxmf3e0b572jEnmOt+4Ax/zOyvjGP0wvfGMOqn4X3XF9QnV5Rl47ZFLekVYMgXp5k9m3g/EMIsBFaa2S3jbTGwK8rxvqSTQ4FXURIk7QHcCXzVjWzI+UevXKP9AWB+GOZz+gAzay1ISYX1UUYd9dvGnZ7ad8EHwO2S1ia80H1B4NFJEPA40wUoE0NxBK0Cdkq6CDgW+BV418y6hQipuUrykOPyWNAfU38sy2E9lG7jtkVtZpslPR4CXwmskXQrcBPwFHBt8veS7ga8Jv11JB4LIq7xCcuEnw4EwY1BNinnm+FttvfA9aH43VxPDiUdFE2jZuZxau1gKXVUFRt3q1OviI4maUm4/HVOysx2dvzWDftExNWvxcQXmNlLlIvpCc/iNcozY5N5vdyP0DnA0z1yvS7GdJ7fJJ6l1BsrUuioEjbuWqeWdBcwfqx4eW7IzH7OSzpJW4FDU3QZMbPhCcbzmvjiuOmbaWZbE217xaab4RcnnaFI0VyL4Nsxtp+M69OU55SyTxYd9dPG/1X9aB3TnvDlbeSIi/breOcVlIsjs20JHPDS2UT4Mf5uTJJ1uOyS1kXiekqXElzRXIvgWza2Z9BR32z8r0UtaUEkAt9GeHFD3rGTma3qMu9wEF6TodzjuzRJvBPjFyTTyuZaEN/SoIw66qeN22JqSRf6hMCWiFV8oEWS/COeKsPjXI+jjpHULU8YTyq+qAHX0qBq6WjSNm41SvLLhGeiQH9+VAr8Fsq9+UoqDDP7EvDvLw4JT9KCpPOcT+zwl3d1rmVBFdNRGhv/kyhK8ljHj4Nf4pbss0SH9+ILvDlmtqHCt00zIok5OHa1l30OjxKc7/D5foFQBa698pXknPwhQgI3qF8EbYh3O8xsadY+RemoLBtPkXRkeLCx2JEtAgH/jthxLxWGmW2L+/8HgaNiNw/G7j49FnQtuEbCtTAeX5yOIxLv5mXtU2UdTcbGhXx62qDBrv5PAg0aUDX8DcYFrnq/3CinAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle x^{3} + 6 x^{2} + 11 x + 6$" ], "text/plain": [ " 3 2 \n", "x + 6⋅x + 11⋅x + 6" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = sympy.expand(y)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pomocí `factor` můžeme dostat zpět původní faktorizovaný výraz." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMMAAAAUCAYAAAAwRIk9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAABUBJREFUeJztmnmoVVUUxn9af1gSBUlJ0SRlBA020UDzYDRhg/0TWVIZFGaT0YDx9RWlUpRNFBWURVCRWGDRRDZYNFiaRVYUaQOaaVJkRZOxZPU4775zB5X3Ou96P7gc7j57n7PXd/Ya9x6wevVqOuigAxj4f0+ggw6qgo3LGm1PB44HdpK0ijaA7X2BucA4SQ826dt28gc6HNCQgwG1YZLt/YF3gImSbqPCsD0aOBwYAewFbAY8JumsOv1nAgcCu0j6pU6ffiG/7S2BU4ETgT2AbYE/gI+Ah+In6Z925iBgeyqwHzAcGAL8BiwGngbulrSCFjkoC5NuAn4G7qX6mASMT2X4roX+k4GhwIQGffqL/GcADwAH5MKdBswAdgfC4j1pe0CbcxC4DBgMvATcEcYQ+Au4Hlhgezta5KCbZ7Ad2vVpkCnpAnoZtsemFTtS0qvrMP5I4Fvgi/QQsxt5hhyzENg03X83y9nX8q8PB7aPykXwbFEO2/GR3wViEYyWNKPKHHj918AgSb+XtIdCXxsKLemiVjiozRnODQUBnigZ/CJwbC3BaX1CmHOAqZKupo8gaXZhHq0OezytRsjyQqvyV40DSa/UaV9q+7607kekt2hLDgJlipB4MpVhlzr3e3BQGyYdA/wNvF0y+EogNOhG2xsV2m9NAu7vS0VYD7yZ1yCBtZC/P3HwZ14jXNhQOTg5rwta5aBLGWwPzth7YVn1QNKHwKPAbsCYHBOad3lq4YX0D7yX18OKjc3k7y8c2A5vf3b+fX5D4cD2RNvX277d9huhrKkIU1rloOgZohoRmr6kwTuvA8Ityfb4dMXhYsaUVS6qCEk/pQzb19xqRf7+wMGUTKKfk1QbArUzBxNjPsClwCFpCEZK+qFVDoo5Q5TqAivrvU3SN7ajahFu8C7gLeA0SVHSawjbi4Ad6tyeXRLzT5cUyVVv4Edg65q2pvJXnQPbUR25IhPgNVa7Shy4F+WXNDTfETIdnEZhnu2TJH3QCgdFZYj6bGBQk/cWNe08Sb+2Mtks/W1R0xYueVQIDQRRRcyn97BJQd61lb+SHKSFjtLiJ8DRkuJDV42Dab29BiR9D8y0HQrwOfBIesqmHBSVYVmNdegB22dmorQ067SXtBojSppW8ryxScTD61JWWxfYHpgf5KuaW03lryoHtiM0uB34OBVhWRU5UB+uAUmLbYdhGGF7iKTlzTgo5gxLUtt3LXu47RNiwkn4nsBnwPm2S/tXGDHfASVWp6H8VeXA9lWpCPOzVt9QEdqRgwbYJq9RHWvKQZcySIrdt9djS9v2zsVRtiMheSo3uI7LpGRSepbYDu9PiG34QNceRTP5q8qB7esyNn4/PUI369fuHNgebnvzkvaBuem2VeQzkla2wkHtpltsopweguaubjw4YrpZQGTfx0paU2mQ9JTtOPA0yvahkqKc1aewfQoQv8CaBAo4yHZYrsBySVFlKGJkWopnSh7ZQ/6qcmA7avo3pCzx3gklCegiSf9x0XYcAOGlJtuek+HOikyI4zTCsAzjxtUZ24ODMmVYlnXqe9I6RIlqdVqCL2v6X5NnQm4paFpfIj5QLIoihuWPPLDVpQxpRUJ5ZkVFpOR53eTPMVXlYKe8Rik0coYyvJYhDW3KwctAzC081t6ZA6zKxDn2Qu4sKyTU46Ds1GoIdjOwj6R5tBFsXxwEAWHB5tTp07byBzocUJeDslOrkYx9nS64bWA7ymjxkWfUWwTtLH+gwwENORhY5+BTbNjMze35dsGOcW6mGDaVoY3lD3Q4oD4H/wKxpkbFq+kt3AAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle \\left(x + 1\\right) \\left(x + 2\\right) \\left(x + 3\\right)$" ], "text/plain": [ "(x + 1)⋅(x + 2)⋅(x + 3)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.factor(z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`expand` můžeme použít i pro trigonometrické funkce:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\sin{\\left(a \\right)} \\cos{\\left(b \\right)} + \\sin{\\left(b \\right)} \\cos{\\left(a \\right)}$" ], "text/plain": [ "sin(a)⋅cos(b) + sin(b)⋅cos(a)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.expand(sympy.sin(a + b), trig=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Zjednodušování pomocí `simplify`" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPCAYAAAA/I0V3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAJBJREFUeJzt0qEKAlEQheFvxarZbBCbvoHRajAKZqOwURjuw/gcBt9DEIxG+8qFDcviwlpM/jBhhjnMGThFVVW+ZdhsUkpbrLDEAiOcI2LXKcKpXn7hgfmnS4NWf8QMYxx62YuIS8Nq50/tS734i2p+JyqagU0pbZArM8EaN1zr2TMiynb2clD3rdm0rswd5RtxyRu/BTa7LAAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle 1$" ], "text/plain": [ "1" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# tohle by měla být hračka\n", "sympy.simplify(sympy.sin(a)**2 + sympy.cos(a)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Derivace a integrály\n", "\n", "SymPy umí symbolicky derivovat (je tedy aspoň tak dobrý jako cvičená opice) a i integrovat." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\left(x^{2} + \\sin{\\left(x \\right)}\\right)^{2}$" ], "text/plain": [ " 2\n", "⎛ 2 ⎞ \n", "⎝x + sin(x)⎠ " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = (x**2 + sympy.sin(x))**2\n", "y" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\left(4 x + 2 \\cos{\\left(x \\right)}\\right) \\left(x^{2} + \\sin{\\left(x \\right)}\\right)$" ], "text/plain": [ " ⎛ 2 ⎞\n", "(4⋅x + 2⋅cos(x))⋅⎝x + sin(x)⎠" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.diff(y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Derivovat můžeme i funkce více proměnných." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\left(x^{3} + 2 x^{2} y\\right) \\cos{\\left(y \\right)}$" ], "text/plain": [ "⎛ 3 2 ⎞ \n", "⎝x + 2⋅x ⋅y⎠⋅cos(y)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = sympy.Symbol('x')\n", "y = sympy.Symbol('y')\n", "z = sympy.cos(y) * (x**3 + 2*x**2*y)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tohle spočítá\n", "\n", "$\\displaystyle \\frac{{{{\\rm{d}}^3}z}}{{{\\rm{d}}x{\\rm{d}}{y^2}}} $" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle - x \\left(\\left(3 x + 4 y\\right) \\cos{\\left(y \\right)} + 8 \\sin{\\left(y \\right)}\\right)$" ], "text/plain": [ "-x⋅((3⋅x + 4⋅y)⋅cos(y) + 8⋅sin(y))" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.diff(z, x, 1, y, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Integrace" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\sin{\\left(x y \\right)} \\cos{\\left(x \\right)}$" ], "text/plain": [ "sin(x⋅y)⋅cos(x)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = sympy.sin(x * y) * sympy.cos(x)\n", "f" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\begin{cases} \\frac{\\cos^{2}{\\left(x \\right)}}{2} & \\text{for}\\: y = -1 \\\\- \\frac{\\cos^{2}{\\left(x \\right)}}{2} & \\text{for}\\: y = 1 \\\\- \\frac{y \\cos{\\left(x \\right)} \\cos{\\left(x y \\right)}}{y^{2} - 1} - \\frac{\\sin{\\left(x \\right)} \\sin{\\left(x y \\right)}}{y^{2} - 1} & \\text{otherwise} \\end{cases}$" ], "text/plain": [ "⎧ 2 \n", "⎪ cos (x) \n", "⎪ ─────── for y = -1\n", "⎪ 2 \n", "⎪ \n", "⎪ 2 \n", "⎪ -cos (x) \n", "⎨ ───────── for y = 1 \n", "⎪ 2 \n", "⎪ \n", "⎪ y⋅cos(x)⋅cos(x⋅y) sin(x)⋅sin(x⋅y) \n", "⎪- ───────────────── - ─────────────── otherwise \n", "⎪ 2 2 \n", "⎪ y - 1 y - 1 \n", "⎩ " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(f, x)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\left(\\begin{cases} - \\frac{\\cos{\\left(x y \\right)}}{x} & \\text{for}\\: x \\neq 0 \\\\0 & \\text{otherwise} \\end{cases}\\right) \\cos{\\left(x \\right)}$" ], "text/plain": [ "⎛⎧-cos(x⋅y) ⎞ \n", "⎜⎪────────── for x ≠ 0⎟ \n", "⎜⎨ x ⎟⋅cos(x)\n", "⎜⎪ ⎟ \n", "⎝⎩ 0 otherwise⎠ " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(f, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generace kódu\n", "\n", "Automatická generace kódu vlastnost, kterou oceníme ve chvíli, kdy cheme implementovat naše analytické výsledky v numerické simulaci. Místo abychom začali ručně přepisovat do programovacího jazyka jako je např. Fortran nebo C, může SymPy tuto nezábavnou práci udělat za nás. Navíc při tom neudělá chyby (pravděpodobně).\n", "\n", "*Pozor, tento module je work in progress.*" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle e^{y} \\sin{\\left(x y^{2} \\right)}$" ], "text/plain": [ " y ⎛ 2⎞\n", "ℯ ⋅sin⎝x⋅y ⎠" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# řekněme že chceme někde použít tento výsledek\n", "f = sympy.sin( x * y**2) * sympy.exp(y)\n", "f" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "import sympy.utilities.codegen" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "!******************************************************************************\n", "!* Code generated with SymPy 1.13.3 *\n", "!* *\n", "!* See http://www.sympy.org/ for more information. *\n", "!* *\n", "!* This file is part of 'project' *\n", "!******************************************************************************\n", "\n", "REAL*8 function f_fortran(x, y)\n", "implicit none\n", "REAL*8, intent(in) :: x\n", "REAL*8, intent(in) :: y\n", "\n", "f_fortran = exp(y)*sin(x*y**2)\n", "\n", "end function\n", "\n" ] } ], "source": [ "f_source = sympy.utilities.codegen.codegen((\"f_fortran\", f), \"F95\", \"f_fortran\")\n", "print(f_source[0][1])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/******************************************************************************\n", " * Code generated with SymPy 1.13.3 *\n", " * *\n", " * See http://www.sympy.org/ for more information. *\n", " * *\n", " * This file is part of 'project' *\n", " ******************************************************************************/\n", "#include \"f_C.h\"\n", "#include \n", "\n", "double f_C(double x, double y) {\n", "\n", " double f_C_result;\n", " f_C_result = exp(y)*sin(x*pow(y, 2));\n", " return f_C_result;\n", "\n", "}\n", "\n" ] } ], "source": [ "f_source = sympy.utilities.codegen.codegen((\"f_C\", f), \"C\", \"f_C\")\n", "print(f_source[0][1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Další možnosti SymPy\n", "\n", "Ukázali jsme si základy práce se symbolickými výpočty pomocí SymPy. Není v našich silách ukázat, co všechno SymPy umí -- je toho opravdu hodně. Přehled můžeme získat, podívame-li se na obsah v [dokumentaci](http://docs.sympy.org/latest/index.html):\n", "\n", "* SymPy Core\n", "* Combinatorics Module\n", "* Number Theory\n", "* Concrete Mathematics\n", "* Numerical evaluation\n", "* Functions Module\n", "* Geometry Module\n", "* Geometric Algebra Module\n", "* Geometric Algebra Module for SymPy\n", "* Extended LaTeXModule for SymPy\n", "* Symbolic Integrals\n", "* Numeric Integrals\n", "* Logic Module\n", "* Matrices\n", "* Mpmath\n", "* Polynomials Manipulation Module\n", "* Printing System\n", "* Plotting Module\n", "* Pyglet Plotting Module\n", "* Assumptions module\n", "* Term rewriting\n", "* Series Expansions\n", "* Sets\n", "* Simplify\n", "* Details on the Hypergeometric Function Expansion Module\n", "* Statistics\n", "* Stats\n", "* ODE\n", "* PDE\n", "* Solvers\n", "* Tensor Module\n", "* Utilities\n", "* Parsing input\n", "* Physics Module\n", "* Category Theory Module\n", "* Differential Geometry Module\n", "* Contributions to docs" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.12.5" } }, "nbformat": 4, "nbformat_minor": 1 }