{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Examples 2 -- Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following examples use the vector concepts from chapter 2.\n",
    "\n",
    "Contents:\n",
    "- [A. vector sum](#A)\n",
    "- [B. find force vector](#B)\n",
    "- [C. find parallel and perpendicular components](#C)\n",
    "- [D. find minimum force required](#D)             \n",
    "- [E. find minimum force required](#E)             \n",
    "- [F. find n-t force components](#F)               \n",
    "- [G. 3D vector sum](#G)                           \n",
    "- [H. vector from direction cosines](#H)           \n",
    "- [I. component of force along a line](#I)         \n",
    "- [J. component of force along a line, again](#J)  \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "dtr = pi/180  # factor for degree-to-radian conversion\n",
    "from matplotlib.pyplot import *\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "<a name=\"A\"></a>\n",
    "\n",
    "\n",
    "## A. vector sum\n",
    "\n",
    "<img src=\"images/P2-25.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fa=113.97649816516014 N and Fb=233.68645203778343 N\n"
     ]
    }
   ],
   "source": [
    "Q = 64*dtr\n",
    "R_mag = 260.  # N\n",
    "Fa = R_mag * cos(Q)\n",
    "Fb = R_mag * sin(Q)\n",
    "print ('Fa={} N and Fb={} N'.format(Fa,Fb))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"B\"></a>\n",
    "\n",
    "\n",
    "## B. find force vector\n",
    "\n",
    "<img src=\"images/P2-26.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "Q1 = 67*dtr\n",
    "Q2 = -47*dtr\n",
    "R_mag = 280.  # N"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$F_{net,x} = F_{a,x} = F_a \\cos \\theta_2$\n",
    "\n",
    "$F_{net,y} = F_{a,y} + F_b =  F_a \\sin \\theta_2 + F_b$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fa magnitude= 160.4178578478851 N\n",
      "Fa direction= -47.0 deg\n",
      "Fb magnitude= 375.063553109552 N\n",
      "Fb direction= 90.0 deg\n"
     ]
    }
   ],
   "source": [
    "Fnet_x = R_mag * cos(Q1)\n",
    "Fnet_y = R_mag * sin(Q1)\n",
    "Fa = Fnet_x / cos(Q2)\n",
    "Fb = Fnet_y - Fa*sin(Q2)\n",
    "print ('Fa magnitude=',Fa,'N')\n",
    "print ('Fa direction=',Q2/dtr,'deg')\n",
    "print ('Fb magnitude=',Fb,'N')\n",
    "print ('Fb direction=',90.,'deg')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, you could use the law of sines as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "angles are 22.999999999999993 42.99999999999999 114.0\n",
      "Fa magnitude= 160.41785784788507 N\n",
      "Fb magnitude= 375.06355310955195 N\n"
     ]
    }
   ],
   "source": [
    "phi1,phi2,phi3 = pi/2-abs(Q1), pi/2-abs(Q2), abs(Q1)+abs(Q2)\n",
    "Fa = R_mag*sin(phi1)/sin(phi2)\n",
    "Fb = R_mag*sin(phi3)/sin(phi2)\n",
    "print ('angles are',phi1/dtr,phi2/dtr,phi3/dtr)\n",
    "print ('Fa magnitude=',Fa,'N')\n",
    "print ('Fb magnitude=',Fb,'N')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"C\"></a>\n",
    "\n",
    "## C. find parallel and perpendicular components\n",
    "\n",
    "<img src=\"images/P2-27.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F_perp=21.791543987498244 lb and F_para=42.76831316104166 lb\n"
     ]
    }
   ],
   "source": [
    "F = 48.0   # lb\n",
    "Q = 27.*dtr\n",
    "F_perp = F*sin(Q)\n",
    "F_para = F*cos(Q)\n",
    "print ('F_perp={} lb and F_para={} lb'.format(F_perp,F_para))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"D\"></a>\n",
    "\n",
    "## D. find minimum force required\n",
    "\n",
    "<img src=\"images/P2-32.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "F1_mag, F2_mag = 3.7, 2.0  # kN\n",
    "Q1, Q2 = (180+60)*dtr, (180-30)*dtr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sum of $y$ forces equals zero. $F_{1y} +F_{2y} +F_{y} = 0$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fy= 2.2042939940024224 kN\n",
      "Fx must be zero for smallest F magnitude\n"
     ]
    }
   ],
   "source": [
    "F1_y = F1_mag*sin(Q1)\n",
    "F2_y = F2_mag*sin(Q2)\n",
    "print ('Fy=',-F1_y-F2_y,'kN')\n",
    "print ('Fx must be zero for smallest F magnitude')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"E\"></a>\n",
    "\n",
    "\n",
    "## E. find minimum force required\n",
    "\n",
    "\n",
    "<img src=\"images/P2-53.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\vec R = \\vec F_1 + \\vec F_2 + \\vec F$\n",
    "\n",
    "$R^2 = (F_{1x} + F \\cos \\alpha)^2 + (F_{2y} + F \\sin \\alpha)^2$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "alpha = 45*dtr\n",
    "F1x = -11.0  #kN\n",
    "F2y =  -8.0  #kN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x18b15f9b5c0>]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18b15ecf080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "F = arange(0.,20.,0.1)\n",
    "R2 = (F1x+F*cos(alpha))**2 + (F2y+F*sin(alpha))**2\n",
    "plot(F,R2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\frac{d}{dF}R^2 = 2(F_{1x} + F \\cos \\alpha)\\cos \\alpha + 2(F_{2y} + F \\sin \\alpha)\\sin \\alpha =0$\n",
    "\n",
    "$F_0 = - F_{1x} \\cos \\alpha - F_{2y} \\sin \\alpha$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "min F= 13.435028842544405 kN\n"
     ]
    }
   ],
   "source": [
    "F = -F1x*cos(alpha) - F2y*sin(alpha)\n",
    "print ('min F=',F,'kN')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"F\"></a>\n",
    "\n",
    "## F. find n-t force components\n",
    "\n",
    "<img src=\"images/P2-56.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "W = 219.  # N\n",
    "F = 82.   # N\n",
    "Q = 30*dtr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rx= 82.0\n",
      "Ry= -219.0\n",
      "Rt= -38.485916889676005\n",
      "Rn= -230.65956342879207\n"
     ]
    }
   ],
   "source": [
    "R = array((F,-W))\n",
    "t = array((cos(Q),sin(Q)))\n",
    "n = array((-sin(Q),cos(Q)))\n",
    "Rt = dot(R,t)\n",
    "Rn = dot(R,n)\n",
    "print ('Rx=',R[0])\n",
    "print ('Ry=',R[1])\n",
    "print ('Rt=',Rt)\n",
    "print ('Rn=',Rn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"G\"></a>\n",
    "\n",
    "## G. 3D vector sum\n",
    "\n",
    "\n",
    "<img src=\"images/P2-76.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "Qmag, Pmag, Fmag =  6., 5., 3.       # kN\n",
    "Q = Qmag* array((-2.,2.,1)) / sqrt(4+4+1)\n",
    "Pz = Pmag*cos(51*dtr)\n",
    "Pxy = sqrt( Pmag**2 - Pz**2 )        # component of P in the xy plane\n",
    "Px,Py = -Pxy*cos(30*dtr), Pxy*sin(30*dtr)\n",
    "P = array((Px,Py,Pz))\n",
    "F = Fmag* array(( cos(45*dtr), cos(60*dtr), cos(60*dtr) ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Q= [-4.  4.  2.] kN\n",
      "P= [-3.36514073  1.9428649   3.14660196] kN\n",
      "F= [2.12132034 1.5        1.5       ] kN\n",
      "R= [-5.24382038  7.4428649   6.64660196] kN\n"
     ]
    }
   ],
   "source": [
    "R = Q+P+F\n",
    "print ('Q=',Q,'kN')\n",
    "print ('P=',P,'kN')\n",
    "print ('F=',F,'kN')\n",
    "print ('R=',R,'kN')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"H\"></a>\n",
    "\n",
    "## H. vector from direction cosines\n",
    "\n",
    "<img src=\"images/P2-80.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "distance rAB= 5.102745241534208 km\n"
     ]
    }
   ],
   "source": [
    "rOA = 2.*array(( 0.768, -0.384,  0.514 ))   # km\n",
    "rOB = 5.*array(( 0.744,  0.559, -0.380 ))   # km\n",
    "rAB = rOB - rOA\n",
    "rAB_mag = sqrt(sum(rAB**2))\n",
    "\n",
    "print ('distance rAB=',rAB_mag,'km')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "<a name=\"I\"></a>\n",
    "\n",
    "## I. component of force along a line\n",
    "\n",
    "\n",
    "<img src=\"images/P2-112.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "radius = 155                 # mm\n",
    "b,h,d,z = 4, 3, 265, 245     # mm\n",
    "Cz = 350.                      # mm\n",
    "Fmag = 100.                    # N"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First find $\\vec{r}_{CD} = \\vec{r}_{OD} - \\vec{r}_{OC}$. Then convert this to a unit vector and find $\\vec{r}_{CE}= d \\; \\hat{u}_{CD}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "rOC = array((0.,0.,Cz))\n",
    "rOD = radius * array((b,h,0)) / sqrt(b**2+h**2)\n",
    "rCD = rOD - rOC\n",
    "uCD = rCD / sqrt(sum(rCD**2))\n",
    "rCE = d*uCD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next find unit vector $\\hat{u}_{GE}$, then $\\vec{F} = - F_{mag} \\hat{u}_{GE}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "rOG = array(( 0., radius, z ))\n",
    "rOE = rOC + rCE\n",
    "rGE = rOE - rOG\n",
    "uGE = rGE / sqrt(sum(rGE**2))\n",
    "F = -Fmag * uGE"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally dot products will give the desired solution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fpara in direction of uCD= -70.7776075797882 N\n",
      "   (negative implies bead slides toward C)\n",
      "magnitude of Fperp= 70.64368524703045 N\n",
      "Fpara= [-22.92776378 -17.19582284  64.71546229] N\n",
      "Fperp= [-23.33445887  66.02992849   9.27802986] N\n"
     ]
    }
   ],
   "source": [
    "Fpara_CD = dot(F,uCD)\n",
    "Fpara = Fpara_CD * uCD\n",
    "Fperp = F - Fpara  \n",
    "Fperp_mag = sqrt(sum(Fperp**2))\n",
    "print ('Fpara in direction of uCD=', Fpara_CD,  'N')\n",
    "print ('   (negative implies bead slides toward C)')\n",
    "print ('magnitude of Fperp=', Fperp_mag, 'N')\n",
    "print ('Fpara=', Fpara, 'N')\n",
    "print ('Fperp=', Fperp, 'N')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note $\\vec{F}_{\\parallel}$ is implicitly defined to be\n",
    "\n",
    "$$F_{\\parallel} = \\vec{F} \\cdot \\hat{u}_{CD}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"J\"></a>\n",
    "\n",
    "## J. component of force along a line, again\n",
    "\n",
    "<img src=\"images/P2-127.png\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "rOB = array(( -45.,  0.,  130 ))  # in\n",
    "rOC = array(( 120.,  95., 0.  ))  # in\n",
    "rOD = array((   0.,  95., 50. ))  # in\n",
    "f = 1./4       # fraction of the distance up the chute\n",
    "F_chute = 450.                    # lb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$F_{chute} = \\vec{F} \\cdot \\hat{u}_{CD} =  F \\hat{u}_{AB} \\cdot \\hat{u}_{CD}  $"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cable force= 536.9635344055264 lb\n"
     ]
    }
   ],
   "source": [
    "rCD = rOD - rOC\n",
    "uCD = rCD / sqrt(sum(rCD**2))\n",
    "rOA = rOC + f*rCD\n",
    "rAB = rOB - rOA\n",
    "uAB = rAB / sqrt(sum(rAB**2))\n",
    "F = F_chute / dot(uAB,uCD)\n",
    "print ('cable force=',F,'lb')"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "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
}
