Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Simulating the Earth's Orbit"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This notebook collects the calculations done in order to answer the following question posted on math.stackexchange\n",
- "\n",
- "https://math.stackexchange.com/questions/3766767/is-there-a-simple-ish-function-for-modeling-seasonal-changes-to-day-night-durati\n",
- "\n",
- "The answer is [this one](https://math.stackexchange.com/questions/3766767/is-there-a-simple-ish-function-for-modeling-seasonal-changes-to-day-night-durati/3772816#3772816), by user \"JonathanZ supports MonicaC\", who is also the author of this notebook."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This notebook requires SymPy, the Python symbolic manipulation library. \n",
- "\n",
- "Also, a lot of the code in here was written to help produce LaTeX for the linked answer, and to create the Desmos graphs that are linked from the posted answer. You probably will need to read that answer to understand what is happening in this notebook."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "%reset -f"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import sympy as sp"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Create parameters"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "# lattitude\n",
- "phi = sp.symbols('phi')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "# axial tilt of the Earth\n",
- "eps = sp.symbols('epsilon')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "# alpha is time of day in radians\n",
- "# i.e. alpha: 0 -> 2*pi = midnight to midnight\n",
- "#\n",
- "# beta is day of the year in radians\n",
- "# i.e. beta: 0 -> 2*pi = winter solstice to winter solstice\n",
- "alpha, beta = sp.symbols('alpha beta')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Direction vectors and Rotation matrices"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(\\phi \\right)}\\\\0\\\\\\sin{\\left(\\phi \\right)}\\end{matrix}\\right]$"
- ],
- "text/plain": [
- "Matrix([\n",
- "[cos(phi)],\n",
- "[ 0],\n",
- "[sin(phi)]])"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Surface normal to point at lattitude phi\n",
- "N = sp.Matrix([sp.cos(phi), 0, sp.sin(phi)])\n",
- "N\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}\\cos{\\left(\\phi \\right)}\\\\0\\\\\\sin{\\left(\\phi \\right)}\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(N))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(\\alpha \\right)} & \\sin{\\left(\\alpha \\right)} & 0\\\\- \\sin{\\left(\\alpha \\right)} & \\cos{\\left(\\alpha \\right)} & 0\\\\0 & 0 & 1\\end{matrix}\\right]$"
- ],
- "text/plain": [
- "Matrix([\n",
- "[ cos(alpha), sin(alpha), 0],\n",
- "[-sin(alpha), cos(alpha), 0],\n",
- "[ 0, 0, 1]])"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Rotation of the Earth throughout the day\n",
- "\n",
- "M_rot = sp.Matrix([\n",
- " [sp.cos(alpha), sp.sin(alpha), 0],\n",
- " [-sp.sin(alpha), sp.cos(alpha), 0],\n",
- " [0, 0, 1]\n",
- "])\n",
- "M_rot"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}\\cos{\\left(\\alpha \\right)} & \\sin{\\left(\\alpha \\right)} & 0\\\\- \\sin{\\left(\\alpha \\right)} & \\cos{\\left(\\alpha \\right)} & 0\\\\0 & 0 & 1\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(M_rot))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(\\epsilon \\right)} & 0 & \\sin{\\left(\\epsilon \\right)}\\\\0 & 1 & 0\\\\- \\sin{\\left(\\epsilon \\right)} & 0 & \\cos{\\left(\\epsilon \\right)}\\end{matrix}\\right]$"
- ],
- "text/plain": [
- "Matrix([\n",
- "[ cos(epsilon), 0, sin(epsilon)],\n",
- "[ 0, 1, 0],\n",
- "[-sin(epsilon), 0, cos(epsilon)]])"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Axial tilt of the Earth\n",
- "\n",
- "M_tilt = sp.Matrix([\n",
- " [sp.cos(eps),0,sp.sin(eps)],\n",
- " [0,1,0],\n",
- " [-sp.sin(eps),0,sp.cos(eps)]\n",
- "])\n",
- "M_tilt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}\\cos{\\left(\\epsilon \\right)} & 0 & \\sin{\\left(\\epsilon \\right)}\\\\0 & 1 & 0\\\\- \\sin{\\left(\\epsilon \\right)} & 0 & \\cos{\\left(\\epsilon \\right)}\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(M_tilt))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\left[\\begin{matrix}\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\epsilon \\right)} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)} + \\sin{\\left(\\phi \\right)} \\cos{\\left(\\epsilon \\right)}\\end{matrix}\\right]$"
- ],
- "text/plain": [
- "Matrix([\n",
- "[ sin(epsilon)*sin(phi) + cos(alpha)*cos(epsilon)*cos(phi)],\n",
- "[ -sin(alpha)*cos(phi)],\n",
- "[-sin(epsilon)*cos(alpha)*cos(phi) + sin(phi)*cos(epsilon)]])"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "N_ab = M_tilt * M_rot * N\n",
- "N_ab"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\epsilon \\right)} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)} + \\sin{\\left(\\phi \\right)} \\cos{\\left(\\epsilon \\right)}\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(N_ab))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle 1$"
- ],
- "text/plain": [
- "1"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Verifying unit length\n",
- "sp.simplify(N_ab.dot(N_ab))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)}\\\\- \\sin{\\left(\\epsilon \\right)} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\phi \\right)} + \\sin{\\left(\\phi \\right)} \\cos{\\left(\\epsilon \\right)}\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(N_ab))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\left[\\begin{matrix}- \\cos{\\left(\\beta \\right)}\\\\- \\sin{\\left(\\beta \\right)}\\\\0\\end{matrix}\\right]$"
- ],
- "text/plain": [
- "Matrix([\n",
- "[-cos(beta)],\n",
- "[-sin(beta)],\n",
- "[ 0]])"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Instead of putting the Earth in the appropriate place in its orbit\n",
- "# all we care about is where it is relative to the Sun, so we'll just \n",
- "# 'move' the Sun instead.\n",
- "\n",
- "sol_b = sp.Matrix([-sp.cos(beta), -sp.sin(beta), 0])\n",
- "sol_b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\left[\\begin{matrix}- \\cos{\\left(\\beta \\right)}\\\\- \\sin{\\left(\\beta \\right)}\\\\0\\end{matrix}\\right]\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(sol_b))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Key result - Formula for the Solar Angle"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)} - \\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}$"
- ],
- "text/plain": [
- "sin(alpha)*sin(beta)*cos(phi) - sin(epsilon)*sin(phi)*cos(beta) - cos(alpha)*cos(beta)*cos(epsilon)*cos(phi)"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# SA_ = Solar Angle\n",
- "SA_cos = N_ab.dot(sol_b)\n",
- "sp.expand(SA_cos)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)} - \\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(sp.expand(SA_cos)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "def cos_to_horizon_deg(exp):\n",
- " return 90 - 180*sp.acos(exp)/sp.pi"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Now create Desmos visualizations"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### First visualization with simple time implementation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Reserved for 'time'\n",
- "t = sp.symbols('t')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "90 - 57.2956455309397*arccos(-(sin(0.0174533333333333*L)*sin(0.0174533333333333*p) + cos(0.0174533333333333*L)*cos(0.0174533333333333*p)*cos(6.2832*x/H))*cos(6.2832*x/(H*Y)) + sin(6.2832*x/H)*sin(6.2832*x/(H*Y))*cos(0.0174533333333333*L))\n"
- ]
- }
- ],
- "source": [
- "# Desmos graph 1\n",
- "\n",
- "# Single letter vars for Desmos\n",
- "L = sp.symbols('L') \n",
- "p = sp.symbols('p')\n",
- "H = sp.symbols('H') \n",
- "Y = sp.symbols('Y') \n",
- "x = sp.symbols('x') \n",
- "\n",
- "\n",
- "# 't' will be in units of 'hours'\n",
- "def desmosify1(e):\n",
- " e1 = e.subs([\n",
- " (eps, 2*sp.pi*p*sp.Rational(1,360)),\n",
- " (phi, sp.pi*L*sp.Rational(1,180)),\n",
- " (alpha, 2*sp.pi*t/H),\n",
- " (beta, 2*sp.pi * t/(H*Y))\n",
- " ])\n",
- " \n",
- " # Rename t (time) as x, as Desmos wants to plot y vs. x\n",
- " # Also, Desmos doesn't like my 'pi'\n",
- " e2 = e1.subs(t,x).subs(sp.pi, 3.1416)\n",
- " \n",
- " return str(e2).replace('acos', 'arccos')\n",
- "\n",
- "print(desmosify1(cos_to_horizon_deg(SA_cos)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Visualizations 2 & 3 - Solar height over course of a day"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Desmos graphs 2 & 3\n",
- "\n",
- "# beta is determined by a slider for day of yer\n",
- "# beta: 0 -> 2*pi to d: 0 -> 365\n",
- "\n",
- "# alpha is should already have been converted to 't' (in hours)\n",
- "# in the passed in expression.\n",
- "\n",
- "# Single letter vars for Desmos\n",
- "L = sp.symbols('L') \n",
- "d = sp.symbols('d')\n",
- "x = sp.symbols('x') # for Desmos\n",
- "\n",
- "def desmosify23(e):\n",
- " e1 = e.subs([\n",
- " (eps, 2*sp.pi*23.44*sp.Rational(1,360)),\n",
- " (phi, sp.pi*L*sp.Rational(1,180)),\n",
- " (beta, 2*sp.pi * d*sp.Rational(1,365))\n",
- " ])\n",
- " \n",
- " # Rename t (time) as x, as Desmos wants to plot y vs. x\n",
- " # Also, Desmos doesn't like my 'pi'\n",
- " e2 = e1.subs(t,x).subs(sp.pi, 3.1416)\n",
- " \n",
- " return str(e2).replace('acos', 'arccos')\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "90 - 57.2956455309397*arccos(-(0.397789385116828*sin(0.0174533333333333*L) + 0.917476759971813*cos(0.0174533333333333*L)*cos(0.2618*x))*cos(0.0172142465753425*d) + sin(0.0172142465753425*d)*sin(0.2618*x)*cos(0.0174533333333333*L))\n"
- ]
- }
- ],
- "source": [
- "SA_daily = SA_cos.subs([\n",
- " (alpha, 2*sp.pi*t*sp.Rational(1,24))\n",
- "])\n",
- "\n",
- "print(desmosify23(cos_to_horizon_deg(SA_daily)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle - \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\\right) \\cos{\\left(\\beta \\right)} + \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}$"
- ],
- "text/plain": [
- "-(sin(epsilon)*sin(phi) + cos(alpha)*cos(epsilon)*cos(phi))*cos(beta) + sin(alpha)*sin(beta)*cos(phi)"
- ]
- },
- "execution_count": 53,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "SA_daily\n",
- "SA_cos"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\\right) \\cos{\\left(\\beta \\right)} + \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(SA_cos))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- \\frac{180 \\operatorname{acos}{\\left(- \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)} \\cos{\\left(\\frac{\\pi t}{12} \\right)}\\right) \\cos{\\left(\\beta \\right)} + \\sin{\\left(\\beta \\right)} \\sin{\\left(\\frac{\\pi t}{12} \\right)} \\cos{\\left(\\phi \\right)} \\right)}}{\\pi} + 90\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(cos_to_horizon_deg(SA_daily)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Sidereal 'cheat'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle - \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)} \\cos{\\left(\\beta - \\frac{\\pi t}{12} \\right)}\\right) \\cos{\\left(\\beta \\right)} - \\sin{\\left(\\beta \\right)} \\sin{\\left(\\beta - \\frac{\\pi t}{12} \\right)} \\cos{\\left(\\phi \\right)}$"
- ],
- "text/plain": [
- "-(sin(epsilon)*sin(phi) + cos(epsilon)*cos(phi)*cos(beta - pi*t/12))*cos(beta) - sin(beta)*sin(beta - pi*t/12)*cos(phi)"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Now with the Sidereal cheat\n",
- "\n",
- "N_ab_sidereal = M_tilt * M_rot.subs(alpha, alpha - beta) * N\n",
- "SA_cos_sidereal = N_ab_sidereal.dot(sol_b)\n",
- "\n",
- "SA_daily_sidereal = SA_cos_sidereal.subs([\n",
- " #(alpha, 2*sp.pi*t/24.0)\n",
- " (alpha, 2*sp.pi*t*sp.Rational(1,24))\n",
- "])\n",
- "\n",
- "SA_daily_sidereal"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)} \\cos{\\left(\\beta - \\frac{\\pi t}{12} \\right)}\\right) \\cos{\\left(\\beta \\right)} - \\sin{\\left(\\beta \\right)} \\sin{\\left(\\beta - \\frac{\\pi t}{12} \\right)} \\cos{\\left(\\phi \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(SA_daily_sidereal))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "90 - 57.2956455309397*arccos(-(0.397789385116828*sin(0.0174533333333333*L) + 0.917476759971813*cos(0.0174533333333333*L)*cos(0.0172142465753425*d - 0.2618*x))*cos(0.0172142465753425*d) - sin(0.0172142465753425*d)*sin(0.0172142465753425*d - 0.2618*x)*cos(0.0174533333333333*L))\n"
- ]
- }
- ],
- "source": [
- "print(desmosify23(cos_to_horizon_deg(SA_daily_sidereal)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- \\frac{180 \\operatorname{acos}{\\left(- \\left(\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} + \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)} \\cos{\\left(\\beta - \\frac{\\pi t}{12} \\right)}\\right) \\cos{\\left(\\beta \\right)} - \\sin{\\left(\\beta \\right)} \\sin{\\left(\\beta - \\frac{\\pi t}{12} \\right)} \\cos{\\left(\\phi \\right)} \\right)}}{\\pi} + 90\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(cos_to_horizon_deg(SA_daily_sidereal)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Formula for length of daylight"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 57,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)} - \\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}\n"
- ]
- }
- ],
- "source": [
- "sp.expand(SA_cos)\n",
- "print(sp.latex(sp.expand(SA_cos)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 60,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(2*atan((A - sqrt(A**2 + B**2 - C**2))/(B - C)),\n",
- " 2*atan((A + sqrt(A**2 + B**2 - C**2))/(B - C)))"
- ]
- },
- "execution_count": 60,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "A, B, C, w = sp.symbols('A B C w')\n",
- "\n",
- "# w is pi*t/12\n",
- "\n",
- "f = A*sp.sin(w) + B*sp.cos(w) + C\n",
- "# This call to sp.solve() is fairly slow. Give it 20-30 seconds to run\n",
- "(sunrise, sunset) = sp.solve(f, w)\n",
- "sunrise, sunset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle 2 \\operatorname{atan}{\\left(\\frac{A - \\sqrt{A^{2} + B^{2} - C^{2}}}{B - C} \\right)}$"
- ],
- "text/plain": [
- "2*atan((A - sqrt(A**2 + B**2 - C**2))/(B - C))"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sunrise"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 58,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2 \\operatorname{atan}{\\left(\\frac{A - \\sqrt{A^{2} + B^{2} - C^{2}}}{B - C} \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(sunrise))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 59,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2 \\operatorname{atan}{\\left(\\frac{A + \\sqrt{A^{2} + B^{2} - C^{2}}}{B - C} \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(sunset))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle 2 \\operatorname{atan}{\\left(\\frac{A + \\sqrt{A^{2} + B^{2} - C^{2}}}{B - C} \\right)}$"
- ],
- "text/plain": [
- "2*atan((A + sqrt(A**2 + B**2 - C**2))/(B - C))"
- ]
- },
- "execution_count": 35,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sunset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2 \\operatorname{atan}{\\left(\\frac{A - \\sqrt{A^{2} + B^{2} - C^{2}}}{B - C} \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(sunrise))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 47,
- "metadata": {},
- "outputs": [],
- "source": [
- "#A, B, C, w = sp.symbols('A B C w')\n",
- "\n",
- "# w is pi*t/12\n",
- "\n",
- "#f = A*sp.sin(w) + B*sp.cos(w) + C\n",
- "# Fairly slow\n",
- "#(sunrise, sunset) = sp.solve(f, w)\n",
- "lod_abc = (sunset-sunrise)\n",
- "lod_abc2= 2*sp.pi - (sunrise-sunset)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 48,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle - 2 \\operatorname{atan}{\\left(\\frac{- \\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)} + 2 \\operatorname{atan}{\\left(\\frac{\\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)}$"
- ],
- "text/plain": [
- "-2*atan((-sqrt(sin(beta)**2*cos(phi)**2 - sin(epsilon)**2*sin(phi)**2*cos(beta)**2 + cos(beta)**2*cos(epsilon)**2*cos(phi)**2) + sin(beta)*cos(phi))/(sin(epsilon)*sin(phi)*cos(beta) - cos(beta)*cos(epsilon)*cos(phi))) + 2*atan((sqrt(sin(beta)**2*cos(phi)**2 - sin(epsilon)**2*sin(phi)**2*cos(beta)**2 + cos(beta)**2*cos(epsilon)**2*cos(phi)**2) + sin(beta)*cos(phi))/(sin(epsilon)*sin(phi)*cos(beta) - cos(beta)*cos(epsilon)*cos(phi)))"
- ]
- },
- "execution_count": 48,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Replace A, B, and C with functions of our parameters\n",
- "\n",
- "lod = lod_abc.subs([\n",
- " (A, sp.sin(beta) * sp.cos(phi)),\n",
- " (B, -sp.cos(beta) * sp.cos(eps) * sp.cos(phi)),\n",
- " (C, -sp.sin(eps) * sp.sin(phi) * sp.cos(beta))\n",
- "])\n",
- "\n",
- "lod2 = lod_abc2.subs([\n",
- " (A, sp.sin(beta) * sp.cos(phi)),\n",
- " (B, -sp.cos(beta) * sp.cos(eps) * sp.cos(phi)),\n",
- " (C, -sp.sin(eps) * sp.sin(phi) * sp.cos(beta))\n",
- "])\n",
- "\n",
- "lod"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/latex": [
- "$\\displaystyle - 2 \\operatorname{atan}{\\left(\\frac{- \\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)} + 2 \\operatorname{atan}{\\left(\\frac{\\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)} + 2 \\pi$"
- ],
- "text/plain": [
- "-2*atan((-sqrt(sin(beta)**2*cos(phi)**2 - sin(epsilon)**2*sin(phi)**2*cos(beta)**2 + cos(beta)**2*cos(epsilon)**2*cos(phi)**2) + sin(beta)*cos(phi))/(sin(epsilon)*sin(phi)*cos(beta) - cos(beta)*cos(epsilon)*cos(phi))) + 2*atan((sqrt(sin(beta)**2*cos(phi)**2 - sin(epsilon)**2*sin(phi)**2*cos(beta)**2 + cos(beta)**2*cos(epsilon)**2*cos(phi)**2) + sin(beta)*cos(phi))/(sin(epsilon)*sin(phi)*cos(beta) - cos(beta)*cos(epsilon)*cos(phi))) + 2*pi"
- ]
- },
- "execution_count": 52,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "lod2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 49,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- 2 \\operatorname{atan}{\\left(\\frac{- \\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)} + 2 \\operatorname{atan}{\\left(\\frac{\\sqrt{\\sin^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\phi \\right)} - \\sin^{2}{\\left(\\epsilon \\right)} \\sin^{2}{\\left(\\phi \\right)} \\cos^{2}{\\left(\\beta \\right)} + \\cos^{2}{\\left(\\beta \\right)} \\cos^{2}{\\left(\\epsilon \\right)} \\cos^{2}{\\left(\\phi \\right)}} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\phi \\right)}}{\\sin{\\left(\\epsilon \\right)} \\sin{\\left(\\phi \\right)} \\cos{\\left(\\beta \\right)} - \\cos{\\left(\\beta \\right)} \\cos{\\left(\\epsilon \\right)} \\cos{\\left(\\phi \\right)}} \\right)}\n"
- ]
- }
- ],
- "source": [
- "print(sp.latex(lod))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "https://www.desmos.com/calculator/e5ta8kejtt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 50,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- 7.63941940412529 \\operatorname{arctan}{\\left(\\frac{- \\sqrt{- \\sin^{2}{\\left(0.0174533333333333 L \\right)} \\sin^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} + \\sin^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos^{2}{\\left(0.0174533333333333 L \\right)} + \\cos^{2}{\\left(0.0174533333333333 L \\right)} \\cos^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)}} + \\sin{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos{\\left(0.0174533333333333 L \\right)}}{\\sin{\\left(0.0174533333333333 L \\right)} \\sin{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)} - \\cos{\\left(0.0174533333333333 L \\right)} \\cos{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)}} \\right)} + 7.63941940412529 \\operatorname{arctan}{\\left(\\frac{\\sqrt{- \\sin^{2}{\\left(0.0174533333333333 L \\right)} \\sin^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} + \\sin^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos^{2}{\\left(0.0174533333333333 L \\right)} + \\cos^{2}{\\left(0.0174533333333333 L \\right)} \\cos^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)}} + \\sin{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos{\\left(0.0174533333333333 L \\right)}}{\\sin{\\left(0.0174533333333333 L \\right)} \\sin{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)} - \\cos{\\left(0.0174533333333333 L \\right)} \\cos{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)}} \\right)}\n"
- ]
- }
- ],
- "source": [
- "# Desmosify lod\n",
- "L = sp.symbols('L') \n",
- "p = sp.symbols('p')\n",
- "Y = sp.symbols('Y') \n",
- "d = sp.symbols('d') \n",
- "x = sp.symbols('x') \n",
- "\n",
- "def desmosify_lod( expr ):\n",
- " t0 = expr*12/sp.pi # take care of the pi/12, i.e. rescale to 24 hour day\n",
- "\n",
- " t1 = t0.subs([\n",
- " (eps, 2*sp.pi*p*sp.Rational(1,360)),\n",
- " (phi, sp.pi*L*sp.Rational(1,180)),\n",
- " (beta, 2*sp.pi * d/Y)\n",
- " ])\n",
- "\n",
- " t2 = t1.subs(d,x).subs(sp.pi, 3.1416)\n",
- " t3 = sp.latex(t2).replace(\"**\", \"^\").replace(\"atan\", \"arctan\")\n",
- " return t3\n",
- "\n",
- "print(desmosify_lod(lod))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 51,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "- 7.63941940412529 \\operatorname{arctan}{\\left(\\frac{- \\sqrt{- \\sin^{2}{\\left(0.0174533333333333 L \\right)} \\sin^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} + \\sin^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos^{2}{\\left(0.0174533333333333 L \\right)} + \\cos^{2}{\\left(0.0174533333333333 L \\right)} \\cos^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)}} + \\sin{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos{\\left(0.0174533333333333 L \\right)}}{\\sin{\\left(0.0174533333333333 L \\right)} \\sin{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)} - \\cos{\\left(0.0174533333333333 L \\right)} \\cos{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)}} \\right)} + 7.63941940412529 \\operatorname{arctan}{\\left(\\frac{\\sqrt{- \\sin^{2}{\\left(0.0174533333333333 L \\right)} \\sin^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} + \\sin^{2}{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos^{2}{\\left(0.0174533333333333 L \\right)} + \\cos^{2}{\\left(0.0174533333333333 L \\right)} \\cos^{2}{\\left(0.0174533333333333 p \\right)} \\cos^{2}{\\left(\\frac{6.2832 x}{Y} \\right)}} + \\sin{\\left(\\frac{6.2832 x}{Y} \\right)} \\cos{\\left(0.0174533333333333 L \\right)}}{\\sin{\\left(0.0174533333333333 L \\right)} \\sin{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)} - \\cos{\\left(0.0174533333333333 L \\right)} \\cos{\\left(0.0174533333333333 p \\right)} \\cos{\\left(\\frac{6.2832 x}{Y} \\right)}} \\right)} + 24.0\n"
- ]
- }
- ],
- "source": [
- "print(desmosify_lod(lod2))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Work area"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "w, r, s = sp.symbols('w r s')\n",
- "\n",
- "f = sp.sin(s)*sp.sin(w) + 4*sp.cos(w) + 2\n",
- "\n",
- "# Incredibly slow\n",
- "#sp.solve(f, w, exclude=[r,s])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "#sp.solve( SA_daily, t, exclude=[eps, phi, beta])\n",
- "SA_daily.subs([(t, 0)])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# simplified version of lod\n",
- "b = sp.symbols('b')\n",
- "lod_simplest = lod.subs([\n",
- " (eps, 3.14 * 23.5/180.0),\n",
- " (phi, 3.14*42.36/180.0),\n",
- " (beta, 6.28*x/365.0)\n",
- "])\n",
- "\n",
- "print(sp.latex(lod_simplest).replace(\"atan\", \"arctan\"))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# simplified version of lod2\n",
- "b = sp.symbols('b')\n",
- "lod_simplest2 = lod2.subs([\n",
- " (eps, 3.14 * 23.5/180.0),\n",
- " (phi, 3.14*42.36/180.0),\n",
- " (beta, 6.28*x/365.0)\n",
- "])\n",
- "\n",
- "print(sp.latex(lod_simplest2).replace(\"atan\", \"arctan\"))"
- ]
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
- }
Add Comment
Please, Sign In to add comment