{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.18 Programming for Geoscientists class test - example paper based on 2012 2.18 exam" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#Test instructions\n", "\n", "* This test contains **5** questions each of which should be answered.\n", "* Write your program in a Python cell just under each question.\n", "* You can write an explanation of your solution as comments in your code.\n", "* In each case your solution program must fulfil all of the instructions - please check the instructions carefully and double check that your program fulfils all of the given instructions.\n", "* Save your work regularly.\n", "* At the end of the test you should email your IPython notebook document (i.e. this document) to [Gerard J. Gorman](http://www.imperial.ac.uk/people/g.gorman) at g.gorman@imperial.ac.uk" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.** Ignore this question from 2012 as it deals with material we have not discussed this year." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.** Write a program, that creates a *list* $t$ with 6 values, 0.1, 0.2, ..., 0.6. Compute a corresponding *list* $y$ of $y(t)$ values using the formula:\n", "$$y(t) = v_0t − gt^2,$$\n", "where $v_0=6.0$ and $g=9.8$.\n", "\n", "* Store these two lists, t and y, in a new list t1.\n", "* Write out a table with a column of t and a column of y values by traversing the data in the nested t1 list.\n", "* You may use list or NumPy array for t and y.\n", "* Print out a table header with the column names ’t’ and ’y’.\n", "* For printing the table, iterate the nested list t1, do not access the previously computed t and y lists directly.\n", "* Print out the table t1 using format specifiers so that the columns are aligned." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " t y\n", " 0.1 0.502\n", " 0.2 0.808\n", " 0.3 0.918\n", " 0.4 0.832\n", " 0.5 0.55\n", " 0.6 0.072\n" ] } ], "source": [ "t = [0.1*i for i in range(1, 7)]\n", "v0 = 6.0\n", "g = 9.8\n", "y = [v0*ti-g*ti**2 for ti in t]\n", "t1 = []\n", "for ti, yi in zip(t, y):\n", " t1.append([ti, yi])\n", " \n", "print \"%8s%8s\"%(\"t\", \"y\")\n", "for pair in t1:\n", " print \"%8g%8g\"%(pair[0], pair[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.** The factorial of n, written as n!, is defined as:\n", "$$n! = n(n − 1)(n − 2)...2\\cdot1,$$\n", "with the special cases\n", "$$1! = 1, 0! = 1.$$\n", "For example, $4! = 4\\cdot3\\cdot2\\cdot1 = 24$, and $2! = 2\\cdot1 = 2$.\n", "\n", "* Write a function fact(n) that returns $n!$. You **must** not use the *fact* function from the math module.\n", "* Return 1 immediately if $x$ is 1 or 0, otherwise use a loop to compute $n!$.\n", "* The function must be called *fact* and take a single argument called n.\n", "* The software should check that the supplied value is a non-negative integer. If it is not, raise a ValueError exception." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0! = 1\n", "1! = 1\n", "2! = 2\n", "3! = 6\n", "4! = 24\n" ] } ], "source": [ "def fact(n):\n", " if type(n) != int:\n", " raise ValueError(\"value must be of type int\")\n", " if n < 0:\n", " raise ValueError(\"value must be positive\")\n", " if n<2:\n", " return 1\n", " product = 1\n", " for i in range(1, n+1):\n", " product *= i\n", " return product\n", "\n", "# Let's show that it works\n", "for i in range(5):\n", " print \"%d! = %d\"%(i, fact(i))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.** A table of temperatures and densities, in units of degrees ($C$) and $kg/m^3$, are given in the file *data/density\\_air.dat*\n", "Write a program that reads in the data from file into a list for temperature (first column) and density (second column) and plots the variation of density against temperature.\n", "\n", "* The input file contains blank lines and lines starting with a ’#’, which you must ignore when reading in the data.\n", "* You may use list or NumPy array for temperature and density.\n", "* Plot the variation of density against temperature.\n", "* Label the x axis \"Temperature (Celsius)\" and the y axis \"Density ($kg/m^3$)\".\n", "* Use the plot title \"Density of air at different temperatures, at 1 atm pressure\".\n", "* Display a legend with the label ’Air’." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEZCAYAAACw69OmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xtczvf/P/DHVbJSDjlUSOXcUYUklDKnsRDDMENOc5zz\n9jMmNnych9lmjGnZhjk19hE2lZyKUs2ZafNBlFOk6PD6/fGe97dyXalcXe+retxvt+vGdb2v6/1+\nvt/X1fW8XmeVEEKAiIjoNRkoHQAREZUPTChERKQVTChERKQVTChERKQVTChERKQVTChERKQVTCjF\ncPToUdjb2+vkWElJSejfvz/Mzc3x5ZdfFuu1uoxTk+HDh2Pu3Llq4yl4bjk5OZg4cSLq1auHgQMH\nKhUyEb2mMplQ7OzsUKVKFVSrVg22trbo1KkTfvnll1I/rre3Ny5evJgvjj/++KNUjhUSEoLq1avj\n3r17mDhxYrFeWzDO1xUUFIShQ4cW6zUqlQoqlUptPAXP7cSJE4iIiMCVK1ewbds2rcVdFOHh4WjQ\noEGhz8mbHMu6opyvPipK3EeOHIGfnx9q1KiBhg0bvtbxytN7rktlMqGoVCrs27cPaWlp2LlzJ9q2\nbYspU6ZgxowZOo+jtMaFRkVFwdPTEwYG2n2LsrOztbq/wmi6NgXPLSoqCi1atICpqWmxj6HL89F3\nQohS+zy+oM/X28zMDKNGjcKyZcuUDuW15ebmKnr8Er/Pogyys7MTv//+e77HNm7cKAwNDcXly5eF\nEEJkZWWJbdu2CT8/P+Hq6io2btwonj17JoQQ4siRI6J+/fpi/fr1omHDhqJdu3bit99+k/d19OhR\n0b17d2Fubi7q168vli9fLr/O2tpaCCHEe++9JwwMDISJiYkwMzMTS5cuFT179hRr167NF5eLi4vY\ns2eP2vM4c+aMGDZsmLC1tRVz5swRN2/eFEII4efnJwwNDYWxsbGoWrWquHLlykuv3bRpk3BwcBDV\nq1cXvXv3FqGhofK2vHEKIYStra1Yt26d8PLyEqampiInJ+el/U2ePFk0aNBAWFhYiDFjxoizZ88K\nIYT473//KypXriyMjIyEmZmZcHNzU3suSUlJYvTo0cLS0lKMGjVKvPfee2LOnDkvxZP33MzMzMSg\nQYPy7X/Tpk3yezB48GBhZ2cngoKCREpKinwslUoltmzZItzc3ETjxo2FEELEx8eLsWPHigYNGohp\n06aJv//+O9/5f/3116Jt27aiQYMGYt68eeL58+fiyZMnwtjYWBgYGAgzMzNRtWpVcfv27XzntX79\nemFkZCQqV64szMzMRK9evYQQQty/f1+sWrVKODo6iu7du4uwsDD5NfPmzRPvvvuuGDdunKhTp47w\n9vYWt27dEl9++aVo3Lix8PPzE6dOnZKf37FjR/H5558LPz8/Ub9+fbF48WLx5MkTefvVq1fFzJkz\nhY2NjRg1apQ4d+5cvtcuXLhQdOnSRVStWlVcvXpV42dD3fneunVLDBs2TH6vivr5KSymPXv2CF9f\nX1G9enXRsGFDsXXrVrWfmYKKE3fB9ymvQ4cOCTs7u1ce75133hFWVlbC2tpaTJ06VVy7dk0Iofk9\nt7W1FV999ZVo27atsLCwEDNnzhRPnjwR/fv3F1ZWVuLDDz8UaWlpao/14jtn7dq1wtbWVnTt2lWc\nPHlS3j5s2DAxZcoU0b9/f1GzZk3x+++/F/oZO3funAgICBB16tQRlpaWYtq0aUIIIXJzc8XUqVNF\n8+bNRY0aNYSHh4e4e/euHP/hw4flfcybN0+89957Qgghrl+/LlQqldi+fbtwcnISvr6+QojC/w7V\nKTcJJSUlRVSqVEn8/PPPQgghVq9eLTp16iT+/PNPcfXqVeHr6yu+/fZbIYT05hoZGYlx48aJu3fv\nig0bNuT7A2rdurXYvXu3yMnJEQ8fPhSxsbHy6/I+r2Ac27dvF56envL9s2fPilq1aomsrKyXziE9\nPV2YmZmJDRs2iLt374rJkyeLjh07ytt9fX3Fd999p/Ea7N+/X/z111/i+fPn4qeffhImJiYiPT1d\nY5yOjo4iMjJSZGZmqt1fSEiIuH//vnjw4IGYOXOmaN++vbwtKChIDB06VGMsQgjRqlUrMX36dJGS\nkiKWLVsmKleuLObOnas2noLnVnD/8fHxwtraWhw6dEjcv39fTJo0SQwePFjerlKphLe3tzh79qzI\nzMwUqampwtzcXOzZs0c8evRILFq0SLRr1y7f+bu6uoro6Ghx+fJlYWdnJ/9hhYeH54tNneHDh8vn\n8kJAQICYPHmySE5OFpGRkaJevXpy4p83b56oXLmy2Lx5s0hNTRW9evUSDg4OYsqUKSI1NVV89tln\nolOnTvK+OnbsKKysrERoaKi4evWqePPNN8XHH38shBAiOztbWFhYiM2bN4u0tDSxZcuWfPF27NhR\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "from pylab import *\n", "\n", "file = open(\"data/density_air.dat\")\n", "tlist = []\n", "dlist = []\n", "for line in file:\n", " words = line.split()\n", " if len(words) != 2:\n", " continue\n", " try:\n", " t = float(words[0])\n", " d = float(words[1])\n", " except:\n", " continue\n", " tlist.append(t)\n", " dlist.append(d)\n", "tarray = array(tlist)\n", "darray = array(dlist)\n", "\n", "plot(tarray, darray)\n", "xlabel(\"Temperature (Celsius)\")\n", "ylabel(\"Density ($kg/m^3$)\")\n", "title(\"Density of air at different temperatures, at 1 atm pressure\")\n", "legend((\"Air\", ))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**5.** Based on the data in the file *data/constants.txt*, make a dictionary where the keys are the names of the physical constant and the values are a tuple containing the numerical value and the units.\n", "\n", "* Use a Python dictionary to store the data.\n", "* All numerical values should be of type float.\n", "* Print out the dictionary without any formatting." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Planck constant': (6.6260755e-34, 'J*s'), 'elementary charge': (1.60217733e-19, 'C'), 'speed of light': (299792458.0, 'm/s'), 'electron mass': (9.1093897e-31, 'kg'), 'Avogadro number': (6.0221367e+23, '1/mol'), 'proton mass': (1.6726231e-27, 'kg'), 'gravitational constant': (6.67259e-11, 'm**3/kg/s**2'), 'Boltzmann constant': (1.380658e-23, 'J/K')}\n" ] } ], "source": [ "file = open(\"data/constants.txt\", \"r\")\n", "constants = {}\n", "for line in file:\n", " try:\n", " name = line[0:27].strip()\n", " \n", " words = line[27:].split()\n", " value = float(words[0])\n", " units = words[1]\n", " except:\n", " continue\n", " \n", " constants[name] = (value, units)\n", "\n", "print constants" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }