Skip to content

Instantly share code, notes, and snippets.

@fjsanti
Created September 20, 2019 13:28
Show Gist options
  • Save fjsanti/950592e7fd0fc307570ee50d382f464c to your computer and use it in GitHub Desktop.
Save fjsanti/950592e7fd0fc307570ee50d382f464c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "7_Coordenadas_Esfericas_y_Cilindricas.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/github/HaydeePeruyero/Geometria-Analitica-1/blob/master/7_Coordenadas_Esfericas_y_Cilindricas.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "az6LHGL3-Oq3",
"colab_type": "text"
},
"source": [
"# Coordenadas Esféricas y Cilíndricas"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "erQLX2_hr9y1",
"colab_type": "text"
},
"source": [
"Los husos horarios y las coordenadas que usan los marineros son una muestra de la utilidad de las coordenadas esféricas en nuestro globo terráqueo. Tanto esas coordenadas como las cilíndricas son una generalización de las coordenadas polares del plano al caso del espacio. Surgen de manera natural en problemas de radiación y se utilizaran en la parte de integración en cálculo de varias\n",
"variables."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xOd_l_qssYOW",
"colab_type": "text"
},
"source": [
"## Conversión entre Coordenadas Esféricas y Cartesianas"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G4YBbAQK_Khh",
"colab_type": "text"
},
"source": [
"Consideremos un plano fijo en el espacio, en el cual se introduce un sistema coordenado polar con eje polar $X$ y polo $O$, y una recta perpendicualr a dicho plano que denotaremos por $Z$ y en la cual elegimos como rayo positivo el que con el eje polar y el conjugado dé lugar a un sistema derecho. Entonces cualquier punto $P$ del espacio determina tres números llamados las ___coordenadas esféricas___ del punto $P$.\n",
"\n",
"\n",
"* La distancia del punto al _polo_ se denotará por $r$.\n",
"* El ángulo entre el semiplano $XZ$ y el semiplano por la recta $Z$ que contiene al punto $P$, se denotará por $\\theta$ y es tal que $0\\leq \\theta < 2\\pi$.\n",
"* El ángulo entre el rayo positivo del eje $Z$ y el rayo $OP$, se denotará por $\\phi$ y es tal que $0\\leq \\phi < \\pi$. \n",
"\n",
"Cuando se tienen dos sistemas coordenados para un mismo espacio resulta natural el preguntarse si existe una manera de 'pasar' de una a otra. Para el caso del espacio $\\mathbb{R}^{3}$, es sabido que las fórmulas para obtener las coordenadas cartesianas $(x,y,z)$ de un punto $(r_0,\\theta_0,\\phi_0)$ en coordenadas esféricas son:\n",
" \\begin{align*}\n",
" x &= r_0\\cos(\\theta_{0})\\sin(\\phi_0), \\\\\n",
" y &= r_0\\sin(\\theta_{0})\\sin(\\phi_0)\\\\\n",
" z &= r_0\\cos(\\phi_0).\n",
" \\end{align*}\n",
" \n",
"Recíprocamente, las fórmulas para obtener las coordenadas esféricas $(r,\\theta,\\phi)$ de un punto $(x_{0},y_{0},z_0)$ en coordenadas cartesianas son:\n",
" \\begin{align*}\n",
" r &= \\sqrt{x_{0}^2+y_{0}^2+z_0^{2}}, \\\\\n",
" \\theta &= \\arctan{\\frac{y_{0}}{x_{0}}}\\\\\n",
" \\phi & = \\arccos{\\frac{z_0}{\\sqrt{x_{0}^2+y_{0}^2+z_0^{2}}}}.\n",
" \\end{align*}\n",
"\n",
"Utilizando el módulo de `SymPy` podemos construir una función en Python que nos ayude a hacer estas conversiones:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "aUy4Ajbl-J6H",
"colab_type": "code",
"colab": {}
},
"source": [
"import sympy as sym\n",
"\n",
"def spherical_to_cartesian(rr, theta, phi):\n",
" if 0 <= theta < 2*sym.pi and 0 <= phi < sym.pi:\n",
" xx = rr * sym.cos(theta)*sym.sin(phi)\n",
" yy = rr * sym.sin(theta)*sym.sin(phi)\n",
" zz = rr*sym.cos(phi)\n",
" return(xx, yy, zz)\n",
" else:\n",
" return('Ángulos fuera de rango')\n",
"\n",
"def cartesian_to_spherical(x, y, z): \n",
" rr = sym.sqrt(x**2 + y**2 + z**2)\n",
" theta = sym.atan2(y, x)\n",
" phi = sym.acos(z / rr )\n",
" return(rr, theta, phi )"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "07VUSfZ5Djev",
"colab_type": "text"
},
"source": [
"Veamos ahora algunos ejemplos de cómo utilizar estas funciones."
]
},
{
"cell_type": "code",
"metadata": {
"id": "XLDyGn2OCb0G",
"colab_type": "code",
"colab": {}
},
"source": [
"# De esféricas a cartesianas\n",
"spherical_to_cartesian(1, sym.pi/2, sym.pi/4)\n",
"#spherical_to_cartesian(1., 1., 1.)\n",
"#spherical_to_cartesian(1., 1., 1.)\n",
"#spherical_to_cartesian(2, 4*sym.pi/3, 2*sym.pi/3)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "wM38ipzlCorG",
"colab_type": "code",
"colab": {}
},
"source": [
"# De cartesianas a esféricas\n",
"cartesian_to_spherical(1,1,0)\n",
"# cartesian_to_spherical(0,sym.sqrt(2)/2,sym.sqrt(2)/2)\n",
"#cartesian_to_spherical(-sym.sqrt(3)/2,-3/2,-1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "XaYDscAEVC6w",
"colab_type": "code",
"colab": {}
},
"source": [
"#Composición de funciones:\n",
"A=spherical_to_cartesian(2, 4*sym.pi/3, 2*sym.pi/3)\n",
"cartesian_to_spherical(A[0], A[1], A[2])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2_w0-1apVhW9",
"colab_type": "code",
"colab": {}
},
"source": [
"#import numpy as np\n",
"#-np.pi + np.arctan(1.0*np.sqrt(3))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "JiacXAvlpuUo",
"colab_type": "code",
"colab": {}
},
"source": [
"# Forma 2 de cartesianas a esfericas: \n",
"import numpy as np\n",
"import sympy as sym\n",
"def cartesian_to_spherical(x, y, z): \n",
" rr = np.sqrt(x**2 + y**2 + z**2)\n",
" theta = np.arctan2(y, x)\n",
" phi = np.arccos(z / rr )\n",
" return(rr, theta, phi )"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RC2BchYHpJEH",
"colab_type": "code",
"colab": {}
},
"source": [
"#Forma 2:\n",
"cartesian_to_spherical(-np.sqrt(3)/2,-3/2,-1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "tcXAAQWwsLgd",
"colab_type": "text"
},
"source": [
"## Conversión entre Coordenadas Cilíndricas y Cartesianas"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2E2hJIwvsadA",
"colab_type": "text"
},
"source": [
"Consideremos un plano con un sistema coordenado polar cuyo eje polar denotamos por $X$, y tracemos por el polo una recta perpendicular que denotaremos por $Z$ en la cual elegimos un rayo positivo. Entonces, cualquier punto $P$ del espacio que no pertenezca a la recta $Z$ determina tres números reales en la forma siguiente:\n",
"\n",
"\n",
"* La _distancia_ del punto $P$ a la recta perpendicular $Z$, que denotaremos por $r$.\n",
"* El _ángulo_ entre los semiplanos $XZ$ y $PZ$, que denotaremos por $\\theta$ y cuyo intervalo de variación será $[0,2\\pi)$.\n",
"* La _altura_ orientada sobre el plano elegido, acorde a la orientación en la recta coordenada $Z$ y que denotaremos por $z$.\n",
"\n",
"Los números de la terna $(r,\\theta, z)$ se denominan las coordenadas cilíndricas del punto $P$ y suelen escribirse en ese orden.\n",
"\n",
"\n",
"¿Cuál es el lugar correspondiente a la ecuación $r=constante$?\n",
"\n",
"¿Cuál es el lugar geométrico correspondiente a la ecuación $\\theta=constante$?\n",
"\n",
"¿Cuál es el lugar geométrico correspondiente a la ecuación $z=constante$?\n",
"\n",
"Para obtener la realción entre las coordenadas cilíndricas y las cartesianas, vamos a considerar como eje $X$ a la recta que contiene el eje polar, como eje $Z$ a la recta perpendicular al plano fijo y como eje $Y$ a la recta perpendicular a las dos anteriores con la orientación adecuada para que el sistema resulte derecho. Entonces, el punto $P$ de coordenadas cilíndricas $(r_0,\\theta_0,z_0)$ tiene coordenadas cartesianas:\n",
"\n",
"\\begin{align*}\n",
" x &= r_0\\cos(\\theta_{0}), \\\\\n",
" y &= r_0\\sin(\\theta_{0})\\\\\n",
" z &= z_0.\n",
" \\end{align*}\n",
"\n",
"Recíprocamente, si conocemos las coordenadas cartesianas $(x_0,y_0,z_0)$ del punto $P$, sus coordenadas cilíndricas son:\n",
"\n",
"\\begin{align*}\n",
" r &= \\sqrt{x_{0}^2+y_{0}^2}, \\\\\n",
" \\theta &= \\arctan{\\frac{y_{0}}{x_{0}}}\\\\\n",
" z & = z_0.\n",
" \\end{align*}\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2LhOkQQXsRts",
"colab_type": "code",
"colab": {}
},
"source": [
"import sympy as sym\n",
"\n",
"def cylindrical_to_cartesian(rr, theta, zz):\n",
" if 0<= theta < 2*sym.pi:\n",
" xx = rr * sym.cos(theta)\n",
" yy = rr * sym.sin(theta)\n",
" return(xx, yy, zz)\n",
" else:\n",
" return('Ángulos fuera de rango')\n",
"\n",
"def cartesian_to_cylindrical(x, y, z): \n",
" rr = sym.sqrt(x**2 + y**2 )\n",
" theta = sym.atan2(y, x)\n",
" return(rr, theta, z )\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "G0axyPZCTLNt",
"colab_type": "code",
"colab": {}
},
"source": [
"# Cilíndricas a cartesianas\n",
"\n",
"cylindrical_to_cartesian(1,sym.pi/2,-2)\n",
"# cylindrical_to_cartesian(1,1,1)\n",
"# cylindrical_to_cartesian(1.,1.,1.)\n",
"# cylindrical_to_cartesian(2, 4*sym.pi/3,-1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "xLBpMBoBTU2m",
"colab_type": "code",
"colab": {}
},
"source": [
"#Cartesiana a cilíndricas:\n",
"\n",
"cartesian_to_cylindrical(0, 1, -2)\n",
"#cartesian_to_cylindrical(-1,-sym.sqrt(3),-1)\n",
"#cartesian_to_cylindrical(sym.cos(1), sym.sin(1), 1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QxRUzbiHUBdT",
"colab_type": "code",
"colab": {}
},
"source": [
"# Composición de funciones:\n",
"A=cylindrical_to_cartesian(1,1,1)\n",
"cartesian_to_cylindrical(A[0],A[1],A[2])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "1iJcagI2Urzy",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "a5341TEXPeSm",
"colab_type": "text"
},
"source": [
"## Gráfica de regiones en coordenadas esféricas"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4L5NNi9idrHw",
"colab_type": "code",
"colab": {}
},
"source": [
"# r=constante\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mpl_toolkits.mplot3d.axes3d as axes3d\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1,1,1, projection='3d')\n",
"\n",
"theta = np.linspace(0, 2*np.pi, 40)\n",
"phi = np.linspace(0, np.pi, 40)\n",
"THETA, PHI = np.meshgrid(theta, phi)\n",
"\n",
"R_a = 1\n",
"\n",
"X = R_a * np.sin(PHI) * np.cos(THETA)\n",
"Y = R_a * np.sin(PHI) * np.sin(THETA)\n",
"Z = R_a * np.cos(PHI)\n",
"\n",
"plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet') , linewidth=0 , antialiased=False , alpha=0.5)\n",
"\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='g', linewidth=0, alpha=0.3)\n",
"\n",
"#Gráfica a < R < b\n",
" \n",
"#R_b=2\n",
"\n",
"#X = R_b * np.sin(PHI) * np.cos(THETA)\n",
"#Y = R_b * np.sin(PHI) * np.sin(THETA)\n",
"#Z = R_b * np.cos(PHI)\n",
"\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='w', linewidth=0, alpha=0.5)\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "PGwhkrSAduEL",
"colab_type": "code",
"colab": {}
},
"source": [
"#Theta=constante\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mpl_toolkits.mplot3d.axes3d as axes3d\n",
"\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1,1,1, projection='3d')\n",
"\n",
"THETA = np.arange(0, 2*np.pi - 0.001, 40)\n",
"PHI = np.arange(0, np.pi + 0.001, 0.05)\n",
"R = np.arange(0, 1, 0.1)\n",
"\n",
"theta, phi = np.meshgrid(THETA, PHI)\n",
"\n",
"theta_a = np.pi/6\n",
"\n",
"X = R * np.sin(phi) * np.cos(theta_a)\n",
"Y = R * np.sin(phi) * np.sin(theta_a)\n",
"Z = R * np.cos(phi)\n",
"\n",
"plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='r' , linewidth=0 , antialiased=False , alpha=0.5)\n",
"\n",
"# Región a <= theta <= b\n",
"#theta_b = np.pi/3\n",
"#X = R * np.sin(phi) * np.cos(theta_b) \n",
"#Y = R * np.sin(phi) * np.sin(theta_b)\n",
"#Z = R * np.cos(phi)\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='g', linewidth=0, antialiased=False, alpha=0.5)\n",
"\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "jRAkKtsONIpm",
"colab_type": "code",
"colab": {}
},
"source": [
"# phi=constante\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mpl_toolkits.mplot3d.axes3d as axes3d\n",
"\n",
"theta, r = np.linspace(0, 2 * np.pi, 40), np.linspace(0, 1, 40)\n",
"THETA, R = np.meshgrid(theta, r)\n",
"\n",
"PHI = np.pi/6\n",
"\n",
"X = R * np.sin(PHI) * np.cos(THETA)\n",
"Y = R * np.sin(PHI) * np.sin(THETA)\n",
"Z = R * np.cos(PHI)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1,1,1, projection='3d')\n",
"plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet'), linewidth=0, antialiased=False, alpha=0.5)\n",
"\n",
"# Región a <= phi <= b\n",
"\n",
"# PHI = np.pi/4\n",
"\n",
"#X = R * np.sin(PHI) * np.cos(THETA)\n",
"#Y = R * np.sin(PHI) * np.sin(THETA)\n",
"#Z = R * np.cos(PHI)\n",
"\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet'), linewidth=0, antialiased=False, alpha=0.5)\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "9HOczx0aRUhM",
"colab_type": "text"
},
"source": [
"## Gráfica de regiones en coordenadas cilíndricas"
]
},
{
"cell_type": "code",
"metadata": {
"id": "AMxGJQIiO-7W",
"colab_type": "code",
"colab": {}
},
"source": [
"# r=constante\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mpl_toolkits.mplot3d.axes3d as axes3d\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1,1,1, projection='3d')\n",
"\n",
"theta = np.arange(0, 2*np.pi+0.1, 0.09)\n",
"zz=np.arange(-10,10,0.1)\n",
"THETA, ZZ = np.meshgrid(theta, zz)\n",
"\n",
"R_a = 1\n",
"\n",
"X = R_a * np.cos(theta)\n",
"Y = R_a * np.sin(theta)\n",
"Z = ZZ\n",
"\n",
"plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet') , linewidth=0 , antialiased=False , alpha=0.5)\n",
"\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='b', linewidth=0, alpha=0.3)\n",
"\n",
"#Gráfica a < R < b\n",
" \n",
"#R_b=2\n",
"\n",
"#X = R_b * np.cos(theta)\n",
"#Y = R_b * np.sin(theta)\n",
"#Z = ZZ\n",
"\n",
"#plot = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='g', linewidth=0, alpha=0.5)\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_cHtHtDOPSWm",
"colab_type": "code",
"colab": {}
},
"source": [
"\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "osxtelFSSTx5",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8CC2xsN0TbTD",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment