{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"AeroPython\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Mecánica con SymPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Si SymPy te ha parecido hasta ahora un CAS decente e incluso interesante (nada como tener los resultados en $\\LaTeX$ incrustados en el notebook y la sintaxis de Python para hacer cálculo simbólico) entonces espera a ver el paquete `mechanics`. Con él, podremos manipular velocidades y aceleraciones de sólidos expresadas en distintos sistemas de referencia con una facilidad impresionante._\n", "\n", "_Tienes disponible la documentación de `mechanics` en http://docs.sympy.org/0.7.5/modules/physics/mechanics/index.html._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sistemas de referencia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El objeto primordial que vamos a manejar van a ser los sistemas de referencia. Podremos definir relaciones geométricas entre ellos y de esta forma las transformaciones de vectores entre un sistema y otro serán triviales." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La manera usual de empezar a trabajar con SymPy es importar la función `init_session`:\n", "```\n", "from sympy import init_session\n", "init_session(use_latex=True)```\n", "\n", " Esta función ya se encarga de importar todas las funciones básicas y preparar las salidas gráficas. Sin embargo, en este momento, esta función se encuentra en mantenimiento para su uso dentro de los notebooks por lo que activaremos la salida gráfica e importaremos las funciones de la manera usual. Puedes consultar el estado de la corrección en: https://github.com/sympy/sympy/pull/13300 y https://github.com/sympy/sympy/issues/13319 ." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from sympy import init_printing\n", "init_printing()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sympy import symbols" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Todo lo que necesitamos está en `sympy.physics.mechanics`, incluyendo la clase `ReferenceFrame`. Nada más crear un sistema de referencia podemos acceder a sus versores unitarios: `x`, `y` y `z`.\n", "\n", "http://docs.sympy.org/0.7.5/modules/physics/vector/vectors.html" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from sympy.physics.mechanics import ReferenceFrame" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAABHNCSVQICAgIfAhkiAAAAX9JREFUSInt079LVlEYB/CPb5KkORQiGrlIg4JLOLRrq0Vb/0GbQyCNrWmz0OAktDhIQyQl6CAEJdGUFhI29BMpaSrItOE8L/f2ct9XvFw3v3A4z/3ec77fc57nPG1a4zKuR7yAjUPWHxndeI99HOANzlRtMh/ik7gT8WyVBjdD9G6OmwluokqjE7TEeUxjGdv4iT/4jueYUsHrGpEK22q8QtdRhU/l4h6M4wme4jHW8A1DqKEfu9LNSpnsSH2wLjXg6Tj9F1xEb6xrl3qoFM7hkazDm413ZQ1g8RDx+vhQ1qATezmhFVySpXOhwORajrsa3JgsEzcaTS40nPZ27l+vVK+imzwIbht9MR9grugm7dKrqQv9kHrmHj5pnq5OvA3+a8xbOFtkQmq2ohp8xLMmJjAqS/VfXGkUruXi+7iFTanTd/AwNn1udjLpeddrV8Ngi7Wl0Cer1+uYdzFQlUEblkL4JTrwIr5X/Z+l0pgMwd8YDm4Iv4KfqsLkBMeDf2Znhpb4sDYJAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\mathbf{\\hat{a}_x}$$" ], "text/plain": [ "a_x" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = ReferenceFrame(\"A\")\n", "A.x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y para definir vectores solo tenemos que **multiplicar cada componente por su versor**:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFYAAAAcCAYAAAD7lUj9AAAABHNCSVQICAgIfAhkiAAAAv9JREFUaIHt2E+IVWUYx/GPOjiktihlEMd2LlTaVFCrNuaiTanoIjcmKEMWSQRDEERDG3MQRCxwUSGiDAyCrkoSNEEGGxUh6R81zBDNVEaaIDiYelu87+Wcuc49473eM+fOzP3By3nPc973fb7nvP+e98zTWD2DDTHfjx8a3H7eakr+xzGE+yjhezxWKFFtalr+IwLQbrwX858WSlSbmpL/tQjyYcrWG22vFEJUm3LlX4qdOIFfcRs3cR47MP9RHcxVvSH00BiOYQ++wL/RfhzzCqObwVonDPvKkbkcvwkfd/N0Q812vS982IMp25PYi9MYFpaN//APBtCtSXbVKmoK/m7hw+5P2Z6Otqx0GYvzhqtTufK3PWSZbTF/KmW/j58wiD9xAwuxBltivWexC/vqgctZufIveIgyvdiIL/FRyv63EOddjJALhV7+AyvREcu1CTFis6lQ/t3R2Y/CmpTWEzgpOalUSz83iGVkCj+V6egU7eXKn7UUvIUDwnn5JVyveP655FydpfZ6wCbREMZrKD82xfPp5gfvCL11VTIl0lqEu5JePYNVkqWlP/VsJFXv1ZR9fbStk4yaTQ18hyzVy98XbRcq2huI9r4sp+Vz8hUsq1JmhYnT5d3Usw5h/ZoMDA5F+7AQIw/H+8+yoBqsevlfTNnXRlunZGC8XM3hB7HAJQ+uqWm1Cbto2cl1ISb8GKMV0CMVdRcJu3FJ2I1L+AVLMvw1Wo/C/120lyOFt+P9qCrBwOuxwF0hXu2ZJG1PlS/HtpXpd3ydAQbPSabiPbww6evnq3r5y0f/v4QOOhfv91Zz1FPFUTp9U1GnS9jc7uCasBN34nAGGGHTSLe7tRpUzqqHf4lwSivF+vdifs10AGdpuWQNuxKvN/BUkVA16hOB+1a8DhaLE/6OfSWBace38f6smfNrcq2JM+7NYnGSA8e4ZOqsFv79loR1b6borORdsjb6lmrUQeHD9hcNMlvUJRyF7wjx6/PF4sweHZaEZTuLRWmppZZampv6Hx28SskFCjU+AAAAAElFTkSuQmCC\n", "text/latex": [ "$$2\\mathbf{\\hat{a}_x} - \\mathbf{\\hat{a}_y}$$" ], "text/plain": [ "2 a_x - a_y" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * A.x - 1 * A.y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De ahora en adelante, para trabajar como si nos enfrentáramos a un problema de la escuela, vamos a hacer dos cosas:\n", "\n", "* Definir un sistema inercial $1$ del que partir, para así poder referir todos los demás sistemas a él.\n", "* Que los versores de ese sistema sean $i, j, k$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE8AAAAXCAYAAABK6RIcAAAABHNCSVQICAgIfAhkiAAAAWtJREFUWIXtlr1KA0EUhT80QQQFH8EHsBCsrEyjNoJgIUqaBR/ARgsfwF58AbUVCwXBZxALLUSwMmqpWFhYGKMWM0Mms7uTn12drN4PBuZm7uQcTrI3ASEXIuDLWuOi7WfgZ/z8D0rW/gLYtOqXX/QRUrsviFBf+0rB9M29TI9tz2+SAyG1fVSBD5q+DoGyOZSZl04VOAAGdb0HrAJ10yDhJeMGtwusAQ27ScKL4wa3DayjHttUIjqfOzWnt93ab2O4G+289V1te234TJR8hx52gDHntUlgEfWp1Zyzqx51Quo3gLtOmyOy/eKZ+5Uu7+WhnUXf1b6x9u/AQtpFmXlxVoBLvS8DR8BsUqOEF+cVmAdudT0EnAAzbqOEl8wTMAc86noYOAWm7aZ+Cc/18RnERSsPqACfdT0CnAFTwRylsEXr0B4Na6cYTKAG9D3N4K6DOioQx8T/mC4HdVQgTHhvwDmwFNaOIAh/nG8UQodPDJteqgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\mathbf{i} + \\mathbf{j} + \\mathbf{k}$$" ], "text/plain": [ "1_x + 1_y + 1_z" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = ReferenceFrame(\"1\", latexs=['\\mathbf{i}', '\\mathbf{j}', '\\mathbf{k}'])\n", "A.x + A.y + A.z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y para no tener que hacerlo siempre, un pequeño truco de magia:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Definimos nuestra propia clase para que los versores sean IJK\n", "# aeropython: preserve\n", "class IJKReferenceFrame(ReferenceFrame):\n", " def __init__(self, name):\n", " super().__init__(name, latexs=['\\mathbf{%s}_{%s}' % (idx, name) for idx in (\"i\", \"j\", \"k\")])\n", " self.i = self.x\n", " self.j = self.y\n", " self.k = self.z" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAXCAYAAADjndqIAAAABHNCSVQICAgIfAhkiAAAAbxJREFUaIHt1zFr1VAUwPEftUXECn6EDo4OQieX9i3VRRBEROkS6OLm0g5+gO6lX6B1FYWKgp9BHNRBwcliwcXSoYKDtuqQlKaheS95eUle6v3DhZzcd879w7ncm0egc0T4mxozbcrkEPlPHSdGUSRQP5Op57dYScV7DbsUoQuOZ4ZIfCT02tXoS2R4x6Pc2o6+WhYYMZHxd+zHIg4c+z/FVJHEcEc1xyKe4FwSb+ABfhdJDo1qhmyT1rGEw6IFQqPqJ9ukVTwSH31DEck//+fwEt+SubsFa25nag4am2fQMT2Wc3IGuk9mX+RwER/E5+rzgjmwhsuZd9dwW7zLtjNz70vUzjLujof4kjNXyj1S7IuqzG7tt06vQm6XHD+lnn/h1oD8U93DHVU/9/EueZ7CMyyULRIaVT/7uInPSXweLzBfpkhoVDN8xw3sJPEFvML1ogW61qis759WLIbjq7hZu0k8jdeYrWvBqhd1FR47eVFfyvldm45VqfR5Po0rqXhG/Am7J94pdXM1GQ9T7z7iRypu27EKI3PvGe7P36jYOmXte2PmWIWe7rqf4KhRP/EGd9rVCQQCgUAD/AOB27YNUUtaogAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\mathbf{i}_{1} + \\mathbf{j}_{1} + \\mathbf{k}_{1}$$" ], "text/plain": [ "1_x + 1_y + 1_z" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = IJKReferenceFrame(\"1\")\n", "A.i + A.j + A.k" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Álgebra vectorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nuestros vectores funcionan también con símbolos, y podemos realizar las operaciones de producto escalar y producto vectorial con ellos." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "R, V = symbols('R, V', positive=True)\n", "r1 = R * (A.x + A.y + A.z)\n", "v1 = V * (A.x - 2 * A.z)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJMAAAAXCAYAAAAPxH3bAAAABHNCSVQICAgIfAhkiAAAAtxJREFUaIHt2U+IVWUcxvFPk0NEE0hCizYVBhW0mLRFQeRFMF2IVlo4zMILboaBNmILoY1I0CKcaC1ZK2EqUpIKWrRoFSk1i/HPymEEFxYiKhJOaovzHuZ458zhnLnn3nvmzPnCy3vef+f3PNz3vvd930tDQ0Vo40EiPTdIMSXT1ngrxFBK3S8dgR7gGn7D+2UEHRB19UVFvK1LqdsUxBwN+Tq8hHfwJg5iKvT9Ax8lxl7vmdLuKeKLenvrCxuDmIspbROhba6fghK0Q/zWCsZW2Rf99xbH6+nP3GshP5fS9+eQP91rUT2gqC/q7S2Lcfxn0fc0hvMMXG4ynU3p+0LILxQQVhXq6otyvY3jazwayicwhoU8g/OuTBvwWXj+NKewKlFXX5TnrXMifYEDuJdXSHID/gheDc+7sDW8+NlQHsIkvsn78opQV1+U520cRyxOpE/wcTfCXrT0eBmn29iRMqZt+X3FW/gBV0Pb3gJa5jK0pKWvSva11rwl06GMeJm+kytTvFx+KVre4CnsxzGcxPO4kREsyROYEf3ufpdzTMznWN9RN4rdoqV4rqPtr4x3le2L+nq7h8sZ7bl9T4lm22RK23Ro+7Cjvi3fiafotzeNOFar4LiV+ErGWwveziee72JnjthLfCc34FlHzOMhH8sRpGrU1RfleduHP8PzML7FtqJihhL5qOh+YSal36+ipfJ1PFM0yACpqy/K9XYT23EplB/DaWwpKghexghm8W9KvwX8KDo9vFskwICpqy/K9/Y33saVUH4cZ/BGXkHxZNoc8rTlMub7kO/J+/IK0I2vzju4+6UoKo9efGbzogn1TyiP4KdErEpQxia13xz28Cb1yWX6rUZvZZB5NVA2Ixav84lOQ6Oif9/nexi3W14JaSJRN4tbifJq9dYtA/PdUvwSrgqcslTzBx19Wil9VoO3bmlZm75XTDyZ7uB3vDdYOQ0NDQ0NDQ0V4H+/8E3rnfyguAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$R\\mathbf{i}_{1} + R\\mathbf{j}_{1} + R\\mathbf{k}_{1}$$" ], "text/plain": [ "R 1_x + R 1_y + R 1_z" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r1" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAAAXCAYAAAAIqmGLAAAABHNCSVQICAgIfAhkiAAAAvRJREFUaIHt2F+IVFUcB/BP6hK6i1ChRCgsJNIGUeK7joWCkE+WKMY2UA9BEj0sBIkgEoSiRUXgk2uiL5H4YElQD6JCL0JFsIUYmYkPBbmBqevuUg/nbHu9c+/MvevMzkzMFy733vP7c37zPef3O7879PC/RxX/JK7BdgbTAahqAR8LEs87ouOPC9gdjroHmhFEi/EIXsUpXMZt/IULeMW9HMygY7l4Mk52roHeGkzjGp7GSOJa2soA54jXhN91HSfwLo5gPI5/hgdSNnPhYsA8VJaFwi670UDvQgxgW7MDaBGexRa1GfMorgq/ZWtKNlcuquah/F+MzlfkyF+K8q/nM6gW4m0h7o8yZGW5oD4fOzGVkH2KviJBpnfX9/H+VIbuAPZjEruKOO8CTMb7VIasmVzsxCdChsKocO5N5lokUGaR9uAxvIefijjvcCzCcHz+MkPeLC7SC/Sh0LBMlwk2iYqQisdS46sxgd/Qnxiv6t5yd1CI+YsceUU5LqjlY7d7S9w79x82D0Vn36bGz8TxFxoENZiQrcNpoavKsq2HKym/ja7jJXzDG9HuRzyco1OWC2r5SF4jOfM05GlR6v2GsEOGomxK6Iw24yuhXS2KfqFkjOJkCTv4GXdK6F8vofs6PsAYnsOfOXrN5GIav+TI5sTTaWFFh/Cg8AE4IaR5GlXFyl3ZTGoV3hRi+QHLC+iX4YJaPsYSz3fxfIP5MnnK+tpOHpgjeByHcKnBBJ2Ot/A+vsMG/F7A5n652G62XPYJ2bexoG1dvCis6Chu4lcsydGt6o5M2hNjuCj/DMpCGS7I5mOZ0AHOjN3C+hz7QmcSs7unGu/D0XG34mXsE86F80LTkMYVHM0YbwYXf2CT8O/ESizG53Hsm5K+/sMC/C2satb3QxJVnZ9JezXuDs/m2Jbhgvp8PCEs2IxsHGtT9m2tOO0ud92CwuWuWRjAqsT7IJ4RWt6rLZy329BWniqyS8vRVk/cZajo8dRDDz300EOX4F/etym+OEVKOAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$V\\mathbf{i}_{1} - 2 V\\mathbf{k}_{1}$$" ], "text/plain": [ "V 1_x + -2⋅V 1_z" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v1" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from sympy.physics.mechanics import dot, cross" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAASCAYAAAAdZl26AAAABHNCSVQICAgIfAhkiAAAAdtJREFUSIntlU0opVEYx38uInM32MmC6OrSLJS1LFnYyCUlFrMZn6U0a2LBNFgpCzNKc5uSnZKaicKS3FmRqCvTLJTIt3wuzqOu45xzL97l/dfbed/n/3+e59/5eiGJF/gNPGjPAbAChAz6JtGMJ1B7QrRfPXFqwSFwD/QDfcAgMAvcSvMeTV8q8eU4dcuBO+Af4PfO7nMUiZktA/dZuKgWTwUugaM4tVclv+F9Ft1olCZhA1cg3IWBWxMu31K3Wfg/OuF7i0sHKmIM6SiWcdPA/ZXxo4HzA8PADdD5LncJYAk1U5VaPBeICGc6yN3CfTFww8INeWfTjBTgWJp9Qx3gAWBa4idAmyW3SvKmtXgAuAb2gQ+JmIjy8gp0PT9jckscujOg2tE3W3QbWnxe4vW2xDTtexe4cjTS8T/m/Wn//wA+yXsO0AqMAr+AQtRq6DhCzXJQPN0CtUAN6r8y+wpPb8YYarbaDdyMcF2O/DnRBIEMYAe1fQKupl7eQk8rsG7gJmVscuTH3kS9qH/KCLDtibs48AGnqKsu08Cno7bJPZBnqRFCrcAU6szsAVmeO7WgTJpHHJqwaDosfIDnB7/OS4Px0CJNvzs09aJZtPA+4Fw0C566SyIJOx4Bb7KDbgWtFTMAAAAASUVORK5CYII=\n", "text/latex": [ "$$- R V$$" ], "text/plain": [ "-R⋅V" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r1.dot(v1)\n", "dot(r1, v1)\n", "r1 & v1" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAAAXCAYAAADwZlg5AAAABHNCSVQICAgIfAhkiAAABSJJREFUeJztm2loHVUUx39NE1xaqbVqpbjUBU0kYtV+8IO0T0VpweIWl1hJBxeIKyIBUSkWF3CJ1gUXRK0WRSiWFqpWqBu2ImJsEqWtiuKzhbrWplWjbVLjh3OGN+++O/Pm5U0y8573B8N9OefcO/f+uXPnLhNwOByODOABI4FrZpqVqVE8nIYmHmOgSUMShSjTgOuAVcC3wN/ALmADcG2Ze62juHEjwC/AeuAyS3y7xjwdo17PaezDcRqRER4C3gO2ITr+DvQC9yA623AallLTmkxIsKxO4FngR+ADYCswHbgEmAKsRAQZseTdAUwF7lN/I9AMXARMBG4HlgbiTwY2ISLPiajTaUCP1qkZOAaYH/A/D+yO38RxYy+wEdiMdKZJwJnAbGC7/t5m5HEaljJemrQBywL+Y4F8Eg1IinOABZS+IY9AHtQR4FJLvuPV95XF16m+vGGfiLxRdpap0wbNf3mZuKTx9L65UebfP8T+gJb7jGGvRw2rZTw18ajhqf5dSKWfsviuUN9rFt9M9Q1afD3qOzLknler/92AzWN8RPTvk0u43FO13HWGvR41rJasaLIQGA74VgBNcRqQ5JoziiFNhy2+2Zr2WHwnaLrF4uvX9BSLbzKybhsCbo5Zx1pggaZfGHanYSlZ0GQh8AryRgaZ+rZTeB4iaYwTVCWNQIf+fsfi90X83LBPA7r194OWfEER1xq+xcAMREjbtKZW6EI6xBREp7OQB9PUw2lYStqamA/mk8Bt2PdcUqMbqdBbFt8EYED93cASZPG+XO27gRtCys1pvuWG/URgD7JhMsnwedTWtPYniuu7FtlkC1KvGlZD2prcTfFU9v7RN6VA3rhJuevVMuXdqnFbgEMs/pMiyv4TmBdR9lSN6zXsb6u9zZLHI7xjzQHWILuhYflt5CPaYLtejllukOnAxcDXWr/TA77/o4bl+l3amgSvrpD7lNXKnNZ+B/wTUXGT7RG+m4AnkOOAc5GzOhN/6vESchYK8hAvAh4DXke2pQcseXcio1gL0o5hZE02H9kweaOCdoCMhv3IumBlBfkeBw42bLOAC5FpTd7w9VVYL4CfkfPjjcA3yKjeqr560DDJfgfZ0WQf8H2Ib7RaVY0/t/4SODwibqnG3WjxrVDfLRH512hMC7Af8vHDHmQKYsMj3pSsklE/6j65KsoIo1fLPlT/rlcNqyFtTTYHfu8FLihTX6tWY7FbewciTh9wNnKIHkbYoh3gBU3bI/IHF+9dyNnWo8jbpV6Zoek+TZ2GpaStyZUUpsVNyNv2vJh5x4zFyCjQg32NGaQB+APZVrYdujchU4x/KXRIE/+Lo2XIWuIH4MCIe3pk/83ZjHy4YdJA4SOEjwO2etVwtGRFk8OQHV3fNgjMDckfa81ZDYuAe5ERfT2yGWSSp7Ah0oIcE/RjX28MIYvwq5DNENv3jv4I52nagf1guZaYBzwCfISsxXYgG0JzgeOQHdzrNdZpWEpWNPkVOB/5mugo4ADgTbV9UmFZVbOE8rtsHwbiO9T2YkSZbRrzfoi/AfhLY2xnqCYe2X9ztiIdpg/4DdmQ2AV8hmgcnJGkoeE1FGt4dEhcWm/OrPWrZuRB9X0DwBlG/jTX5zWHEyucOynuiAeFxDkN4zPm09paZzKFz7pARr9ZyBHQ1jQqlDFa9eoM2DYh6zsfp2F8nFYVkCO5jwbqkdWUamP+p0rOEuM0tJPDaeVICP/hHAQ+Rf5P1+FwOBwOh8PhcDii+A9eQaPQhbhp1QAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- 2 R V\\mathbf{i}_{1} + 3 R V\\mathbf{j}_{1} - R V\\mathbf{k}_{1}$$" ], "text/plain": [ "-2⋅R⋅V 1_x + 3⋅R⋅V 1_y + -R⋅V 1_z" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r1.cross(v1)\n", "cross(r1, v1)\n", "r1 ^ v1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos hallar también la norma de los vectores con su método `magnitude` e incluso normalizarlos con `normalize`:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEkAAAAbCAYAAAAwNaIgAAAABHNCSVQICAgIfAhkiAAAA09JREFUWIXt10loXWUUB/BfXlIVqZA2ICKKC7USsQtFhKiLqDii4pAW6lAUXEixRdGVoEQstFpxVhQUBV1Vd0IsjmCDbhQbQWutQi1diUVxrrGJi++EvN53x9A0Ud4fPr77znQP553p0kUXhwM9DeWPwy/z4UgDNPX5iGMEly+0E4sdz+KohXbiSKPVQLY3zt/z5MuiRZMgnY+P58uR/ws2YWChnVgINMmkAeyfL0cWM+oG6XTsKuCN4Blsl9aDabze0I9bQ28ad9SQf7dNfub8ED6sypFfEzLP1bD9Qsg+WkP2ENyLFQW8HWH0V+zUPEgn4+fQrxuk/ZjCQxjFRryJf8LGPRn5M4P+UYXds3EQ+7C0lvdteLGEd5GUaT0Y1ixIPXgP32GLekE6NeS+zuHdGbw9GXov/sRPFbbHQ391O7GVed6IKzOKy5X3og+xO4w3xQZcjNvxe02dc+P+LIe3Le7jM/SD+BL9OKnA7i24AO9jazujPUiXYUhnTV+FsTKv54hBbMZTqsugHTNB+jSHd1rcO3N4E3GvzOEtxSOYxF1ZZnuQtkm95+oMfcjh34/68Br24v6GukWZNIDH4nlzjl5ZkB7AiXhcThn3ZX7vwB/S4jiOJVKqTlU43hQPSk3yQqlX1EVP6MG1Uqn24pT43cI6vJGj+0XcZ2XoK3C31KwfruvI01IThUtxY11F9Rr3edIUyo7YUdWN+wydo3/m/IYrSnSXhdznGfpY0EdKdDtwCb6J5y2ajcJh5UHqk/atr3B0hjeqOkg3h8zLbbTl0siflqZXf4n+XvxltoKuCb13SnRy0RcvG8TzDXWHlQepX3EmZM+TOfpPBG9dDm9r8NaX+PdWyAxKf9K3OKB4B0RnTyKVwpjUzLaXKc8BBxyaBe04R+o341K2fZIjUzb+X5Im8xrpCyAPE9JgWokbpJ1rk9nKaYTVUsSLdooiDJvbZwnV5daStvJJHJPDXyJVwJQ0qfKwKt7xitTDvsexVY7lZRK8Lf2T+6oM4Lo4cELcQ3g1nn/EfTXsVGFQ6o8TUl/JYlKqgJtwvfzvtJk14La410rTfM5YVlNuVHlv2dPQTlEmrdXZtLMYCZkPCvgtabOfNrudd9FFF138p/AvZ5HV+xYjXa8AAAAASUVORK5CYII=\n", "text/latex": [ "$$\\sqrt{14} R V$$" ], "text/plain": [ "√14⋅R⋅V" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(r1 ^ v1).magnitude()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAAkCAYAAACUoeZ+AAAABHNCSVQICAgIfAhkiAAABQlJREFUeJztnEuIHEUYgL9sjKu4QSEgeEoOkii4srIJxoNroxgPIoaooEalPSwqelSIihcJ4nED6kHEnYigaIQVDSqKDAiK6MFHRIIG10RyiLJINGLUZDz83aSn09PP6q7H1AcNOzVdj/moqq5H14LH4xkLrgYGLV7jgvdYjLWOzmkz8YgtwKoO8nEd77EYax1NtJz+auDflvMYB7zHYryjHOaAad2FcADvsRirHbX9RJwGvm05j3HAeyzGakdtN8SsCe4c8A5wNPr+9oI0nojue05t0bTwMPANcDy6PgNuLhGvqUeXHI4i7ciqetZmQ9wIHMwIvwD4GnikRBpbgXmk8rrAL8AuYBbYDHwMLAFX5sRp6tE1h1lkORrbenYfw737PLCmIE5eT3UhcAi4Hujjbm++AjyQ+KzSo6sOqzoyvp6peiJOAseAuxNha2i2ivUisA95apQhZHjPZ0ODvLtgNXAXMAV8GoWp9ljVIZjvUbejkBb8qGqIJ4H3gfXI3uQ64LcG6c0DlwJPNS+acUwDfyLOXgC2c2aRQaVHVx066Uj1hv4nyCT5YkRWHTYBzwDXAv9UiPcF8Fji80rN/NvmIDADXATcBrwCBMCBxD1NPdZ1CPZ41OnIeLYCe4CHSt6fNXYPo/D/EtcAOB39PamioA0IkfIEitL7CHgpFdbUY4jZDlVQxZHKehbHM3JoGvM5IuhkgzSWkOHbTOL6Eng9+ntU7xVi9txmFBPAeamwph7rOgR7POp0NIqdnGnQA+ANihfaAPVD0wGyBNzPuWcKGZfHbEB++ApwGPg9upKciL4/gN08C+wHjgBrkQWHgLP3ElV5TOKKw5giR13Xs53AXmQRDmARmYOeqpGWEtYVfB+Q/WZ7LydOn+Jl5ZBuevI4n6BG3B7wM9KLH0OGpTeNuFe1xz7lluZD7HgiQr6jgO7qWfpJuAdLXz5XQYj5DdEGQuxpiDoIGfbzJMONcLeKTJbJ7kVGXa+qyFQRIeor0DLVfPQU5KmbEP0eTapXaUJGl/vRuomm54iHgL8rxD9aN+OOmUOW5GeBS4A7kE3cIhaQbYYkM8CtyHxgOfXdV41KaT51Pbpar5KcAn7K+T7XXboh3qC6dIYQv3e4CLxVId5CRliINMQe+YspLlLXo6v1CuB74HJkkeY1YAfwbsZ9ue5UrZoOFKVThzKT4veiSyc6HZXBeywmy9GdSKd8FbJVsQ+4BfgwdV+uO1X7iKs0Xrag05H32J6j48jKd3z6YxJ4G7iuyo9q+zxiFstkT3Sf11AWU7HqLJ1B6PL2K7AN2R8GOB8Znl5TNgEdDXELMlmNrxuj8Dc1lMVUdJ6lS9eJ04rS7QKd3g4jjTF+AX0KGYrOKkq/dRaAH+lueFSmpzSJvPK2cZbucYZHKmtrlMsEuvZWhbPKpuOJmORc4B7gZcxfzDCROucNR3EFsvDwYCLsO+APBWmbhkpvSuji/5rmsR3Zp+u1nE/Re4c2Ep+lu1dReruRbZkkT6c+u+BRtbeyGO3uA2Ry3TYB9r4JkzXE2oQsEFyWCOvTbIi1FOX1F3KyYUfGPQH2eOzKW1kCDHW3HnkbId0Le4bJqlBhFO7yecOmWOVN59D0fuQEwn6NZbCVJeTsXJJF4Afk1LlzJ84VYaw3XQ1xAmmIe5GeyDPMOJ/ZbIL3VpFtyJBgo+6CGEpAO2fpXCfAe/N4PB6Px+PxeDwej+X8D39SVveK70aeAAAAAElFTkSuQmCC\n", "text/latex": [ "$$- \\frac{\\sqrt{14}}{7}\\mathbf{i}_{1} + \\frac{3 \\sqrt{14}}{14}\\mathbf{j}_{1} - \\frac{\\sqrt{14}}{14}\\mathbf{k}_{1}$$" ], "text/plain": [ "-√14 3⋅√14 -√14\n", "───── 1_x + ───── 1_y + ───── 1_z\n", " 7 14 14" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(r1 ^ v1).normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Ejercicio\n", "\n", "Usando directamente la fórmula para la derivada en ejes móviles:\n", "\n", "$$\\left(\\frac{\\operatorname{d}\\!\\mathbf{a}}{\\operatorname{d}\\!t}\\right)_1 = \\left(\\frac{\\operatorname{d}\\!\\mathbf{a}}{\\operatorname{d}\\!t}\\right)_0 + \\mathbf{\\omega}_{01}\\! \\times \\mathbf{a}$$\n", "\n", "Calcula la derivada del vector de posición $R \\mathbf{i}_0$, siendo $A_0$ un sistema de referencia que gira respecto al inercial con velocidad angular $\\mathbf{\\omega}_{01}=\\Omega \\mathbf{k}_0$. **¿Cuál es el módulo de la derivada?**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "R, Omega = symbols('R, Omega', positive=True)\n", "A0 = IJKReferenceFrame('0')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAXCAYAAADz/ZRUAAAABHNCSVQICAgIfAhkiAAAAaNJREFUSInt1TtrlEEUxvHfxmBl4Y0gFkZQ0GCjxEIELay0EUUkiM0WCrJgoV/BQgshYunlC2hhJxILC6uAFhaiaGHaiKKIhRplLea8MMyOYXfZBAUfeDkzZ2bOfy7n8PIPq41u9m0fZPFYxfe4CNjFezzF6eH32atWxfcRG3AlwOPYjRNYg8uYjbl7cCxbewtfht3MjgC+roxdiLGFYYOXKq99f9jnlbmPwk5kvrYRvnkDf1aZuzPsq0EAw8DLk2/C9WhfGxV8PGu3sC/ax3FESrDJ6I+hg/ujgufapbfEmu8rjlbWtC3/5h28wzfpNg/9CX42AtzNfBtxKfyfsH4A+AyWcB5TuBmH2FaDz0aATmXsXoxdHAA+j9vF/Le42nTyhFuuzO6EPVPbdUVrMY25wj+HgyV8DHvxEy8qwZ7gMw5gax/wzVKyLhb+RWwp4VNYh5dScpRawkOpIk72AW/ULfqt3NfAp8PWrrzRg7Cn+oB+wC/ZKUMTem9jRTQv/WhyvZEl3EpqBj9wTnrWG1KpTa4GnFS2C/guPenh1QL/19+p32jfYqtH33+qAAAAAElFTkSuQmCC\n", "text/latex": [ "$$R\\mathbf{i}_{0}$$" ], "text/plain": [ "R 0_x" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = R * A0.i\n", "a" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAXCAYAAACI2VaYAAAABHNCSVQICAgIfAhkiAAAAiRJREFUSInt1TlolEEYBuAnXtGgiEFFLMwWWgQhNhYRvBqNiJ1IijQBFSWFigh2mibaqqCFgnh0WgmCQhqNIgRULMSziGjhhQciEmNiLGaW/TP+u2skbmNeGHbnm+94Z+Z/v+E/QCdGM6MwEUmn5NjqsBVX8BpD+IA+7EPDRBT+G8xDr7D797iIIziFJ9E+gBVJXKd/cHJZTMPNmPwcZifrddiNH3iHplqS2xUT90Yi5XAw+l3+Q3IdGM6sXcL08ZK7G4NXVfGbiU+xYGMVcimxs5g6XmL1+Ilv8kWS4nos1laBXErsuMo38huKRBpj4OdIsho+ZuLy0IHzSqfUg72R5LjREAOHBWFUQ1/03xTnncaeXHYcqJCnS1D/IO5hTTnHgZhsZRVi9ULfG1VSbDlyw0LPzEO7oPydaMYJfMWSPOeemPBCFXLbo9+djC0l9yjzfwhbcvL040xie46jeUXn4pWw281liDXhDUbQWoFcC+5n5oPYkPGfEetsS/KfFHptLlrxJY62ZG0ZHsZie5K1lFwBC5RelVGhE6yL/oujbW2S5xCeFidFtRbQLXzgtzFHaBf74/pqPMByPBZU2o315XYpPH8bhduAWbhqbB9N1VuXtRWVWcDhnAIt8Xep0oPfnPjeqEDwZSR4C/OFJ/GacCsjWJT4L8TbCvlqhn6cTmzPlBFErdEuKHmHcBvHhFbSVCmolujCC3wXmnAqkElMoqb4BVufqQqkBcudAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\Omega\\mathbf{k}_{0}$$" ], "text/plain": [ "Ω 0_z" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "omega01 = Omega * A0.k\n", "omega01" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC8AAAAXCAYAAACbDhZsAAAABHNCSVQICAgIfAhkiAAAAsRJREFUWIXt1k+I1VUUB/DP6JQhSjWBhAsd0FAxBEHIhUVEmLkQTWpCNwMlyUBibqKNBREt1cBNEYTQRhfaRgQXokYgJBgY/RH8Q4v+oCkaUv6bFucMc73v997Mm2Rc5Bce993z737v/Z1z7uUBJoxBDBe//m6cpzTIerAeX+FX3MAlHMNWTO8Q73BFZhh/4Dhe7YbYeNBTzR/HXryIiziEX/AYXsACnMdafNcQ71LG+DCJ92Jh2k/FNuwo7Bfj5WL+Ka5OZCO9OJqLfoEZlb4Hm3FTnObcSj8vfX9siL05decnQmw8eCsXOKz1i5R4N+32VfKBlH/Z4NOfuuuVfNA9yvlNOW7PQO2wC1ewDn2FfFmO3zb4zM/xh27IjRfTcEecTFMR1zgkNvhSITuSsucq2ydwKnV10Q76Dyffm2OfSJUrYhNj4c/CT/ouzf9rRHFPFXWxRhzIkNZUuyeYLnZ+y+iGOuFY2q/K+QKtLXLk91dhV2NQ55Mfwjn8jZN4th2hcxlgWTuDxDTREoeNdpyNOf+8sOvDOym/LNptN+QHRGfbhEX4RBzEnCZSH2WAPWOQfyPtvilkO1I21GC/N3Vvd0n+BD6r7M/g4yZSj4oL6RZWtyE+F7/hNpYX8uO5+DMNPiu1bnYs8g8nj7rAd4u7qBHLxQ131d2dBJ7C6VxkSyGfgmviEz/SEPMhkTZ3MHuc5Gdr7lzb8VO5sHT6QBTW15gp2uG21K8Q7W6x6NV9af+8yMcZ+F4UVo2bOCg60roGfSfU901PKRvpLP14v8F5SY7zjT7IFlW2Z3M82YHEfmwQD77dhby+U0ba9EWRmk9W+ln4vcM6k4r33J02MwvdCfFQK/GzNgU7mXgar+OCUeKnK5sB8Rx/U3ztnaJV1g/CSccBrZfZaw12Q+Il+o9Iy7qA7wtGyF8X6fHK/aXzAP8j/AtRpsQbWZF0kAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\Omega R\\mathbf{j}_{0}$$" ], "text/plain": [ "Ω⋅R 0_y" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da = omega01 ^ a\n", "da" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAASCAYAAABM8m7ZAAAABHNCSVQICAgIfAhkiAAAAeBJREFUSInt1EGIjVEUB/DfzHuaaVLG2LGYKTRKKaWMkiZNRhaTQhYkZWGaImxslawsZmOrJmUzVnZqisyEBYooVmbKgmQQsmC8Z3HP8PW9+95bKQunbt93z///P+fce8+9/EPWgQO4iTf4jkXM4gx6WmhnUC+Nd5jDoXKSoq3GNEbwHrfwGr3YjUEsYD+eZhIvRoyLkbSKTcGv4Bwmy6Iq7oZgCitLeAfG8SNW0V/C14f2Zaag8cAWMpiTAc5o3IminQ/ejZL/cPivZzQDgX3LBXwU4I4WSaEbH7GEvoL/cujPZjQjgT0uA12oRUWdbRKTzr6O0YLvTvh2lbhr8CSw3w1WjW+ftL2fooB29qGgE9qt8T8mNWJF6oMxaTETGo9HT1S0VCimlc0Gf2/MBzVeo+XxtcDL2nwQt7VJ2iVdm7o/nX0k5lcLvD7pvOtST/Q2C3gpSNfaJD4RvPsF32T4JjL86cBONQu4SnoslrCvCacfb/ETQwX/XATfntHsyRTaYEP4HGO0hG3E8whyuuDvxBfpYenOxFwhbXUNa5edlfgOSO/whljNZhyNgA+wE/ewDi/wCsOh7QntM1zJJK5hS4x5PCyCw/IdORX48Sb4BRzT2FhlOxic2y04/+3v2C81iYYjcG22egAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\Omega R$$" ], "text/plain": [ "Ω⋅R" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da.magnitude()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Si no especificaste `positive=True` vas a ver algo como $\\sqrt{\\Omega^2 R^2}$. Debería haber una forma de simplificar esta expresión _a posteriori_, pero de momento no funciona del todo bien. Preparando este notebook nos hemos dado cuenta y ya les hemos avisado :) https://github.com/sympy/sympy/issues/8326\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Movimiento relativo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¿A quién no le gusta multiplicar matrices de rotación? Para esa minoría que lo detesta, existe SymPy. Para ello debemos especificar la orientación de nuestros sistemas de referencia usando el método `orient`, y recuperaremos la matriz de cosenos directores usando el método `dcm`." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "A1 = IJKReferenceFrame(\"1\")\n", "A0 = IJKReferenceFrame(\"0\")" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\phi \\right )} & \\sin{\\left (\\phi \\right )} & 0\\\\- \\sin{\\left (\\phi \\right )} & \\cos{\\left (\\phi \\right )} & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(φ) sin(φ) 0⎤\n", "⎢ ⎥\n", "⎢-sin(φ) cos(φ) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phi = symbols('phi')\n", "A0.orient(A1, 'Axis', [phi, A1.z]) # Rotación phi alrededor del eje A1.z\n", "A0.dcm(A1) # \"Direct Cosine Matrix\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usando el argumento `Axis` hemos especificado que rotamos el sistema un ángulo especificado alrededor de un eje. Otros métodos son:\n", "\n", "* `Body`: se especifican los tres ángulos de Euler.\n", "* `Space`: igual que `Body`, pero las rotaciones se aplican en orden inverso.\n", "* `Quaternion`: utilizando cuaternios, rotación alrededor de un vector unitario $\\lambda$ una cantidad $\\theta$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
¿Qué es lo bueno de usar uno de estos métodos? ¡Que **siempre** tenemos la transformación bien definida! Es imposible meter \"a capón\" una matriz de rotación que sea incorrecta o absurda.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Diferente sistema de referencia\n", "\n", "Para expresar un vector en otro sistema de referencia, no hay más que usar los métodos `express` o `to_matrix`:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\operatorname{cos}\\left(\\phi\\right)\\mathbf{i}_{1} + \\operatorname{sin}\\left(\\phi\\right)\\mathbf{j}_{1}$$" ], "text/plain": [ "cos(φ) 1_x + sin(φ) 1_y" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A0.x.express(A1)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\phi \\right )}\\\\\\sin{\\left (\\phi \\right )}\\\\0\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(φ)⎤\n", "⎢ ⎥\n", "⎢sin(φ)⎥\n", "⎢ ⎥\n", "⎣ 0 ⎦" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A0.x.to_matrix(A1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Símbolos dinámicos\n", "\n", "Si queremos especificar que un símbolo puede variar con el tiempo, hay que usar la función `dynamicsymbols`:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "from sympy.physics.mechanics import dynamicsymbols" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACUAAAAVCAYAAADB5CeuAAAABHNCSVQICAgIfAhkiAAAAlVJREFUSInt1kuITmEYB/Cfu0GRUVZjIbcs5DImGzZGNrKzILIQJZdkx4aNco2SclkR2RBiwUiiCLlMWWBH7qOQ67iOxfscjjPnm8+Ejfzr6znn+b/P8/zPc97nPR//OPahBX1/cf0EtGHB3xJUj69YWcKtjOJzSrgjeIx+f0NUE16ipoTbH6JGlnANwa3+04JGSF3aXYG/hdfo2gF/D906KtIDK9CM93iAreiJPniKA7n166WnnVrIsyH8Zb+5uXVrwjc9c3QvJBqIk5iIEziFGSHyodSRgZEoQyO+4FIh1zXsxXxcxOkcdy53fSHstKjXDk2hennONwitOCNtyj05ri8+42ZZMiyKfAsr8NA/1lwpIxuDPI8uBe52cK2oy/lHhL+pQsGdwdd3IIq0TZ5kN/nNNy/stkiUR2vYXbif89eGfVGh2Hh8UrmTGZ5Lb6Qd7uKjtJmLaMZbDC74x0oPcKwkprvUgeYqgjJRr7ObrFM1GCKN5rtCwFCMwmVp8vJoCVurPUajN65XEdQVA3K5fhLVRZquIrail7Shi3iMZ8oPxrFhb1QRNTJqf+9oJuoF3mAYxuQCFmNmXA8oSZgNxqCIzSPr3qsqoiaFPVtGbo8iLdiBw1LnjkZAmzRNEwtxs4NbUvBPCf8DbMJazCqpe1B6C3UlnN7YLE3XpxC3RTrhG/w4FqYV4npK43y5JOdS3JGmtw3rCnx/aRiOlgn6XayKouM6Gbcs4ib/cUVSl+/heCdiavAIh4pEh1/mTuCzNPq9cFV6/dUwHB+wUfrb8x+dxjeBq5SZhRTuEwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\alpha{\\left (t \\right )}$$" ], "text/plain": [ "α(t)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alpha = dynamicsymbols('alpha')\n", "alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y pedir su derivada con el método `diff`:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADYAAAAhCAYAAACSllj+AAAABHNCSVQICAgIfAhkiAAAA3JJREFUWIXt11uIVlUUB/BfZjaTgaVCERhR4WRQjZeGXrIXo4cgeiko66UokCxEgqiXMoiIDLsQpEJEFBYUGRKB0Z0eHLpoElNvmqI1gdPdwWy+Htb+mjOnc75zjjM2It8fPvZ31lp7r7Vv/7UXXYDVGJruIOpgRkP7K7DzeAQy1ThpJ9YJffgAo9iNAfyJ66YzqMliIX7BM7gY12MvWjjnOPp9GcOYXdN+qYjpzroO3sOWnOxFHKw7wDFgGcawtkC3Vkzg1gLdWymuM6scLEiDXJmTb8K7TSJtiO34Gb0FuldSTH0FuoGke6jKwQ04ilk5+Rd4vEmkDbBQ7NamEv0QflNOdkPiqpzaFhQZtpLB6RnZNViiHiOehjXJ9jD2Y4NYqDPwI17N9bkDp+D1nPyJFM8l4qj9nb5buC1j9xrOx4pOgZ0nmHAjLjKROIqOQhZzMZhst6XAvknf94u78pcgpCw+F6ckTxo346XU/zM8kvktyNitSDbrK+KzEt9jBB/hUfyhOu9tTw7uy8jmi4V6X1zyzbk+s8WkdpeMeXca864Ofuckm8GK+I4J7VX7RByrLL5NulETV5q4Xy2xKEV4IemXVfg/jB/aH01fHp1we2qfToFkMZrajdiX081L7UjJuEvE8S3b0TYOidMx5diDI4Ig8tgpjnJRcu8XC/F2gW6m2Ik6pHVIMCfGd6w1yV+vYKW94tmVxYWC1XYIRsxjOLXzCnSXogdfVkxqBs7KjGVmavN3oinmpjHGCnQbROo4WtL3IH5SzLj9qf2qwn9f8v/vzta5Y3VqsBH8Lmj88ox8lUj4xIoWoU048/03DbR38dcK/1el9sMKuwnYbPzduB7vlNg9l4IcxvN4U+zg1uSwJRgu/1SDW5L+npx8eZLvx5Mif91U0H+LOBF5xu2IQTyQ/n+MdSV2PWLi+wSLDeMp8RIZME751xb0nSWoekeBbjW+E8zawmM5/RxBMFs7TaJTDXbERMKoot+meDCNu7hhv3tTv6vLDKpqsPYregDn4uyGAVShJ/nb1qBPLw7gjU5GVTXYjeIST5ZBO2E5Hla/0Fwk7t0FZQZ1arB1+LRBkNOKNt0vFiXBrpx+qfHc0K86n5wwyL48qmqwy/D1/xfa1KBODbYHzybbsmR7QqKqBlspEuWYSMBddNFFFycf/gE2te25mcqg0gAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{d}{d t} \\alpha{\\left (t \\right )}$$" ], "text/plain": [ "d \n", "──(α(t))\n", "dt " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alpha.diff()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Ejercicio\n", "\n", "![Sistemas de ejes asociados a la pala](../images/ejes_pala.jpg)\n", "\n", "(Sacado de Cuerva et al. \"Teoría de los Helicópteros\")\n", "\n", "**Obtener la matriz de rotación de la pala $B$ respecto a los ejes $A1$.**" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "A = IJKReferenceFrame(\"A\")" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\psi{\\left (t \\right )} \\right )} & \\sin{\\left (\\psi{\\left (t \\right )} \\right )} & 0\\\\- \\sin{\\left (\\psi{\\left (t \\right )} \\right )} & \\cos{\\left (\\psi{\\left (t \\right )} \\right )} & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(ψ(t)) sin(ψ(t)) 0⎤\n", "⎢ ⎥\n", "⎢-sin(ψ(t)) cos(ψ(t)) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A1 = IJKReferenceFrame(\"A1\")\n", "psi = dynamicsymbols('psi')\n", "A1.orient(A, 'Axis', [psi, A.z])\n", "A1.dcm(A) # T_{A1A}" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\beta{\\left (t \\right )} \\right )} & 0 & \\sin{\\left (\\beta{\\left (t \\right )} \\right )}\\\\0 & 1 & 0\\\\- \\sin{\\left (\\beta{\\left (t \\right )} \\right )} & 0 & \\cos{\\left (\\beta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(β(t)) 0 sin(β(t))⎤\n", "⎢ ⎥\n", "⎢ 0 1 0 ⎥\n", "⎢ ⎥\n", "⎣-sin(β(t)) 0 cos(β(t))⎦" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A2 = IJKReferenceFrame(\"A2\")\n", "beta = dynamicsymbols('beta')\n", "A2.orient(A1, 'Axis', [beta, -A1.y])\n", "A2.dcm(A1) # T_{A2A1}" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )}\\\\- \\sin{\\left (\\zeta\\left(t\\right) \\right )} \\cos{\\left (\\beta{\\left (t \\right )} \\right )} & \\cos{\\left (\\zeta\\left(t\\right) \\right )} & - \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\sin{\\left (\\zeta\\left(t\\right) \\right )}\\\\- \\sin{\\left (\\beta{\\left (t \\right )} \\right )} & 0 & \\cos{\\left (\\beta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(β(t))⋅cos(ζ(t)) sin(ζ(t)) sin(β(t))⋅cos(ζ(t)) ⎤\n", "⎢ ⎥\n", "⎢-sin(ζ(t))⋅cos(β(t)) cos(ζ(t)) -sin(β(t))⋅sin(ζ(t))⎥\n", "⎢ ⎥\n", "⎣ -sin(β(t)) 0 cos(β(t)) ⎦" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A3 = IJKReferenceFrame(\"A3\")\n", "zeta = dynamicsymbols('zeta')\n", "A3.orient(A2, 'Axis', [zeta, A2.z])\n", "A3.dcm(A1) # T_{A3A1}" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}1 & 0 & 0\\\\0 & \\cos{\\left (\\theta{\\left (t \\right )} \\right )} & \\sin{\\left (\\theta{\\left (t \\right )} \\right )}\\\\0 & - \\sin{\\left (\\theta{\\left (t \\right )} \\right )} & \\cos{\\left (\\theta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡1 0 0 ⎤\n", "⎢ ⎥\n", "⎢0 cos(θ(t)) sin(θ(t))⎥\n", "⎢ ⎥\n", "⎣0 -sin(θ(t)) cos(θ(t))⎦" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B = IJKReferenceFrame(\"B\")\n", "theta = dynamicsymbols('theta')\n", "B.orient(A3, 'Axis', [theta, A3.x])\n", "B.dcm(A3) # T_{BA3}" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\zeta\\left(t\\right) \\right )} & 0\\\\- \\sin{\\left (\\zeta\\left(t\\right) \\right )} \\cos{\\left (\\theta{\\left (t \\right )} \\right )} & \\cos{\\left (\\theta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\theta{\\left (t \\right )} \\right )}\\\\\\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\sin{\\left (\\zeta\\left(t\\right) \\right )} & - \\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\cos{\\left (\\theta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ cos(ζ(t)) sin(ζ(t)) 0 ⎤\n", "⎢ ⎥\n", "⎢-sin(ζ(t))⋅cos(θ(t)) cos(θ(t))⋅cos(ζ(t)) sin(θ(t))⎥\n", "⎢ ⎥\n", "⎣sin(θ(t))⋅sin(ζ(t)) -sin(θ(t))⋅cos(ζ(t)) cos(θ(t))⎦" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B.dcm(A2)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )}\\\\- \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\sin{\\left (\\theta{\\left (t \\right )} \\right )} - \\sin{\\left (\\zeta\\left(t\\right) \\right )} \\cos{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\theta{\\left (t \\right )} \\right )} & \\cos{\\left (\\theta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & - \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\sin{\\left (\\zeta\\left(t\\right) \\right )} \\cos{\\left (\\theta{\\left (t \\right )} \\right )} + \\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\cos{\\left (\\beta{\\left (t \\right )} \\right )}\\\\- \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\theta{\\left (t \\right )} \\right )} + \\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\sin{\\left (\\zeta\\left(t\\right) \\right )} \\cos{\\left (\\beta{\\left (t \\right )} \\right )} & - \\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\cos{\\left (\\zeta\\left(t\\right) \\right )} & \\sin{\\left (\\beta{\\left (t \\right )} \\right )} \\sin{\\left (\\theta{\\left (t \\right )} \\right )} \\sin{\\left (\\zeta\\left(t\\right) \\right )} + \\cos{\\left (\\beta{\\left (t \\right )} \\right )} \\cos{\\left (\\theta{\\left (t \\right )} \\right )}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ cos(β(t))⋅cos(ζ(t)) sin(ζ(t)) \n", "⎢ \n", "⎢-sin(β(t))⋅sin(θ(t)) - sin(ζ(t))⋅cos(β(t))⋅cos(θ(t)) cos(θ(t))⋅cos(ζ(t)) -\n", "⎢ \n", "⎣-sin(β(t))⋅cos(θ(t)) + sin(θ(t))⋅sin(ζ(t))⋅cos(β(t)) -sin(θ(t))⋅cos(ζ(t)) s\n", "\n", " sin(β(t))⋅cos(ζ(t)) ⎤\n", " ⎥\n", "sin(β(t))⋅sin(ζ(t))⋅cos(θ(t)) + sin(θ(t))⋅cos(β(t))⎥\n", " ⎥\n", "in(β(t))⋅sin(θ(t))⋅sin(ζ(t)) + cos(β(t))⋅cos(θ(t)) ⎦" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B.dcm(A1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Velocidad angular\n", "\n", "También podemos hallar la velocidad angular de un sistema respecto a otro usando el método `ang_vel_in`:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\dot{\\theta}\\mathbf{i}_{A3} + \\dot{\\zeta\\left(t\\right)}\\mathbf{k}_{A2}$$" ], "text/plain": [ "d d\n", "──(θ(t)) a3_x + ──(ζ(t)) a2_z\n", "dt dt" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B.ang_vel_in(A2)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\dot{\\theta}\\mathbf{i}_{A3} + \\dot{\\zeta\\left(t\\right)}\\mathbf{k}_{A2} - \\dot{\\beta}\\mathbf{j}_{A1} + \\dot{\\psi}\\mathbf{k}_{A}$$" ], "text/plain": [ "d d d d\n", "──(θ(t)) a3_x + ──(ζ(t)) a2_z + -──(β(t)) a1_y + ──(ψ(t)) a_z\n", "dt dt dt dt" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B.ang_vel_in(A)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [ { "ename": "AttributeError", "evalue": "'tuple' object has no attribute 'right'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\core\\formatters.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 700\u001b[0m \u001b[0mtype_pprinters\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_printers\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 701\u001b[0m deferred_pprinters=self.deferred_printers)\n\u001b[1;32m--> 702\u001b[1;33m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 703\u001b[0m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 704\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstream\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgetvalue\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\lib\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 378\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 379\u001b[0m \u001b[1;31m# printer registered in self.type_pprinters\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 380\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcls\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 381\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 382\u001b[0m \u001b[1;31m# deferred printer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\interactive\\printing.py\u001b[0m in \u001b[0;36m_print_plain\u001b[1;34m(arg, p, cycle)\u001b[0m\n\u001b[0;32m 66\u001b[0m \u001b[1;34m\"\"\"caller for pretty, for use in IPython 0.11\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 67\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0m_can_print_latex\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 68\u001b[1;33m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstringify_func\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 69\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mIPython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(expr, **settings)\u001b[0m\n\u001b[0;32m 2162\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2163\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2164\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mpp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2165\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2166\u001b[0m \u001b[0mpretty_use_unicode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muflag\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mdoprint\u001b[1;34m(self, expr)\u001b[0m\n\u001b[0;32m 60\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 62\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_print\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_settings\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 63\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 64\u001b[0m \u001b[1;31m# empty op so _print(stringPict) returns the same\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\physics\\vector\\vector.py\u001b[0m in \u001b[0;36mrender\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 283\u001b[0m pform = vp._print(\n\u001b[0;32m 284\u001b[0m ar[i][0][j])\n\u001b[1;32m--> 285\u001b[1;33m pform = prettyForm(*pform.right(\" \",\n\u001b[0m\u001b[0;32m 286\u001b[0m ar[i][1].pretty_vecs[j]))\n\u001b[0;32m 287\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'right'" ] }, { "data": { "image/png": "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\n", "text/latex": [ "$$(\\left(- \\operatorname{sin}\\left(\\psi\\right) \\operatorname{sin}\\left(\\zeta\\left(t\\right)\\right) + \\operatorname{cos}\\left(\\beta\\right) \\operatorname{cos}\\left(\\psi\\right) \\operatorname{cos}\\left(\\zeta\\left(t\\right)\\right)\\right) \\dot{\\theta} - \\operatorname{sin}\\left(\\beta\\right) \\operatorname{cos}\\left(\\psi\\right) \\dot{\\zeta\\left(t\\right)} + \\operatorname{sin}\\left(\\psi\\right) \\dot{\\beta})\\mathbf{i}_{A} + (\\left(\\operatorname{sin}\\left(\\psi\\right) \\operatorname{cos}\\left(\\beta\\right) \\operatorname{cos}\\left(\\zeta\\left(t\\right)\\right) + \\operatorname{sin}\\left(\\zeta\\left(t\\right)\\right) \\operatorname{cos}\\left(\\psi\\right)\\right) \\dot{\\theta} - \\operatorname{sin}\\left(\\beta\\right) \\operatorname{sin}\\left(\\psi\\right) \\dot{\\zeta\\left(t\\right)} - \\operatorname{cos}\\left(\\psi\\right) \\dot{\\beta})\\mathbf{j}_{A} + (\\operatorname{sin}\\left(\\beta\\right) \\operatorname{cos}\\left(\\zeta\\left(t\\right)\\right) \\dot{\\theta} + \\operatorname{cos}\\left(\\beta\\right) \\dot{\\zeta\\left(t\\right)} + \\dot{\\psi})\\mathbf{k}_{A}$$" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B.ang_vel_in(A).express(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En ocasiones, la representación gráfica puede fallar, pero se puede volver a desactivar y activar llamando a la función`init_printing(pretty_print=True)` con diferentes valores (True/False) para `pretty_print`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Derivada en ejes móviles\n", "\n", "Hacer una derivada con la fórmula lo hace cualquiera, pero SymPy puede encargarse automáticamente." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABsAAAAXCAYAAAD6FjQuAAAABHNCSVQICAgIfAhkiAAAAQxJREFUSInt088rRFEUB/APDSVs+Acm2Yhi5g+QlT9AyvbtWQ7ZW0ryH/gfLGztFcmsFUWKZmVhNxb3qWuaN29e3iDNt073/Lj3fO+551x+CQnakVTLJhgtO2EvVCL9EruR3frJiwwUif/UsyFZjAW847rDv4ozPAk93yyD7ASHWMR45J/EDXb6SZLIn8YNnGMm3bOSkevblU0IFe0JH/4ZtQLnC5Ht4wK3qd2UXVlXVPK3IDzpNpYjXxP1QZAdYxb3kW8Eb+naLkLaC+tCj+pYimQrJZnrcqbrgORVNiaM+hGuOmKP6VrDHaYwH8WrQk9beMjhAQ28Yjoj/oKDVF/z9et8ymk/REP8TXwAFeA3CvV4ZDgAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\mathbf{i}_{A1}$$" ], "text/plain": [ "a1_x" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v1 = A1.x\n", "v1" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [ { "ename": "AttributeError", "evalue": "'tuple' object has no attribute 'right'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\core\\formatters.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 700\u001b[0m \u001b[0mtype_pprinters\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_printers\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 701\u001b[0m deferred_pprinters=self.deferred_printers)\n\u001b[1;32m--> 702\u001b[1;33m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 703\u001b[0m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 704\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstream\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgetvalue\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\lib\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 378\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 379\u001b[0m \u001b[1;31m# printer registered in self.type_pprinters\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 380\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcls\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 381\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 382\u001b[0m \u001b[1;31m# deferred printer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\interactive\\printing.py\u001b[0m in \u001b[0;36m_print_plain\u001b[1;34m(arg, p, cycle)\u001b[0m\n\u001b[0;32m 66\u001b[0m \u001b[1;34m\"\"\"caller for pretty, for use in IPython 0.11\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 67\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0m_can_print_latex\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 68\u001b[1;33m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstringify_func\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 69\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mIPython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(expr, **settings)\u001b[0m\n\u001b[0;32m 2162\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2163\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2164\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mpp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2165\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2166\u001b[0m \u001b[0mpretty_use_unicode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muflag\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mdoprint\u001b[1;34m(self, expr)\u001b[0m\n\u001b[0;32m 60\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 62\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_print\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_settings\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 63\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 64\u001b[0m \u001b[1;31m# empty op so _print(stringPict) returns the same\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\physics\\vector\\vector.py\u001b[0m in \u001b[0;36mrender\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 283\u001b[0m pform = vp._print(\n\u001b[0;32m 284\u001b[0m ar[i][0][j])\n\u001b[1;32m--> 285\u001b[1;33m pform = prettyForm(*pform.right(\" \",\n\u001b[0m\u001b[0;32m 286\u001b[0m ar[i][1].pretty_vecs[j]))\n\u001b[0;32m 287\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'right'" ] }, { "data": { "image/png": "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\n", "text/latex": [ "$$(\\operatorname{sin}^{2}\\left(\\psi\\right) \\dot{\\psi} + \\operatorname{cos}^{2}\\left(\\psi\\right) \\dot{\\psi})\\mathbf{j}_{A1}$$" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#v1.diff(dynamicsymbols._t, A2)\n", "dv1 = v1.diff(symbols('t'), A)\n", "dv1" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}0\\\\\\sin^{2}{\\left (\\psi{\\left (t \\right )} \\right )} \\frac{d}{d t} \\psi{\\left (t \\right )} + \\cos^{2}{\\left (\\psi{\\left (t \\right )} \\right )} \\frac{d}{d t} \\psi{\\left (t \\right )}\\\\0\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 0 ⎤\n", "⎢ ⎥\n", "⎢ 2 d 2 d ⎥\n", "⎢sin (ψ(t))⋅──(ψ(t)) + cos (ψ(t))⋅──(ψ(t))⎥\n", "⎢ dt dt ⎥\n", "⎢ ⎥\n", "⎣ 0 ⎦" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dv1.to_matrix(A1)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADYAAAAhCAYAAACSllj+AAAABHNCSVQICAgIfAhkiAAAA6JJREFUWIXt112IVVUUB/CfZpNmoGXQBxhSMmOCNI5mPZQRaD1IIkQPqRAUCZER+BIFUQYR1bwUFKVQFIEFQZJFZFFZFCnOmAlJEPRBZBhlOZR9ObeHvc7M9nruPec6mhTzh8s+Z63/Xvu/7z5r7b0ZB1iLvSdbRB1M7JB/CT45EUKON/63E2uHHryD37EHi/Abrj2ZosaKbvyCxzAby/A1GjjnBI77PPZjak3+AknTLXUHeAubmmzPYF/dAMeAhRjGuhLfOmkCK0t8r4SuM6oGmBlBLm2yb8AbnSjtEFvxM6aU+F4ITT0lvkXhu6dqgOX4G11N9gE81InSDtAtrdaGFv69GNK62O2VUuWUwlBGbAThtMx2FfpUV8RHov81WfwhfJpxbgvOmsx2MybgpaZ4Dwd3jvSpHY73BlZnvBdxAZYUhkkl4gbwB/pD6Bw8Gb6qifVFOxhtdwjaVcLJbUtC9MclWp7DTfhIyv0C27LnD6NdijfbCVyFb3AA7+EB/Kp63/sx+hVYKf27d2a2nfgLk+N9qvTp72kRc03EuLXNuNOCs6NC3zFhVgTfnNn6w7Y43k+V9sXdGac7OFtbxH0q/Asrxj+E74uXTk8e7bAg2sHM1heiik94rpS7+Wc4I9oDLeL2SSvcakUL/ISzi5fjObEidwYyWy++wMEmTj75Q9FOdjQmYR4+k/K+HaZksUYm1hjjTwhg9J+9EGc6cnWuiHZ7Ztsf7QxHY6404cESX46JmJ7FGqmKEyo61kFx1BqKtnl1TseKGHxn1m8fflC++fZGu6vEl6NHmsNI1a7zKda9gxXHreujzct6F57FWdLedDjr18D7Un7MbopZrOJB7XF5tO/W0DmCjUbPjf14vQVvqSR4GK9KedGQjkNfxvNG5X/mjeG/vcm+OOzf4lHcjxtK+m+StoyZNeYzgh24K563YX0b7tV4G38azb/90sngsjb9uqRSvb3EtxafS9tEAw82+adJRWOzNmh3B8vFNrQvvxcF5zX18/fu6DO/Jr/AHdHvylaEqjtYcYpehHOlitcKy4N7bwcCJ8d4WzroMwXf4eV2pKo72AopieuswHppYss6EEnKqfvUv2heLOXdrFaEOnew9fig5oBbIt55NfnHHcU+Nl+qaLub/AuMnuF6Ve8nBa4bu7SxIT95VN3B5jnyXvWfwPlSJXxaqmh54ShOBF/h8eBO//clHjuq7mCrpI1yGE+cBH3jGMc4xnHi8Q+lm/Gri5LWQAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{d}{d t} \\psi{\\left (t \\right )}$$" ], "text/plain": [ "d \n", "──(ψ(t))\n", "dt " ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(dv1 & A1.j).simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Puntos, velocidades y la rueda que no desliza" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El último paso que nos queda para completar la cinemática es la posibilidad de definir puntos en sólidos y aplicar su campo de velocidades. SymPy también permite esto, y para ello no tenemos más que importar la clase `Point`." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "from sympy.physics.mechanics import Point" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "O = Point(\"O\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para trabajar como lo haríamos en la escuela, vamos a especificar que $O$ es el origen de $A$, y para eso vamos a imponer que su velocidad es cero con el método `set_vel`:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "O.set_vel(A, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para definir nuevos puntos, podemos utilizar el método `locate_new`:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "e_b = symbols('e_b')\n", "E_b = O.locatenew('E_b', e_b * A1.x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y para obtener vectores de un punto a otro, el método `pos_from`:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAXCAYAAABNq8wJAAAABHNCSVQICAgIfAhkiAAAAj1JREFUWIXt1l9ozWEYB/DPNpOJC6RIrSUXiJzNhaXFLrRy6YyUXBw3UnK35d+NQi4pypWilJKVG6mZorhSNOZfi0xJIaX8KWQu3vfkd87O7+x3tO1i7Vtvv/N7nt/zPN/nfc7zvC8zqIoCRhOrZaID1E+0w6nGrEn2/wC9iffPkxxv+qAbN/EJPzGMI2io0U/BJPdAORpwJQYbxnmcwcsou1Sjv4IpTuBcDHRKaX804n7Ura7BX8EUJrABf3A9Rb83ktiTkJ3ErSo+CyY5geQuH0AdvuNYhW/XxGddQpbD4ATwWIVHeI7WMt0mYZKtx1LswLVKTj4o3a20tSVh8w67qxAryFaBfhwXBsbsMt1WnEA++theycGcqLxbhUw5FkebXbgtVG4Q7TUmkBcm3sL4Ta5KzNQEmqLyaXb+uqLNQ2zGykhkxL+/5ngJNOEV1sb390p7bNwEileJH3gsTJh8inGH0nMgJ5R8m1C5FziI5gpE03AId/Akvg+pXoExSDZxL26gDwNCQvVYJjRQYyRXRKvQTCMJ2bf4zHLHasF+rEvIhtCWmb3SBPqxUdjFDnTii1DWAVwts83hQpmsLdq8zhD7NBYp3YA6fI3P0SwJ/C/m4jcOlwW/h7MZ7LuEi12bMJ6La6dAfHmKXWoT14p2/MIz4QBcgct4I0yTamgU5v3RCroFkWR3QjZPqHYu6nri7+Yx1jVgn9C0ebwVRmgflmSw7REuifNT9B+FM6GITpXPo4u1057BDKYf/gL3kpZQ/rQvZQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$e_{b}\\mathbf{i}_{A1}$$" ], "text/plain": [ "e_b a1_x" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_b.pos_from(O)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
La notación de este paquete está influenciada por el libro Kane, T. R. & Levinson, D. A. \"Dynamics, Theory and Applications\". Es ligeramente distinto a como estudiamos nosotros en la escuela, pero ¡están abiertos a que les hagamos cualquier tipo de sugerencia! https://github.com/sympy/sympy/issues/2584#issuecomment-31552654
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por último, el **campo de velocidades de un sólido rígido** se formula usando el método `v2pt_theory`.\n", "\n", "$$v^P_A = v^O_A + \\omega_{A_1 A} \\times \\mathbf{OP}$$\n", "\n", "Este método pertenece *al punto del cual queremos conocer la velocidad* y recibe tres parámetros:\n", "\n", "* `O`, punto de velocidad conocida respecto a A\n", "* `A`, sistema de referencia donde queremos calcular la velocidad\n", "* `A1`, sistema de referencia donde están fijos ambos puntos (_sistema de arrastre_)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por tanto, para hallar la velocidad del punto que acabamos de crear:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAD4AAAAaCAYAAADv/O9kAAAABHNCSVQICAgIfAhkiAAAAz9JREFUWIXt1kmInFUQB/DfJE6MMTk4KBqEYUhCwGEObYKYg4gizkUQzRiXnAYPooJ4GZcoggtBVCSIIoi4geKOK3hQQUEP4hoNE0HF6EFDjKIGRjFLe6j6nNc93T090diHmT88Xr+qekt99a+qpjdYnWPeYVeOnmFRLy9fQCPGUS/G0JG4ZN5G/KheP6AFPsR1xfqXXj1kXmEMb2Av/sJXuAmLD+Osu0WujuZ6Efbh88LmqrS5Qo9yfDGexgtYg+fxIA5hKx49jDvW5fxJzmuxHJ+2sCll/yseEF/5To3534/3Uzc8xzN/xvfFenOec20h+wj7sVQPIn46rsYr2IIDhW4/nijsKmzFmx3OH8KA6WgzM7r9GMEk/uz+6f8OZVSvQR+mcGsL25Gc+wpZDds7nL8+52bH6/gs18M42txpfkru2YlTm3Rnis6wHiuxSaTvPygdr4rPZbNcWNK2JmpCO1TR/bhpz9f4vcmm/Djd4D7cgxuwRBThCseKgDyGFzsdslRE4d05XHxC7tmMtwVTtmNDYfNq2gzmelWuny1sHklZlULjZs/xjaLrDKRNrcM767ioWVjleEXf4zsc0IyKXhO4XUTuB+FUxaQTc96Xc3N0l+EC7BEFrhscIyJ9vfhzs9tMqs+KyvE/RF8dFl+zFc7Q2Mdrgl4XCqZ8KWg3aDpKP+Y8lnNZ2JYIKg7gLhzs8s034h18kesdOkd8VoyK6l0XlfpebMNz+EZjbhO5/VSTbHXuX5vrc4VDhwTtJ1P/JL7N3w9r7C7j2lN9SPypOrmQbdM5RVtSvRmnieq3W3yEveLLPoRzmmx3CpqX2IRfNRbNs/GWYEflzB48o7E1Vrhco+ODhe6llB0oxkH8prHblOjK8W6xLC/dUsj68B7ub7OnYsPr2j9Snlk6viLloyKn14nWWo1L0m5Vm/P+U8c3CEZMiqitEfTdJXK2Fc7PR9zSRj+CS/Gdaad3pK5fMOzmFvuOS9uxQrZc5H0tdRP5e3DG7jniSlHMNorcnxL98qQOe27LR5zXRv+yxkjXcXHqJkTarWi91U+4o1if1eKsOh7v8L4jhtfy8pVt9JXjU/hA++6ygAUsYAGz4m8Rb9qTwnhnvwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$e_{b} \\dot{\\psi}\\mathbf{j}_{A1}$$" ], "text/plain": [ " d\n", "e_b⋅──(ψ(t)) a1_y\n", " dt" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_b.v2pt_theory(O, A, A1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Ejercicio\n", "\n", "![Disco que rueda](../images/disco.png)\n", "\n", "(Apuntes de Óscar López Rebollal)\n", "\n", "**¡Halla la velocidad y la aceleración de $P$!**" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "# Creamos nuestros sistemas de referencia\n", "A1 = IJKReferenceFrame('1')\n", "A0 = IJKReferenceFrame('0')\n", "A2 = IJKReferenceFrame('2')" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAAXCAYAAADa+mvTAAAABHNCSVQICAgIfAhkiAAABA9JREFUaIHt2VuoVUUcBvCfVurhKFoGFdLloRSLolIiinpIQ7CCgnxIJIuyoJIg6CGjy0NFx+jymEJRUmgXKIiKNCiLoqI06GL1lCQqx8jTBTQ1Tw//WbXO3uuyj7qXSfuDxRzm+883s741Z/4zs+nhf4FVGER/S/0TGK54pneoU4VZSeumUY+6OfThfnyH3fgJj+CYkvhD7cOoPJqN/birgFuE1diXBDfhJTyJB0ehI9UPY2EB9xq2YWInA24YJ+Fr7BHvPoBvxLusKIjvlg8de7QWQ2IWtuJW7MXLOP0gdOAF8SIzCrgLEresbrANYxw+xx+4OFc/EZvxF05sadMtHzryaLqYTStLuL1iVtahSifDJvyOsRX8ZhzVQX9NYZkw8fYC7qnELcjVdduHWo8eTYOaU8AtTdxlFYPrRGdAeQ5elIt7INXN66C/JtCHndiqOFfeJ8a7NFfXbR/auKNbAuaKZeOTgsZjUnkF1qe4MlTpfIHnsRgfY12OW5/7+6NUXo53KvpqCtdgCp4RK1UrJqRyT66u2z5UetQvNjtfFXQOJ4hd3bBIxq/gcdw7Sh24JeksqYiZnGI+q4hpEi+K8awWG8DW59PEz0/xTfhQ6dH0RK6tEJ+bBphfHlrFOtF5OsXMroiBXdheE9MUNqs+smXPaSm+KR9GcPlEPDWVOwsa9Ytt8jqRQ67HTEzChS2xVToZzhfLVtXshV9wfE1ME+jHKeK4MqbgmSTeZwt+TG2a8mEEl8+hu1I5QTtW4GrcLHJIFap0sj7Pxrf4s0arL6d3ODEtlVtL+Hlio/Rmrq4pH0Zw+f/QwVRONRLTcB3eVf8xq3QynCleckONzlixCRmsiWsC41JZZvyNqXw2V9eED21c/oNuww7tB9zZKa6u4zqdDOemcmONzgyxnH3ZYb/dRJajWi8NiJQzH28buZ9owoc2Lv9Bh/GBWI/zt0C/pvJKHFfTeZVOhmzG/lajk+Xm9wq451I/N3QwnkOBn8UhfhbOydWfijXCo9ta2jThQxWHWFpbb0LG4sNUPySOKwO4W/uGqEonw6WJ24LHxJZ/QUFcdmd8cgG3SvsBvNtYmPrcIe6uVwo/duKikjbd9qGKQ+SK7eJMlcd43In3xXq9Jw1mP64dhU6GO/C9+KViGA+38JNFon+9pP1GMbOPLXuRLmGxuIjfLT7ESv9umIrQTR/qPPoH9yTx82ri5qS4NQepU4TsmvGSAm6KuH1ZfgC6hwPd8qGKG4EJ4hD9Rk3czCRYZmynOq3oE8eDV0v4q8SMLtqg/BfRDR9KuaJb+n1iRzte/FRUdG+5RJxNh8XZdOgAdYpwhjgeLC/R/QEPiZ+wjgR0w4c6j0aNDXgLZx0KsR566KGHHno4AvE3thd9mKFEsMEAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left ( \\xi{\\left (t \\right )}, \\quad \\theta{\\left (t \\right )}\\right )$$" ], "text/plain": [ "(ξ(t), θ(t))" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creamos los símbolos dinámicos necesarios\n", "xi, theta = dynamicsymbols('xi, theta')\n", "xi, theta" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# Orientamos los sistemas de referencia\n", "A0.orient(A1, 'Axis', [0, A1.k]) # A0 no gira respecto a A1\n", "A2.orient(A0, 'Axis', [theta, A0.k])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\cos{\\left (\\theta{\\left (t \\right )} \\right )} & \\sin{\\left (\\theta{\\left (t \\right )} \\right )} & 0\\\\- \\sin{\\left (\\theta{\\left (t \\right )} \\right )} & \\cos{\\left (\\theta{\\left (t \\right )} \\right )} & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(θ(t)) sin(θ(t)) 0⎤\n", "⎢ ⎥\n", "⎢-sin(θ(t)) cos(θ(t)) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A2.dcm(A1)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "# Creamos el punto C, centro del disco, y especificamos su velocidad\n", "# respecto a A1\n", "C = Point('C')\n", "C.set_vel(A1, xi.diff() * A1.x)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAXCAYAAABNq8wJAAAABHNCSVQICAgIfAhkiAAAAeVJREFUWIXt1k2IjVEYB/DfvUZZzCxQkg2ifM1GrKWxYUE+Ija8ZaMpG7vZiY3yMWUxC8lKCQtKSbGzErIhFtTYKOQjJDXNjMU5L6/3vvd2rzlzTZl/nZ5zznPOef7Pe57nOS+zmDIyTBbask4219PzcbdEaBLvcB97UxurpT4QHzAfJwXyPViNnZiDYxgurF+HbYXxBXyZBl5tYYVA+kWF7kjUjaY0mDqENkb5uEJ3J8pFpfnMDMqB3IFHFbqVUT5PabBbN7AQZ2L/VEqDPQnPqmF97O/AgJC0S+O4jkFcT2izAaMaS2Crdrmwd1WLdd+wtYnNTPMcGMJDoSq9xy30FzeXb+AVfrThaI43hX4ePpdwOPYX4BDO4QqW43MH52/GiOBEDSdwD2vxsYNz2sKw8AUHK3TXou5ohS7TfhXqxTi25xMpk7hVCb0Y5YEp2ugTOCf/+nV8xRjmVejn4hMmsKSky7R/A1fxRCgOvwynwBrhep+pzqEx3BbieNdf2jiNTcL/1Hg+mcqBDVFWhU+OG1HuKc2XOUxU7D2Lg9iClx2zm2YM+TOE+kr683grVJ4ZhX7sx2u/yT8trRkR3oABLC603u7RbI6bGh+8faU1zR7G411j2QK5A9/xALv/LZ1Z/Kf4CZ19gO6z7mM8AAAAAElFTkSuQmCC\n", "text/latex": [ "$$- R\\mathbf{j}_{2}$$" ], "text/plain": [ "-R 2_y" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Localizamos el punto P, punto fijo del disco, respecto a C, en\n", "# el sistema A2 (que gira solidariamente con el disco)\n", "R = symbols('R')\n", "P = C.locatenew('P', -R * A2.j)\n", "P.pos_from(C)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": true }, "outputs": [ { "ename": "AttributeError", "evalue": "'tuple' object has no attribute 'right'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\core\\formatters.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 700\u001b[0m \u001b[0mtype_pprinters\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_printers\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 701\u001b[0m deferred_pprinters=self.deferred_printers)\n\u001b[1;32m--> 702\u001b[1;33m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 703\u001b[0m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 704\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstream\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgetvalue\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\IPython\\lib\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(self, obj)\u001b[0m\n\u001b[0;32m 378\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 379\u001b[0m \u001b[1;31m# printer registered in self.type_pprinters\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 380\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype_pprinters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcls\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 381\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 382\u001b[0m \u001b[1;31m# deferred printer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\interactive\\printing.py\u001b[0m in \u001b[0;36m_print_plain\u001b[1;34m(arg, p, cycle)\u001b[0m\n\u001b[0;32m 66\u001b[0m \u001b[1;34m\"\"\"caller for pretty, for use in IPython 0.11\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 67\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0m_can_print_latex\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 68\u001b[1;33m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstringify_func\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 69\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mIPython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[1;34m(expr, **settings)\u001b[0m\n\u001b[0;32m 2162\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2163\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2164\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mpp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2165\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2166\u001b[0m \u001b[0mpretty_use_unicode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muflag\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\printing\\pretty\\pretty.py\u001b[0m in \u001b[0;36mdoprint\u001b[1;34m(self, expr)\u001b[0m\n\u001b[0;32m 60\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdoprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 62\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_print\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_settings\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 63\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 64\u001b[0m \u001b[1;31m# empty op so _print(stringPict) returns the same\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Documents\\Python\\condaenv\\lib\\site-packages\\sympy\\physics\\vector\\vector.py\u001b[0m in \u001b[0;36mrender\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 283\u001b[0m pform = vp._print(\n\u001b[0;32m 284\u001b[0m ar[i][0][j])\n\u001b[1;32m--> 285\u001b[1;33m pform = prettyForm(*pform.right(\" \",\n\u001b[0m\u001b[0;32m 286\u001b[0m ar[i][1].pretty_vecs[j]))\n\u001b[0;32m 287\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'right'" ] }, { "data": { "image/png": "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\n", "text/latex": [ "$$(R \\operatorname{cos}\\left(\\theta\\right) \\dot{\\theta} + \\dot{\\xi})\\mathbf{i}_{0} + R \\operatorname{sin}\\left(\\theta\\right) \\dot{\\theta}\\mathbf{j}_{0}$$" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Hallamos la velocidad de P en A1, expresada en A0\n", "# ¡Con esta llamada ya estamos diciendo que C y P son fijos en A2!\n", "P.v2pt_theory(C, A1, A2).express(A0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Misión cumplida :)**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_Hemos hecho un repaso bastante profundo de las posibilidades del paquete `mechanics` de SymPy. Nos hemos dejado algunas cosas en el tintero pero no demasiadas: esta funcionalidad aún se está expandiendo y necesita pulir algunos detalles._\n", "\n", "**Referencias**\n", "\n", "* Capítulo de **aeromecánica** del libro de Cuerva y otros http://nbviewer.ipython.org/gist/Juanlu001/7711865\n", "* Estabilidad longitudinal de un Boeing 747 http://nbviewer.ipython.org/github/AlexS12/Mecanica_Vuelo/blob/master/MVII_MatrizSistema.ipynb\n", "\n", "_¿Serás tú el siguiente que publique un notebook usando SymPy? ;)_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si te ha gustado esta clase:\n", "\n", "Tweet\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####

¡Síguenos en Twitter!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Follow @Pybonacci Follow @Alex__S12 Follow @newlawrence " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### \"Licencia
Curso AeroPython por Juan Luis Cano Rodriguez y Alejandro Sáez Mollejo se distribuye bajo una Licencia Creative Commons Atribución 4.0 Internacional." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "_Las siguientes celdas contienen configuración del Notebook_\n", "\n", "_Para visualizar y utlizar los enlaces a Twitter el notebook debe ejecutarse como [seguro](http://ipython.org/ipython-doc/dev/notebook/security.html)_\n", "\n", " File > Trusted Notebook" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Follow @Pybonacci\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "Follow @Pybonacci\n", "" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "/* This template is inspired in the one used by Lorena Barba\n", "in the numerical-mooc repository: https://github.com/numerical-mooc/numerical-mooc\n", "We thank her work and hope you also enjoy the look of the notobooks with this style */\n", "\n", "\n", "\n", "El estilo se ha aplicado =)\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Esta celda da el estilo al notebook\n", "from IPython.core.display import HTML\n", "css_file = '../styles/aeropython.css'\n", "HTML(open(css_file, \"r\").read())" ] } ], "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }