diff --git a/HW2/README.md b/HW2/README.md new file mode 100644 index 0000000..f74173b --- /dev/null +++ b/HW2/README.md @@ -0,0 +1,36 @@ +# Homework #2 +## due 2/3/17 + +1. Now that you have created your own repository, 'homework_1', that has a README.md file. +Create a new file in this repository called `setdefaults.m`. This file is a matlab/octave +script that will set default plotting parameters. In this file, add the following lines: + + ```matlab + set(0, 'defaultAxesFontSize', 16) + set(0,'defaultTextFontSize',14) + set(0,'defaultLineLineWidth',3) + ``` + + Commit the changes to your repository. + + ![projectile(v_mag,theta) predicts the height of the projectile based upon initial +velocity and position, as see in the Figure](projectile.png) + +2. Clone your 'homework_1' repository to your own computer. Now, we want to create a +function that uses kinematic formulas to predict the path of a projectile. The dimensions +are taken from official dart board dimensions +[darts](http://dartbrokers.com/dartboard-height.html). Create a function, +`projectile.m` that will calculate the location of an object with an initial velocity. The +function inputs are v_mag (initial speed), theta (initial angle). The output is the height +of the object 2.37 m from its starting position. Assume g=9.81 m/s^2 and its initial +height is 1.72 m. + + ```matlab + >> h=projectile(v_mag,theta) + + h= 1 + ``` + + In addition to the output of `h`-height at 2.37 m-plot the path of the object from its + initial position to its position at 2.37 m away from the start. *Note: use your + `setdefaults.m` to set the plot defaults before outputting the result.* diff --git a/HW2/projectile.png b/HW2/projectile.png new file mode 100644 index 0000000..f544224 Binary files /dev/null and b/HW2/projectile.png differ diff --git a/HW2/projectile.svg b/HW2/projectile.svg new file mode 100644 index 0000000..dc73374 --- /dev/null +++ b/HW2/projectile.svg @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 2.37 m + + + + v_mag + theta + + h + + 1.72 m + + diff --git a/README.md b/README.md index eebd665..8059993 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,20 @@ matlab/octave functions and programming best practices. ## Teaching Assistants: - Graduate: Peiyu Zhang -- Office hours: 2 hours / week +- Office hours: Friday 9:00-11:00am in Engineering II room 315 +## Course Information **Prerequisite:** CE 3110, MATH 2410Q **Textbook:** Chapra, Steven, *Applied Numerical Methods with MATLAB for Engineers and Scientists* 3rd edition. +**Tools used:** [Matlab](https://www.mathworks.com/products/matlab.html), +[Octave](https://www.gnu.org/software/octave/) , [Github](https://github.com). + +**Recommended tools:** Github Desktop, git, Atom (text editor), Vim (text editor), +Jupiter notebook (with matlab or octave kernel) + ## Grading | Item | Percent | Requirement | diff --git a/lecture_05/.ipynb_checkpoints/lecture_05-checkpoint.ipynb b/lecture_05/.ipynb_checkpoints/lecture_05-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/lecture_05/.ipynb_checkpoints/lecture_05-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_05/gp_image_01.png b/lecture_05/gp_image_01.png new file mode 100644 index 0000000..ef291b5 Binary files /dev/null and b/lecture_05/gp_image_01.png differ diff --git a/lecture_05/lecture_05.ipynb b/lecture_05/lecture_05.ipynb new file mode 100644 index 0000000..66fcbe9 --- /dev/null +++ b/lecture_05/lecture_05.ipynb @@ -0,0 +1,559 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questions from last class" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you execute the given function \n", + "\n", + "my_function.m:\n", + "\n", + "```matlab\n", + "function [x,y] = my_function(max_time)\n", + " N=100;\n", + " t=linspace(0,max_time,N);\n", + " x=t.^2;\n", + " y=2*t;\n", + "end\n", + "```\n", + "\n", + "as \n", + "\n", + "```>> [x,y] = my_function(20);```\n", + "\n", + "What variables are saved to your workspace?\n", + "\n", + "![responses](q1.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How do you write a help description for a function?\n", + "\n", + "![responses to question 2](q2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " \n", + "How to keep our forked ME3255S page up to date with the original\n", + "pretty tired this morning\n", + "\n", + "How do I use the Github Desktop?\n", + "\n", + "whats your favorite football team?\n", + "\n", + "Will UConn's github get updated to the newest version of github?\n", + "As u said in class trail and error is the best way of learning.\n", + "\n", + "I believe the % is the same as matlab where it de-links your code into text\n", + "\n", + "Does the @ symbol designate a pointer? \n", + "\n", + "Given the change of air pressure as altitude increases, how fast would a frisbee have to travel (and spin) to hit an airplane?\n", + "\n", + "What is a gui?\n", + "\n", + "\n", + "could you go over a nested for loop example\n", + "\n", + "Can't seem to get this function to produce any graph and am not sure why\n", + "\n", + "When are these google forms due?\n", + "\n", + "how do I create a new function using Github on my desktop?\n", + "\n", + "Can you explain the first question more in class?\n", + "\n", + "What is the meaning of life?\n", + "\n", + "Should I just know how or what these topics are or will we learn them in the future?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = \n", + "\n", + " @(x)x.^2\n" + ] + } + ], + "source": [ + "f =@(x) x.^2\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 9 25 49 81\n", + "\n", + "\n", + "ans =\n", + "\n", + " 16\n" + ] + } + ], + "source": [ + "f([1:2:10])\n", + "f(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i=1 and j=1\n", + "i=1 and j=2\n", + "i=1 and j=3\n", + "i=2 and j=1\n", + "i=2 and j=2\n", + "i=2 and j=3\n", + "i=3 and j=1\n", + "i=3 and j=2\n", + "i=3 and j=3\n", + "i=4 and j=1\n", + "i=4 and j=2\n", + "i=4 and j=3\n", + "i=5 and j=1\n", + "i=5 and j=2\n", + "i=5 and j=3\n", + "i=6 and j=1\n", + "i=6 and j=2\n", + "i=6 and j=3\n" + ] + } + ], + "source": [ + "% nested for loop example\n", + "for i = [1:6]\n", + " for j = [1:3]\n", + " fprintf('i=%i and j=%i\\n',i,j)\n", + " end\n", + "end\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From last class " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help documentation of \"my_function\"\n", + " This function computes the velocity in the x- and y-directions given\n", + " three vectors of position in x- and y-directions as a function of time\n", + " x = x-position\n", + " y = y-position\n", + " t = time\n", + " output\n", + " vx = velocity in x-direction\n", + " vy = velocity in y-direction\n" + ] + } + ], + "source": [ + "help my_function" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help documentation of \"my_caller\"\n", + " This function computes the acceleration in the x- and y-directions given\n", + " three vectors of position in x- and y-directions as a function of time\n", + " x = x-position\n", + " y = y-position\n", + " t = time\n", + " output\n", + " ax = acceleration in x-direction\n", + " ay = acceleration in y-direction\n" + ] + } + ], + "source": [ + "help my_caller" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nePDg2rVr2Q7NyS5dunTlypUHH3xw8+bNX3/99ddff/3iiy+KxeLc3Nz33nuP7ehc66WXXpJK7beK\n8SbPPPPMrl27Ro0atWnTpm+++earr756++2377nnHrbjcr7Vq1efOHFi4sSJO3fuPH369OHDh596\n6im9Xv/MM890/ceWZykuLj516lRUVNTcuXMdnOY7P1ndsHi7RYsWJSSGCTwSAAAKrklEQVQkfPPN\nN9aWpqamO++8MyEhQaVSsReX8126dKm+vt6u8fDhwwkJCbfffrvJZGIlKjfIzc1NSEg4ePBgQkJC\nQkIC2+E43+eff56QkPDwww+3t7ezHYtrXb16NSEhYfTo0Tqdzrb9iSeeSEhIyM3NZSswpzh79qz1\nT9DB/1d95yerKy9/Qqqurj516pREIpk3b561MTg4eP78+UT07bffshea88XExERERNg1Tps2TSgU\nGgwGps/a+1y4cOHtt99esGDB3XffzXYsrrJt2zYieuWVVwQC+42SvczZs2eJKCwsLCzshn2cmREU\nlUrFTlhOMnLkyF7/BH3qJ6srL09IZWVlRDR58mS79uTkZCI6c+YMCzG5l9lsNpvNRGT3N9xrvPrq\nq0FBQWvWeO2mVuXl5bW1tcOHD09MTCSijo4Og8HAdlCukpyc7O/v39zc3NHRYdteWVlJv6Ql7+bj\nP1lenpDOnTtHRBKJ/Qrf0dHRRFRSUsJCTO518ODB9vb2hIQErxwO3bFjR2Fh4UsvveSt6ZaIqqqq\niGjs2LGFhYXz588fO3bs+PHjk5KS3njjjebmZrajczKBQPD0008bjcYXXnihsbGRiMxm865du77+\n+uvRo0fPmTOH7QBdzsd/sry87Pvy5ctENHz4cLv22NhYIvK+v892tFptZmYmET3//PNsx+J89fX1\nGzZsmD59OtOb4a2qq6uJqLKyMj09PT4+fvHixWaz+T//+c+nn356/PjxvLw8L/unRkZGRnR09Mcf\nfzx16lShUNjR0REYGLhixYqVK1d6fY8l+fxPlpcnJJPJREQhId0vhcv0ZXmr1tbWjIyMhoaGFStW\nzJgxg+1wnO8vf/mL2Wx+44032A7EtbRaLRGdO3du5syZW7ZsYRpbW1sfeeSRM2fObN269dlnn2U1\nQCe7fPny119/fe7cuZiYmISEhMbGxhMnTnz77bd33HFHamoq29G5nC//ZJHXd9kx/6TqWi3K/Lny\n+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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t=linspace(0,10,100)'; \n", + "x=t.^3; % vx = 3*t^2\n", + "y=t.^2/2; % vy = t\n", + "[vx,vy]=my_function(x,y,t);\n", + "[ax,ay]=my_caller(x,y,t);\n", + "yyaxis left\n", + "plot(t(1:10:end),ax(1:10:end),'o',t,6*t)\n", + "ylabel('a_{x}')\n", + "yyaxis right\n", + "plot(t(1:10:end),ay(1:10:end),'s',t, 1*t./t)\n", + "ylabel('a_{y}')\n", + "xlabel('time')\n", + "axis([0,10,0,3])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[0;31mUndefined function 'diff_match_dims' for input arguments of type 'double'.\n", + "\u001b[0m" + ] + } + ], + "source": [ + "diff_match_dims(x,t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good coding habits\n", + "## naming folders and files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Stanford file naming best practices](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming)\n", + "\n", + "1. Include information to distinguish file name e.g. project name, objective of function, name/initials, type of data, conditions, version of file, \n", + "2. if using dates, use YYYYMMDD, so the computer organizes by year, then month, then day\n", + "3. avoid special characters e.g. !, #, \\$, ...\n", + "4. avoid using spaces if not necessary, some programs consider a space as a break in code use dashes `-` or underscores `_` or CamelCase" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Commenting your code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Its important to comment your code to mention what a variable's units are, what the function is supposed to do, etc. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[0;31mError: Function definitions are not permitted in this context.\n", + "\u001b[0m" + ] + } + ], + "source": [ + "function i=code(j)\n", + " % Example of bad variable names and bad function name\n", + " for w=1:j\n", + " i(w)=w;\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "code not found.\n", + "\n", + "Use the Help browser search field to search the documentation, or\n", + "type \"help help\" for help command options, such as help for methods.\n" + ] + } + ], + "source": [ + "help code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Choose variable names that describe the variable" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function count_vector=counting_function(max_value)\n", + " % Good variable names and better help documentation\n", + " % \n", + " % counting function creates a vector from 1 to max_value where each index, i, is \n", + " % stored in each vector spot\n", + " for i=1:max_value\n", + " count_vector(i)=i; % set each element in count_vector to i\n", + " end\n", + "end " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'counting_function' is a command-line function\n", + "\n", + " Good variable names and better help documentation\n", + " \n", + " counting function creates a vector from 1 to max_value where each index, i, is \n", + " stored in each vector spot\n", + "\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help counting_function" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Putting it all together" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Clone your homework_1 to your computer\n", + "2. open Matlab (cli, jupyter or gui)\n", + "3. Change working directory to homework_1 *e.g.* Windows:`cd('C:\\Users\\rcc02007\\Documents\\Github\\homework_1')`, Mac: `cd('/Users/rcc02007/Documents/Github/homework_1')`\n", + "4. You have already created your first script `setdefaults.m` (if not see lecture_4)\n", + "5. Run `>> setdefaults.m`\n", + "6. Create a new m-file called nitrogen_pressure.m\n", + "7. Create a function based upon the ideal gas law for nitrogen, Pv=RT\n", + " 1. R=0.2968 kJ/(kg-K)\n", + " 2. inputs to function are v (specific volume m^3/kg), and T, temperature (K)\n", + " 3. output is P, pressure (kPa)\n", + "8. Once the function works, commit the change to the repository (add a message, like 'added file nitrogen_pressure.m'\n", + "9. After file is 'committed', 'push' the changes to your github account\n", + "\n", + "for the command-line git user, this is steps 8 and 9:\n", + "1. `$ git add *`\n", + "2. `$ git commit -m 'added file nitrogen_pressure.m'`\n", + "3. `$ git push -u origin master\n", + " Username for 'https://github.uconn.edu':rcc02007 \n", + " Password for 'https://rcc02007@github.uconn.edu': `\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Now, use this function to plot the range of pressures that a pressure vessel would experience if it is 1000 gallons (3.79 m^3) with 10-20 kg of Nitrogen and temperatures range from -10 to 35 degrees C. \n", + "\n", + "```matlab\n", + "v=0.379/linspace(50,20,10);\n", + "T=273.15+linspace(-10,35,10);\n", + "[v_grid,T_grid]=meshgrid(v,T);\n", + "P = nitrogen_pressure(v,T);\n", + "pcolor(v_grid,T_grid,P)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAABcSAAAXEgFnn9JSAAAA\nB3RJTUUH4QEfDxsqXQdJjwAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJ\nbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAzMS1KYW4tMjAxNyAxMDoyNzo0MkGstPEAACAA\nSURBVHic7N15XFNX2jjwYxKWCMQNRGF4QQYFRAoiLoOoiPuOoIMVN1S0KJYRHa1KHewoFuu840Kh\niqUKVGwRQaFqVaxMlbEKBlxQFCuUnwISsA0EAskNvz9O3zuZbOTeJCSQ5/vxj0PuPQu0Hx7uPec8\np09nZycCAAAA9I2h7wEAAAAACEFAAgAAYCAgIAEAADAIEJAAAAAYBAhIAAAADAIEJAAAAAYBAhIA\nAACDAAEJAACAQYCABAAAwCBAQAIAAGAQICABAAAwCBCQAAAAGAQISAAAAAwCBCQAAAAGAQISAAAA\ngwABCQAAgEGAgAQAAMAgQEACAABgECAgAQAAMAgQkAAAABgECEgAAAAMAkuTyiKRqLm5WSQSEQRh\nYmJiYmLC4XAYDAhyAAAAKKMckGpqao4dO1ZSUtLY2CgUCuVvsLCwGDx48Jw5c5YtW2Zra6uNQQIA\nAOj9+nR2dqpz35s3b3bs2PHgwQOCINRvnc1mz507NyYmxtramu4IAQAAGIWuA9KNGzf27t3b2Nio\nSTf29vanTp1ydnbWpBEAAAC9mKqAdOPGjY8++qi5uVnmcw6HY2Nj4+vru3TpUgsLCyaTyWAwCIIQ\ni8XNzc2JiYnV1dU8Hq+trU2mop2dXVpamoODg/a/DwAAAD2c4oBUX1+/ZMmSt2/fkp8wmUxnZ+d/\n/vOf9vb2ffv2Vafppqam0tLS+Pj4mpoa6c/9/f2/+OILExMTDYcOAACgN1EQkNrb29977z3yS3t7\n+3/+859eXl60+xCJRPn5+Z999hn53m/AgAF3796l3SAAAIDeR9USbT8/vzt37ty8eVOTaIQQMjEx\nWbx4cVFR0ZUrV+zt7TVpCgAAQG+lOCB5e3v/9NNPX331lXZXxzk7O9+8eTM/Px8W3QEAAJCh7rJv\nAAAAQKc0ytQAVAjwtSwsEeh7FAAYIzab3draqkkLrq6u2hoMPRUVFfodgF5AQNKVwhKBqMSTUpXm\n1oEDJxVWfx9MozvHWRcuFGykUZFUj9iR04785WacJo2QjgTGeV5J10pT0n4TWfyyMNj0m0Kttyyj\nI3SK5fEyXfcir08rs3nnqP4fPe/+rpX59dMR/cJe6nsU1Pz29R81b+TRkzrNG6HH02OIvrrWL8g7\nBwAAwCBAQAIAAGAQVL2ya21tnTFjBi7PmDEjLi5O/XYPHz6ck5ODy99//72lpSXdEQIAgB4QQti8\n391UPSGtWLGCx+PxeLyOjg5K0QghtH37djabjauHh4drNEYAAABGQGlA4vF4T548weXLly/TaPrC\nhQu48PDhw/r6ehotAAAAMB5KA9KePXtwISAgwMbGhkbTHA5n3rx5uLx3714aLQAAADAeSgPS/fv3\nceGTTz6h3XpsbCwuQOY6AAAAqile1MDn8wUCAULIwsJCk1NfBw4cOGDAgHfv3gmFwqampoEDB9Ju\nCgAAulMnLGrodoqfkHg8Hi4MHjxYww7I130aHvEHAACgd1MckMhD+fr166dhB2QL8gf9AQAAACTF\nAYkgCFzQ/Bi90NBQXDh9+rSGTQEAAOjFFM8hMZlMXBCJRBp2kJ+fjwtLly7VsCkAAOg+7TCH1N0U\nPyGZm5vjgubv2RoaGnChf//+GjYFAACgF1MckKysrHDh7du3GnZQV1cn0yYAAAAgT3FAIpd6Nzc3\nk484NLS0tJCL64YOHUq7HQAAAL2e4oDEZDLt7e1xWZMkC/v27cOFwYMHm5mZ0W4HAABAr6c0U0NM\nTAwu3Lx588cff6TRdHFx8aVLl3B506ZNNFoAAAC96WDp7Z+xUvqdz58/PzY2tq2tDSG0fv369PT0\ncePGqd/uo0ePwsLCfu+DxXr//fc1HGiXJBLJkydP6uvrf/vtNz6fb2Vl1bdvXwcHB09PCse2SiSS\nu3fv1tfX19XV2dnZ2djYTJgwgcGAU6MAAEDnVIXiEydOrFq1CpdXrlwZGhr6t7/9jVwRroxEIklI\nSJDedZSQkKDxOFU5e/Zsfn5+WVmZWCyWvzpo0KDly5dHRER0+c4wIyMjKSlJJqOEtbX15s2bly9f\nrs0RAwAAkKPqb//x48evWbOG/PKbb74ZOXLkokWLKioqmpqaJBIJeUkikfz6668vXrxYunSpu7u7\ndDQKDQ2dP3++9gcupbCwsKSkRGE0Qgg1NjYeP3580aJFqo/AiI6O/vvf/y6f34jH4+3bt2/79u1a\n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\ntrY2nGthYZGQkEA/LXTjxg1cXo0IQw0NDeHh4Q8fPkQIOTk5HThwwNHRUbJAQUFBXFxcbW2t1Ikz\nZsz4/PPPLSwsaDoMxtzc3N/f/8KFCxRFnT17FtYkSWFiJrvVq1fv2rWLxpWzubmZ3rts1apVP/zw\ng5Q2Qgg9efLkww8/3L17t6IThULhokWLvvrqK9mXAkKIoqijR4ZSi8cAABK+SURBVI8GBwc3NDQo\nquHZs2eLFi2Kj49X5KItEokyMjKUztlqHa0LRj4ITp06RX/WzZs3sTZiMpmzZ8+Wyi0tLQ0MDPzl\nl1/kVlJbWxsTE/Pll1+qKJXu2LRp065duyRfzZgHDx4sWrQIv78uXrwYFhYm+WrGiESinTt3/vDD\nD4oq17zj0dPe3k42dPDz81PxLB3d8pIlS/DYqLu7WygUPn36FGsXJpMZEhKSlZVFrzIRQvjbCylT\nrrJUVlaGhIRgbTRu3LiffvpJShtlZWWFh4fLaiN80ffee6+5uVmVC02cOBEnsOcFIIkpjZB+/vnn\nvLw8nA4JCXnnnXe8vb3ZbDaOdnXnzp3CwkK8hZcikpOTy8vLLSwsli5dGhQU9Nprr3V2dp4/fz45\nORk/Nnv27OHxeLIf3WKxeNWqVeS5nTdv3ltvvTVhwgRzc/O6urq8vLzvv/9eKBTW19cvXrz49OnT\nsiP9np6e5cuXYyM4QsjT03PRokUeHh5DhgwRi8UVFRUVFRXnzp0rLS1V5adwc3P7/vvvEULV1dU7\nd+5ECDGZzMTERMkyVlZWqlSlXcEwAQEBHA5HKBS2tbWdPXuWZtyZkZFBThkwYIBkVkNDw4oVK/DH\nB4vFioiIePvtt0eOHNnW1nbx4sV9+/b99ttvCKH9+/cPGjRo5cqVqounXdLS0oqKijgczuLFi319\nfV1cXB48eHDp0qXk5GSKooRC4SeffLJly5Z169aJRKKZM2cGBQWNGTMGIVRQUJCUlIRfcAkJCbNm\nzZJ6AyJtdDylXL16Fet7BwcHFa1/urvltWvXrl27tqen58aNG62trWKxmMViDR482NXVVcXROX5F\nMJnMXm3id+XKlTVr1nR0dCCEpk+fnpCQIPVLVlRUbNq0Caft7Oyio6Nnzpw5aNCgZ8+e5eXlJSUl\n1dXVxcbGqnItMny8cuUKNoyrLufLzwvTYdGiRTwej8fj7d27V1EZiqJ+++03qYNLlizh/YWHh8et\nW7ekCnR2di5cuBAX8PPza29vlyrw7bff4lxPT8/i4mLZ6z569GjSpEm4zK5du2QLbN++nciQlpam\nSP7y8nKRSCR5JCoqCp+VmZkpW/7GjRs4d/To0YrqpK9BbcHo+eKLL3CdERERisp0d3e//vrruNiV\nK1ekcletWkWarKSkRCq3s7MzIiICF3B1dX348KFUAfq7Jrfc1tamSLy2tjZSTDZXslP5+/vX19dL\nFcjMzCQFZs2axePx0tPTpco0NzdPnDgRl9mxY4fsVTTveErZsWMHPj0qKoq+pH5uWRNu376Na167\ndi2N/OfPn5c8np6eTsT+z3/+I7fmoKAgXGDmzJnNzc1Suc+fPw8ODuZJQCNkd3c3KVZVVdW7O3zZ\nMSXlTL7iaQyveMabppKYmBjZZRZsNjshIQGvcnjy5An2OCIIBAI8oYoQ+uqrr+R6UTs6On799dc4\nnZaWJmViampqSk1Nxenly5f/61//UiTemDFj9OkvpzvB5s2bhxP//e9/nzx5IrdMdnY2tvk4ODhI\nLcu4d+8enoVCCG3cuFF2dprNZn/99devvPIKQoiiqJSUFNVl0zq7d+8eOnSo1ME5c+aQPeV+++23\n+fPnv/vuu1JlBg0atHjxYpwm68kImnc8VaipqcGJXs1C6eiWNeTixYs4obq9LiEhYfPmzTgdGxsr\nd8qzqKiIuLMmJCTIjiM5HA6fz1fxATE3NyfWC2whBAimpJAIT58+Ve9Ea2vrRYsWyc2yt7efP38+\nTv/666+SWdnZ2XgFu5ub21tvvaWoch8fHxcXF4RQW1ub1Ers7Oxs/KbgcDhRUVHqCa8LdCeYq6sr\nj8dDCFEUdfr0abllSDhnWVcLcsqQIUMURfm0sbEhGvTUqVNisVhzsdXA29tb0UpSST2qyKjo4+OD\nE7JzLZp3PFUgkyLYqqYKurtlDcH2OgaDMWXKFKWFKYrasGEDDkTEZDITEhKIppQiOzsbJ/z8/BQF\nwXNyclJdC5KfmnwNABhTUkikK8TFxT179kyNGvz9/Wm8WidPnowTJSUlkm+3oqIinFC6zo70s8rK\nSsnjpIY333zT0tKyl1LrEJ0KRgZJZKJIkoaGBhzOWbIkoaysDCfo3yxktq+jo+PWrVuaSKs2b7zx\nhqIsd3d3nHBwcHBycpJbxs3NDSckHY4xmnc8VcBOJQgha2trFU/R3S1rQlNTE47v7uXlpXS019ra\nGhERgb97OBxOamoqjmYil9u3b+MEfUOo7vBJRkj19fUqntJHMCWnhuDgYDy1XlBQ8MYbb8ycOfPN\nN98cN26crOlAEfTfgGRrZIqiHjx4QFZCkPdmV1cXvZHBwsICJ8hDjiG7LxtbvBCdCjZnzpwdO3ZQ\nFFVdXX3nzh2pT8uTJ0/ixOuvvy7ryEvMs76+vjSXcHZ2ZrFYeBhhqPCyxEglC3nFjx49WlEZHDAU\nI2Vw07zjqQK5KDZZq4LublkTiMeTUneGP//8c8GCBdXV1QihIUOG7Nu3j97Oj91nEEKvvvoqTTEH\nBwcVRSW/QE9Pj4qn9BFMSSGFhoZev349JycHISQSiXJycnDa1tbW19c3ICBg5syZ9GbcwYMH0+T2\n79+fwWDgJ6SxsZEoJLLYTZUwwxip7z6ykELKkczg6FSwQYMGTZkyBU8FnThx4pNPPpHMJfY62eER\nkljwq3TcZm1tjd1tsYuU/qF5jxMHKppuSZOlecfrFarbPHV3y5pAPGyVBmgg8baHDx9+8OBBe3t7\n+vL4iwcp641k5AeojSmZ7BBC33zzzddff40nJwjNzc05OTnr16/39/c/ceIEzelKvwHJo0IeToqi\nNPyIk3zOjcrFUw+CkQVJWVlZkpcrKSnBUxdylx9J/uBKBbO1tcWJ1tZWzQU2HjTveCpC+jx57Zoi\n7e3teLjP4/FoBnAY0mfq6uqUBsVXvTeq/hCRdZA0Mwh9E1MaIWHwzl01NTXFxcWFhYVlZWVkVvbJ\nkyexsbFPnjxRNJsqu45PCtL5SN/q168fyd2wYYOKwUgk/XAku6mhJt7logfBAgICXnnlladPnwqF\nwtzcXDIzT7P8CP3vF7RSwYilTuuDPMM2luYdT0X+9re/YZOU0qfDmMGxD5Bq8etiY2OzsrIuX74s\nEokiIyO//fZbGp8RBoNBDCf0P5HqE0JkND9kyBAVT+kjmJ5CwgwbNmzYsGEhISEIobq6uuzs7LS0\nNOx9x+fzg4KC5E4s0a9mFwqFRCERY7GZmZmVlRU2bQ0dOlS9AL3W1tYtLS0IIYFAoMbpukPXgpmZ\nmc2ePfvAgQMIoZMnT+LHnqIo4rZEPBulIL+50g3WVDfu9Ra1Yx9oBa10PFUYNmwYVki3bt2S9dI2\nFcgiAVUiBllYWOzdu3fNmjV42mnNmjU7d+6UHakT7O3t8XcPfW/8448/VJSW+OwY1e4YxoARWZDU\nxsnJKTIyMiMjA08VUhR18+ZNuSWJt4xciFMTk8kk0RIRQt7e3jhx7do19SQkM/Nq16Aj9CAYmSLK\nz8/Hai87Oxt/IdrZ2SmKVUMGBPS7sd27d48YmhT5dMmFDMLkRoLBGHyNiOYdTxWIgUs9z1VjQCwW\nY4VkZ2en4mZODAYjMTGR+MVt2LCBZtd2Uid9bywpKVHl0j09PWTutledti/wMigkjKOjo7+/P06T\nDxApLly4IBUSWxKyy6Svr6+kOYu8NM+ePaveRAVZeIFD/KpRg47Qg2CyC5KIO8PcuXMVmd2JQsrP\nz6fxRDpz5gxOcDgc1ZfRIITIPDaNW5rBt/XUvOOpAnnbKnpqjJ8rV67gT5xehQtCf1lTcDouLi4t\nLU1uMeLmfu7cOUUvEJr1dlKQ35nFYhEveQDz8igkJDGtrcgRvLu7W9GS/traWjKxIWVQDg4Oxuag\njo6O+Ph4NQQLCgrCNXR3d2/btk2NGnSEfgSTXJDU1NREPjPJ3jCyEPvJ06dPFTXZ48ePyaYycl31\naCBvYWI8lKK2tpbeQUYPaN7xVMHPzw+PF//8809jMymrCHH4VmNHvh07dpDIL1u3bk1KSpItM3v2\nbNwQQqFw+/btcutJSEhQceEBCfrg5+dnVF5OxoDJ/Bzt7e0fffQRzbq/kpISYnOjmQFOTEyUG6Ml\nKioKTyC9+uqrUhMbHA4nJiYGpzMyMj7//HOab/aioqLo6GipgzY2NsTPIiMjIz4+XtGEuaLI1jpC\nP4LNmTMHv/Lu3r27Y8cOfNDd3V3RFrcIIS6XS9QVn8+XbbJnz56tXLkSmz4sLS0jIiJ6JRIZTJ87\nd07WDlNfX79y5UrZkPB6RvOOpwoDBgwgQYnIyifTAiskCwsLsra9V8TFxZH+s2vXLtmQ//3791+z\nZg1OHz169PPPP5ccJ/X09CQkJPzwww84kJVSyI+sxgYZLz2m5NRw6tSpU6dO8Xi8SZMmjRs3jsPh\nuLm5NTY21tXVXbt2jZiAfXx8FG3a7e/vf/ny5RUrVsyfP3/69OkeHh41NTVlZWU//vgjibf2xRdf\nyH62hIeHFxcX48j2hw8fvnjxYnBw8OjRowcMGGBmZtbR0fH8+fPCwsJr167V19fLDbMdGRl58+ZN\nbAU6cOBAfn5+aGjoyJEjraysKIpqaWm5fv36r7/+2tjYePv2bX2Gs9ODYJILkohZQ+mYZtOmTYWF\nhY2NjRRFrVixIigo6J133rG2tu7u7q6srNy/fz9psk8//ZR+hZksc+bM4fP5eEOHZcuWLVy4cOLE\niSwWq7Ozs7CwMD09vbOz8/333zf4tp6adzxVeOutt7DPdG5uLk3AAuOkoqIC94Tp06erPeD4+OOP\nLS0t9+zZgxDas2dPR0fHxx9/LFlg6dKlBQUF+DE5fPhwenr6lClTsNfJ1atXscHws88+W79+Pf2F\nKIrCAfcYDIax7bBuDJiSQsJUV1dXV1crMuO4uLjw+XxF54aGhtrb2584cSI9PV0qgiomPj5e0TT7\nd999Fx8fjx3G6uvrcd/tFYmJiR999BFevldbW6to7K9/9CBYcHAw8YNCf+34R3+KjY1NWlpaeHg4\n9qbFnyOyxWJjY7GzZa8wNzffuXNnRESESCSiKOrAgQO4ZQmzZs364IMPDK6QkDY6nlKCgoK2bduG\ntzGlKEqf30OaQwKq9nYCSYq1a9ey2exvvvkGIZSSktLR0SEVaDUxMXHz5s34i6q7u5tsvIQQsrCw\niI+PV2XEk5eXh0fekydPVnGn4D6FyZjs2Gz2xo0bfX19JeOOSDJkyJB169b9/PPP9Esxtm7dunnz\nZtnB9YgRIw4ePEjv9rp58+Zjx475+/sremK5XO6SJUsUueuw2ezdu3fz+XxFK7q5XG5MTIz+Xwd6\nEAwvSCL/Tps2jcPhKD1r2LBhOTk5y5cvJ6FxJMG7qCkKiKmUCRMmHDlyRGqRNULolVdeiY2NxS8m\nI0HDjqcUGxsbvIS5u7tb0aSa0YJDITMYDA0VEkJo5cqVJPL30aNHyQZIGDabvXPnzsOHD8+aNcvW\n1pbBYLBYLB6Pt2zZsl9++SUwMJB4bNKsQCARs5YuXaqhtC8l/V68eGFoGXqHWCyurKxsampqaWmh\nKKpfv36WlpZcLpfGXyU8PFxy62VcSUFBQXNzc09Pj7m5ubOzc698tLq6ugoLC589e4Zt+mw2m8Ph\neHh4qB7Av6GhobKy8vnz5y9evGAwGNbW1u7u7qoH5dMdximYZHv169dv4MCBY8aM6a2ZThGVlZX3\n79/HNdvZ2U2ePNlop5o173iK+P333//xj38ghMaNG3fkyBEtyKoX6urq8BPt4+Nj8OHsmTNnsMnO\n09Pz2LFjsgXq6+sDAgIoinJxccnKytK7gCaA6ZnszMzMxowZ0yv9IbcSTcKJstlsVeLb0zB06FCD\nv+XlYpyCadhe9Li7u5uK963mHU8Rzs7Os2bNysnJKS4urqio0PD50hu5ubk4gbWpYSHB9PBuILIc\nPHgQewatW7dOf2KZFEb6JQgAgJ5Zv349Ngl+9913hpZFVcjEpOb2Og0pKysjs0qBgYGyBQQCAR56\nenp6GlxaowUUEgAACCHk5OSEvZ8vXbqkNOSokRAdHZ2amnrw4EE9DOuPHz9+//59uVklJSWRkZF4\n9OPm5iY3zlNycjIOc0VijQOymJ7JDgAAHREVFSUQCCiKKisrMwmrHdnDTA9cuHDhs88+w/rGw8PD\nwsJCLBbX1tbm5+eTfcUsLCzkOql2dXUJhcK5c+e6u7uPGjVKbzKbHKCQAAD4fywtLbdu3WpoKYya\nqqoqvC+tLLa2trt27ZK73JvNZn/55Zc6Fu1lABQSAACAciIiIqysrAoLC/GGkJJwudzAwMAlS5ao\nspgBoMH03L7VoKysDEcOdXd3h8VoAABoQk9PT0VFBd63xdLS0tPTE/bZ0xZ9QiEBAAAAxs//AXB7\nONp5CLqPAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "setdefaults;\n", + "v=3.79./linspace(10,20,10);\n", + "T=273.15+linspace(-10,35,10);\n", + "[v_grid,T_grid]=meshgrid(v,T);\n", + "P = nitrogen_pressure(v_grid,T_grid);\n", + "pcolor(v_grid,T_grid-273.15,P-100)\n", + "xlabel('specific volume (m^3/kg)')\n", + "ylabel('Temperature (C)')\n", + "%zlabel('Pressure (kPa)')\n", + "\n", + "%colormap winter\n", + "%colormap summer\n", + "%colormap jet\n", + "colorbar()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_05/lecture_05.md b/lecture_05/lecture_05.md new file mode 100644 index 0000000..11c2894 --- /dev/null +++ b/lecture_05/lecture_05.md @@ -0,0 +1,325 @@ + + +```octave +%plot --format svg +``` + +## Questions from last class + +When you execute the given function + +my_function.m: + +```matlab +function [x,y] = my_function(max_time) + N=100; + t=linspace(0,max_time,N); + x=t.^2; + y=2*t; +end +``` + +as + +```>> [x,y] = my_function(20);``` + +What variables are saved to your workspace? + +![responses](q1.png) + +How do you write a help description for a function? + +![responses to question 2](q2.png) + + +How to keep our forked ME3255S page up to date with the original +pretty tired this morning + +How do I use the Github Desktop? + +whats your favorite football team? + +Will UConn's github get updated to the newest version of github? +As u said in class trail and error is the best way of learning. + +I believe the % is the same as matlab where it de-links your code into text + +Does the @ symbol designate a pointer? + +Given the change of air pressure as altitude increases, how fast would a frisbee have to travel (and spin) to hit an airplane? + +What is a gui? + + +could you go over a nested for loop example + +Can't seem to get this function to produce any graph and am not sure why + +When are these google forms due? + +how do I create a new function using Github on my desktop? + +Can you explain the first question more in class? + +What is the meaning of life? + +Should I just know how or what these topics are or will we learn them in the future? + + + +```octave +f =@(x) x.^2 + + +``` + + f = + + @(x)x.^2 + + + +```octave +f([1:2:10]) +f(4) +``` + + ans = + + 1 9 25 49 81 + + + ans = + + 16 + + + +```octave +% nested for loop example +for i = [1:6] + for j = [1:3] + fprintf('i=%i and j=%i\n',i,j) + end +end + +``` + + i=1 and j=1 + i=1 and j=2 + i=1 and j=3 + i=2 and j=1 + i=2 and j=2 + i=2 and j=3 + i=3 and j=1 + i=3 and j=2 + i=3 and j=3 + i=4 and j=1 + i=4 and j=2 + i=4 and j=3 + i=5 and j=1 + i=5 and j=2 + i=5 and j=3 + i=6 and j=1 + i=6 and j=2 + i=6 and j=3 + + +# From last class + + +```octave +help my_function +``` + + Help documentation of "my_function" + This function computes the velocity in the x- and y-directions given + three vectors of position in x- and y-directions as a function of time + x = x-position + y = y-position + t = time + output + vx = velocity in x-direction + vy = velocity in y-direction + + + +```octave +help my_caller +``` + + Help documentation of "my_caller" + This function computes the acceleration in the x- and y-directions given + three vectors of position in x- and y-directions as a function of time + x = x-position + y = y-position + t = time + output + ax = acceleration in x-direction + ay = acceleration in y-direction + + + +```octave +t=linspace(0,10,100)'; +x=t.^3; % vx = 3*t^2 +y=t.^2/2; % vy = t +[vx,vy]=my_function(x,y,t); +[ax,ay]=my_caller(x,y,t); +yyaxis left +plot(t(1:10:end),ax(1:10:end),'o',t,6*t) +ylabel('a_{x}') +yyaxis right +plot(t(1:10:end),ay(1:10:end),'s',t, 1*t./t) +ylabel('a_{y}') +xlabel('time') +axis([0,10,0,3]) +``` + + +![png](lecture_05_files/lecture_05_11_0.png) + + + +```octave +diff_match_dims(x,t) +``` + + Undefined function 'diff_match_dims' for input arguments of type 'double'. +  + +# Good coding habits +## naming folders and files + +[Stanford file naming best practices](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming) + +1. Include information to distinguish file name e.g. project name, objective of function, name/initials, type of data, conditions, version of file, +2. if using dates, use YYYYMMDD, so the computer organizes by year, then month, then day +3. avoid special characters e.g. !, #, \$, ... +4. avoid using spaces if not necessary, some programs consider a space as a break in code use dashes `-` or underscores `_` or CamelCase + +## Commenting your code + +Its important to comment your code to mention what a variable's units are, what the function is supposed to do, etc. + + + +```octave +function i=code(j) + % Example of bad variable names and bad function name + for w=1:j + i(w)=w; + end +end +``` + + Error: Function definitions are not permitted in this context. +  + + +```octave +help code +``` + + code not found. + + Use the Help browser search field to search the documentation, or + type "help help" for help command options, such as help for methods. + + +## Choose variable names that describe the variable + + +```octave +function count_vector=counting_function(max_value) + % Good variable names and better help documentation + % + % counting function creates a vector from 1 to max_value where each index, i, is + % stored in each vector spot + for i=1:max_value + count_vector(i)=i; % set each element in count_vector to i + end +end +``` + + +```octave +help counting_function +``` + + 'counting_function' is a command-line function + + Good variable names and better help documentation + + counting function creates a vector from 1 to max_value where each index, i, is + stored in each vector spot + + + Additional help for built-in functions and operators is + available in the online version of the manual. Use the command + 'doc ' to search the manual index. + + Help and information about Octave is also available on the WWW + at http://www.octave.org and via the help@octave.org + mailing list. + + +## Putting it all together + +1. Clone your homework_1 to your computer +2. open Matlab (cli, jupyter or gui) +3. Change working directory to homework_1 *e.g.* Windows:`cd('C:\Users\rcc02007\Documents\Github\homework_1')`, Mac: `cd('/Users/rcc02007/Documents/Github/homework_1')` +4. You have already created your first script `setdefaults.m` (if not see lecture_4) +5. Run `>> setdefaults.m` +6. Create a new m-file called nitrogen_pressure.m +7. Create a function based upon the ideal gas law for nitrogen, Pv=RT + 1. R=0.2968 kJ/(kg-K) + 2. inputs to function are v (specific volume m^3/kg), and T, temperature (K) + 3. output is P, pressure (kPa) +8. Once the function works, commit the change to the repository (add a message, like 'added file nitrogen_pressure.m' +9. After file is 'committed', 'push' the changes to your github account + +for the command-line git user, this is steps 8 and 9: +1. `$ git add *` +2. `$ git commit -m 'added file nitrogen_pressure.m'` +3. `$ git push -u origin master + Username for 'https://github.uconn.edu':rcc02007 + Password for 'https://rcc02007@github.uconn.edu': ` + + +Now, use this function to plot the range of pressures that a pressure vessel would experience if it is 1000 gallons (3.79 m^3) with 10-20 kg of Nitrogen and temperatures range from -10 to 35 degrees C. + +```matlab +v=0.379/linspace(50,20,10); +T=273.15+linspace(-10,35,10); +[v_grid,T_grid]=meshgrid(v,T); +P = nitrogen_pressure(v,T); +pcolor(v_grid,T_grid,P) +``` + + +```octave +setdefaults; +v=3.79./linspace(10,20,10); +T=273.15+linspace(-10,35,10); +[v_grid,T_grid]=meshgrid(v,T); +P = nitrogen_pressure(v_grid,T_grid); +pcolor(v_grid,T_grid-273.15,P-100) +xlabel('specific volume (m^3/kg)') +ylabel('Temperature (C)') +%zlabel('Pressure (kPa)') + +%colormap winter +%colormap summer +%colormap jet +colorbar() +``` + + +![png](lecture_05_files/lecture_05_25_0.png) + + + +```octave + +``` diff --git a/lecture_05/lecture_05.pdf b/lecture_05/lecture_05.pdf new file mode 100644 index 0000000..589a854 Binary files /dev/null and b/lecture_05/lecture_05.pdf differ diff --git a/lecture_05/lecture_05_files/lecture_05_11_0.png b/lecture_05/lecture_05_files/lecture_05_11_0.png new file mode 100644 index 0000000..b5a8ed1 Binary files /dev/null and b/lecture_05/lecture_05_files/lecture_05_11_0.png differ diff --git a/lecture_05/lecture_05_files/lecture_05_25_0.png b/lecture_05/lecture_05_files/lecture_05_25_0.png new file mode 100644 index 0000000..70aa9ce Binary files /dev/null and b/lecture_05/lecture_05_files/lecture_05_25_0.png differ diff --git a/lecture_05/my_caller.m b/lecture_05/my_caller.m new file mode 100644 index 0000000..f0cd536 --- /dev/null +++ b/lecture_05/my_caller.m @@ -0,0 +1,23 @@ +function [ax,ay]=my_caller(x,y,t) + % Help documentation of "my_caller" + % This function computes the acceleration in the x- and y-directions given + % three vectors of position in x- and y-directions as a function of time + % x = x-position + % y = y-position + % t = time + % output + % ax = acceleration in x-direction + % ay = acceleration in y-direction + + function v=diff_match_dims(x,t) + v=zeros(length(t),1); + v(1:end-1)=diff(x)./diff(t); + v(end)=v(end-1); + end + + [vx,vy]=my_function(x,y,t); + + ax = diff_match_dims(vx,t); + ay = diff_match_dims(vy,t); + +end diff --git a/lecture_05/my_function.m b/lecture_05/my_function.m new file mode 100644 index 0000000..5953061 --- /dev/null +++ b/lecture_05/my_function.m @@ -0,0 +1,21 @@ +function [vx,vy] = my_function(x,y,t) + % Help documentation of "my_function" + % This function computes the velocity in the x- and y-directions given + % three vectors of position in x- and y-directions as a function of time + % x = x-position + % y = y-position + % t = time + % output + % vx = velocity in x-direction + % vy = velocity in y-direction + + vx=zeros(length(t),1); + vy=zeros(length(t),1); + + vx(1:end-1) = diff(x)./diff(t); % calculate vx as delta x/delta t + vy(1:end-1) = diff(y)./diff(t); % calculate vy as delta y/delta t + + vx(end) = vx(end-1); + vy(end) = vy(end-1); + +end diff --git a/lecture_05/nitrogen_pressure.m b/lecture_05/nitrogen_pressure.m new file mode 100644 index 0000000..a76abf3 --- /dev/null +++ b/lecture_05/nitrogen_pressure.m @@ -0,0 +1,10 @@ +function P=nitrogen_pressure(v,T) + % function to calculate Pressure of Nitrogen using ideal gas law given the specific + % volume, v (m^3/kg), and temperature, T (K) + % Pv = RT + % R=0.2968; % kJ/kg-K + % P [in kPa] = nitrogen_pressure(v [in m^3/kg], T[in K]) + R=0.2968; % kJ/kg-K + P=R*T./v; +end + diff --git a/lecture_05/octave-workspace b/lecture_05/octave-workspace new file mode 100644 index 0000000..8c437bb Binary files /dev/null and b/lecture_05/octave-workspace differ diff --git a/lecture_05/q1.png b/lecture_05/q1.png new file mode 100644 index 0000000..bdc10e5 Binary files /dev/null and b/lecture_05/q1.png differ diff --git a/lecture_05/q2.png b/lecture_05/q2.png new file mode 100644 index 0000000..db02f0c Binary files /dev/null and b/lecture_05/q2.png differ diff --git a/lecture_05/setdefaults.m b/lecture_05/setdefaults.m new file mode 100644 index 0000000..8c3c5c8 --- /dev/null +++ b/lecture_05/setdefaults.m @@ -0,0 +1,3 @@ +set(0, 'defaultAxesFontSize', 16) +set(0,'defaultTextFontSize',14) +set(0,'defaultLineLineWidth',3) diff --git a/lecture_06/bisect.m b/lecture_06/bisect.m new file mode 100644 index 0000000..c09ffbf --- /dev/null +++ b/lecture_06/bisect.m @@ -0,0 +1,37 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); \ No newline at end of file diff --git a/lecture_06/falsepos.m b/lecture_06/falsepos.m new file mode 100644 index 0000000..0a3477c --- /dev/null +++ b/lecture_06/falsepos.m @@ -0,0 +1,39 @@ +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + % xr = (xl + xu)/2; % bisect method + xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); diff --git a/lecture_06/incsearch.m b/lecture_06/incsearch.m new file mode 100644 index 0000000..bd82554 --- /dev/null +++ b/lecture_06/incsearch.m @@ -0,0 +1,37 @@ +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +%for k = 1:length(x)-1 +% if sign(f(k)) ~= sign(f(k+1)) %check for sign change +% nb = nb + 1; +% xb(nb,1) = x(k); +% xb(nb,2) = x(k+1); +% end +%end +sign_change = diff(sign(f)); +[~,i_change] = find(sign_change~=0); +nb=length(i_change); +xb=[x(i_change)',x(i_change+1)']; + +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end diff --git a/lecture_06/lecture_06.ipynb b/lecture_06/lecture_06.ipynb new file mode 100644 index 0000000..f44f84c --- /dev/null +++ b/lecture_06/lecture_06.ipynb @@ -0,0 +1,834 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "my_caller.m\n", + "```matlab\n", + "function [vx,vy] = my_caller(max_time)\n", + " N=100;\n", + " t=linspace(0,max_time,N);\n", + " [x,y]=my_function(max_time);\n", + " vx=diff(x)./diff(t);\n", + " vy=diff(y)./diff(t);\n", + "end\n", + "```\n", + "\n", + "my_function.m\n", + "```matlab\n", + "function [x,y] = my_function(max_time)\n", + " N=100;\n", + " t=linspace(0,max_time,N);\n", + " x=t.^2;\n", + " y=2*t;\n", + "end\n", + "```\n", + "\n", + "In order to use `my_caller.m` where does `my_function.m` need to be saved?\n", + "![responses](q1.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "What cool personal projects are you working on?\n", + "While we delve deeper into Matlab functions, could we review some of the basic logic\n", + "operators it uses and command codes. \n", + "\n", + "I still dont know when these forms are technically due. \n", + " \n", + " -by the following lecture\n", + "\n", + "I'm having trouble interfacing Atom with GitHub. Is there a simple tutorial for this?\n", + " \n", + " -Mac? Seems there could be a bug that folks are working on\n", + "\n", + "What are the bear necessities of life? \n", + "please go over how to \"submit\" the homeworks because it is still confusing\n", + "\n", + "Do you prefer Matlab or Octave?\n", + " \n", + " -octave is my preference, but Matlab has some benefits\n", + "\n", + "Would you consider a country to be open-source?\n", + " \n", + " -??\n", + "\n", + "Is there a way to download matlab for free?\n", + " \n", + " -not legally\n", + "\n", + "how do you add files to current folder in matlab?\n", + " \n", + " -you can do this either through a file browser or cli\n", + "\n", + "How should Homework 2 be submitted? By simply putting the function into the homework_1\n", + "repository?\n", + " \n", + " -yes\n", + " \n", + "How can we tell that these forms are being received?\n", + " \n", + " -when you hit submit, the form says \"form received\"\n", + " \n", + "can you save scripted outputs from matlab/octave as an excel file?\n", + " \n", + " -yes, easy way is open a file with a .csv extension then fprintf and separate everything with commas, harder way is to use the `xlswrite`\n", + " \n", + "\n", + "Also, can you update your notes to show what happens when these things are run, as you do\n", + "in class?\"\n", + " \n", + " -I always update the lecture notes after class so they should display what we did in class\n", + " \n", + "I have a little difficulty following along in class on my laptop when you have programs\n", + "pre-written. Maybe if you posted those codes on Github so I could copy them when you\n", + "switch to different desktops I would be able to follow along better.\n", + "\n", + "Kirk or Picard?\n", + " \n", + " -Kirk\n", + " \n", + "Who is our TA?\n", + " \n", + " -Peiyu Zhang peiyu.zhang@uconn.edu\n", + "\n", + "Can we download libraries of data like thermodynamic tables into matlab?\n", + " \n", + "-YES! [Matlab Steam Tables](http://bit.ly/2kZygu8)\n", + "\n", + "Will we use the Simulink addition to Matlab? I found it interesting and useful for\n", + "evaluating ODEs in Linear systems.\n", + " \n", + " -not in this class, everything in simulink has a matlab script/function that can be substituted, but many times its hidden by the gui. Here we want to look directly at our solvers\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Roots and Optimization\n", + "## Bracketing ch. 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you are given a function, numerical or analytical, it's not always possible to solve directly for a given variable. \n", + "\n", + "Even for the freefall example we first explored, \n", + "\n", + "$v(t)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)$\n", + "\n", + "There is no way to solve for m in terms of the other variables. \n", + "\n", + "Instead, we can solve the problem by creating a new function f(m) where\n", + "\n", + "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$. \n", + "\n", + "When f(m) = 0, we have solved for m in terms of the other variables (e.g. for a given time, velocity, drag coefficient and acceleration due to gravity)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t120\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t140\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t160\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t180\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "setdefaults\n", + "g=9.81; % acceleration due to gravity\n", + "m=linspace(50, 200,100); % possible values for mass 50 to 200 kg\n", + "c_d=0.25; % drag coefficient\n", + "t=4; % at time = 4 seconds\n", + "v=36; % speed must be 36 m/s\n", + "f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m\n", + "\n", + "plot(m,f_m(m),m,zeros(length(m),1))\n", + "axis([45 200 -5 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.045626\r\n" + ] + } + ], + "source": [ + "f_m(145)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Brute force method is plot f_m vs m and with smaller and smaller steps until f_m ~ 0\n", + "\n", + "Better methods are the \n", + "1. Bracketing methods\n", + "2. Open methods\n", + "\n", + "Both need an initial guess. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Incremental method (Brute force)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You know that for one value, m_lower, f_m is negative and for another value, m_upper, f_m is positive. \n", + "\n", + "```matlab\n", + "function xb = incsearch(func,xmin,xmax,ns)\n", + "% incsearch: incremental search root locator\n", + "% xb = incsearch(func,xmin,xmax,ns):\n", + "% finds brackets of x that contain sign changes\n", + "% of a function on an interval\n", + "% input:\n", + "% func = name of function\n", + "% xmin, xmax = endpoints of interval\n", + "% ns = number of subintervals (default = 50)\n", + "% output:\n", + "% xb(k,1) is the lower bound of the kth sign change\n", + "% xb(k,2) is the upper bound of the kth sign change\n", + "% If no brackets found, xb = [].\n", + "if nargin < 3, error('at least 3 arguments required'), end\n", + "if nargin < 4, ns = 50; end %if ns blank set to 50\n", + "% Incremental search\n", + "x = linspace(xmin,xmax,ns);\n", + "f = func(x);\n", + "nb = 0; xb = []; %xb is null unless sign change detected\n", + "for k = 1:length(x)-1\n", + " if sign(f(k)) ~= sign(f(k+1)) %check for sign change\n", + " nb = nb + 1;\n", + " xb(nb,1) = x(k);\n", + " xb(nb,2) = x(k+1);\n", + " end\n", + "end\n", + "if isempty(xb) %display that no brackets were found\n", + " fprintf('no brackets found\\n')\n", + " fprintf('check interval or increase ns\\n')\n", + "else\n", + " fprintf('number of brackets: %i\\n',nb) %display number of brackets\n", + "end\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'incsearch' is a function from the file /home/ryan/Documents/UConn/ME3255/me3255_S2017/lecture_06/incsearch.m\n", + "\n", + " incsearch: incremental search root locator\n", + " xb = incsearch(func,xmin,xmax,ns):\n", + " finds brackets of x that contain sign changes\n", + " of a function on an interval\n", + " input:\n", + " func = name of function\n", + " xmin, xmax = endpoints of interval\n", + " ns = number of subintervals (default = 50)\n", + " output:\n", + " xb(k,1) is the lower bound of the kth sign change\n", + " xb(k,2) is the upper bound of the kth sign change\n", + " If no brackets found, xb = [].\n", + "\n", + "\n", + "Additional help for built-in functions and operators is\n", + "available in the online version of the manual. Use the command\n", + "'doc ' to search the manual index.\n", + "\n", + "Help and information about Octave is also available on the WWW\n", + "at http://www.octave.org and via the help@octave.org\n", + "mailing list.\n" + ] + } + ], + "source": [ + "help incsearch" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "no brackets found\n", + "check interval or increase ns\n", + "ans = [](1x0)\n" + ] + } + ], + "source": [ + "incsearch(f_m,50, 200,55)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Bisection method" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Divide interval in half until error is reduced to some level\n", + "\n", + "in previous example of freefall, choose x_l=50, x_u=200\n", + "\n", + "x_r = (50+200)/2 = 125\n", + "\n", + "f_m(125) = -0.408\n", + "\n", + "x_r= (125+200)/2 = 162.5\n", + "\n", + "f_m(162.5) = 0.3594\n", + "\n", + "x_r = (125+162.5)/2=143.75\n", + "\n", + "f_m(143.75)= 0.0206" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 0.020577\r\n" + ] + } + ], + "source": [ + "f_m(143.75)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much better root locator, with 4 iterations, our function is already close to zero\n", + "\n", + "Automate this with a function:\n", + "`bisect.m`\n", + "\n", + "```matlab\n", + "function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)\n", + "% bisect: root location zeroes\n", + "% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):\n", + "% uses bisection method to find the root of func\n", + "% input:\n", + "% func = name of function\n", + "% xl, xu = lower and upper guesses\n", + "% es = desired relative error (default = 0.0001%)\n", + "% maxit = maximum allowable iterations (default = 50)\n", + "% p1,p2,... = additional parameters used by func\n", + "% output:\n", + "% root = real root\n", + "% fx = function value at root\n", + "% ea = approximate relative error (%)\n", + "% iter = number of iterations\n", + "if nargin<3,error('at least 3 input arguments required'),end\n", + "test = func(xl,varargin{:})*func(xu,varargin{:});\n", + "if test>0,error('no sign change'),end\n", + "if nargin<4|isempty(es), es=0.0001;end\n", + "if nargin<5|isempty(maxit), maxit=50;end\n", + "iter = 0; xr = xl; ea = 100;\n", + "while (1)\n", + " xrold = xr;\n", + " xr = (xl + xu)/2;\n", + " iter = iter + 1;\n", + " if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end\n", + " test = func(xl,varargin{:})*func(xr,varargin{:});\n", + " if test < 0\n", + " xu = xr;\n", + " elseif test > 0\n", + " xl = xr;\n", + " else\n", + " ea = 0;\n", + " end\n", + " if ea <= es | iter >= maxit,break,end\n", + "end\n", + "root = xr; fx = func(xr, varargin{:});\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## False position (linear interpolation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rather than bisecting each bracket (1/2 each time) we can calculate the slope between the two points and update the xr position in this manner\n", + "\n", + "$ x_{r} = x_{u} - \\frac{f(x_{u})(x_{l}-x_{u})}{f(x_{l})-f(x_{u})}$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t50\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t150\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t200\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t \n", + "\t\n", + "\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\t\t \n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xl=50; xu=200; \n", + "xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu));\n", + "\n", + "plot(m,f_m(m),xl,f_m(xl),'s',xu,f_m(xu),'s',xr,0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much better root locator, with 4 iterations, our function is already close to zero\n", + "\n", + "Automate this with a function:\n", + "`falsepos.m`\n", + "\n", + "```matlab\n", + "function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin)\n", + "% falsepos: root location zeroes\n", + "% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):\n", + "% uses false position method to find the root of func\n", + "% input:\n", + "% func = name of function\n", + "% xl, xu = lower and upper guesses\n", + "% es = desired relative error (default = 0.0001%)\n", + "% maxit = maximum allowable iterations (default = 50)\n", + "% p1,p2,... = additional parameters used by func\n", + "% output:\n", + "% root = real root\n", + "% fx = function value at root\n", + "% ea = approximate relative error (%)\n", + "% iter = number of iterations\n", + "if nargin<3,error('at least 3 input arguments required'),end\n", + "test = func(xl,varargin{:})*func(xu,varargin{:});\n", + "if test>0,error('no sign change'),end\n", + "if nargin<4|isempty(es), es=0.0001;end\n", + "if nargin<5|isempty(maxit), maxit=50;end\n", + "iter = 0; xr = xl; ea = 100;\n", + "while (1)\n", + " xrold = xr;\n", + " % xr = (xl + xu)/2; % bisect method\n", + " xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method\n", + " iter = iter + 1;\n", + " if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end\n", + " test = func(xl,varargin{:})*func(xr,varargin{:});\n", + " if test < 0\n", + " xu = xr;\n", + " elseif test > 0\n", + " xl = xr;\n", + " else\n", + " ea = 0;\n", + " end\n", + " if ea <= es | iter >= maxit,break,end\n", + "end\n", + "root = xr; fx = func(xr, varargin{:});\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Octave", + "language": "octave", + "name": "octave" + }, + "language_info": { + "file_extension": ".m", + "help_links": [ + { + "text": "MetaKernel Magics", + "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" + } + ], + "mimetype": "text/x-octave", + "name": "octave", + "version": "0.19.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_06/lecture_06.md b/lecture_06/lecture_06.md new file mode 100644 index 0000000..b3d2266 --- /dev/null +++ b/lecture_06/lecture_06.md @@ -0,0 +1,373 @@ + + +```octave +%plot --format svg +``` + +my_caller.m +```matlab +function [vx,vy] = my_caller(max_time) + N=100; + t=linspace(0,max_time,N); + [x,y]=my_function(max_time); + vx=diff(x)./diff(t); + vy=diff(y)./diff(t); +end +``` + +my_function.m +```matlab +function [x,y] = my_function(max_time) + N=100; + t=linspace(0,max_time,N); + x=t.^2; + y=2*t; +end +``` + +In order to use `my_caller.m` where does `my_function.m` need to be saved? +![responses](q1.png) + + +What cool personal projects are you working on? +While we delve deeper into Matlab functions, could we review some of the basic logic +operators it uses and command codes. + +I still dont know when these forms are technically due. + + -by the following lecture + +I'm having trouble interfacing Atom with GitHub. Is there a simple tutorial for this? + + -Mac? Seems there could be a bug that folks are working on + +What are the bear necessities of life? +please go over how to "submit" the homeworks because it is still confusing + +Do you prefer Matlab or Octave? + + -octave is my preference, but Matlab has some benefits + +Would you consider a country to be open-source? + + -?? + +Is there a way to download matlab for free? + + -not legally + +how do you add files to current folder in matlab? + + -you can do this either through a file browser or cli + +How should Homework 2 be submitted? By simply putting the function into the homework_1 +repository? + + -yes + +How can we tell that these forms are being received? + + -when you hit submit, the form says "form received" + +can you save scripted outputs from matlab/octave as an excel file? + + -yes, easy way is open a file with a .csv extension then fprintf and separate everything with commas, harder way is to use the `xlswrite` + + +Also, can you update your notes to show what happens when these things are run, as you do +in class?" + + -I always update the lecture notes after class so they should display what we did in class + +I have a little difficulty following along in class on my laptop when you have programs +pre-written. Maybe if you posted those codes on Github so I could copy them when you +switch to different desktops I would be able to follow along better. + +Kirk or Picard? + + -Kirk + +Who is our TA? + + -Peiyu Zhang peiyu.zhang@uconn.edu + +Can we download libraries of data like thermodynamic tables into matlab? + +-YES! [Matlab Steam Tables](http://bit.ly/2kZygu8) + +Will we use the Simulink addition to Matlab? I found it interesting and useful for +evaluating ODEs in Linear systems. + + -not in this class, everything in simulink has a matlab script/function that can be substituted, but many times its hidden by the gui. Here we want to look directly at our solvers + + +# Roots and Optimization +## Bracketing ch. 5 + +When you are given a function, numerical or analytical, it's not always possible to solve directly for a given variable. + +Even for the freefall example we first explored, + +$v(t)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)$ + +There is no way to solve for m in terms of the other variables. + +Instead, we can solve the problem by creating a new function f(m) where + +$f(m)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-v(t)$. + +When f(m) = 0, we have solved for m in terms of the other variables (e.g. for a given time, velocity, drag coefficient and acceleration due to gravity) + + +```octave +setdefaults +g=9.81; % acceleration due to gravity +m=linspace(50, 200,100); % possible values for mass 50 to 200 kg +c_d=0.25; % drag coefficient +t=4; % at time = 4 seconds +v=36; % speed must be 36 m/s +f_m = @(m) sqrt(g*m/c_d).*tanh(sqrt(g*c_d./m)*t)-v; % anonymous function f_m + +plot(m,f_m(m),m,zeros(length(m),1)) +axis([45 200 -5 1]) +``` + + +![svg](lecture_06_files/lecture_06_5_0.svg) + + + +```octave +f_m(145) +``` + + ans = 0.045626 + + +Brute force method is plot f_m vs m and with smaller and smaller steps until f_m ~ 0 + +Better methods are the +1. Bracketing methods +2. Open methods + +Both need an initial guess. + + +## Incremental method (Brute force) + +You know that for one value, m_lower, f_m is negative and for another value, m_upper, f_m is positive. + +```matlab +function xb = incsearch(func,xmin,xmax,ns) +% incsearch: incremental search root locator +% xb = incsearch(func,xmin,xmax,ns): +% finds brackets of x that contain sign changes +% of a function on an interval +% input: +% func = name of function +% xmin, xmax = endpoints of interval +% ns = number of subintervals (default = 50) +% output: +% xb(k,1) is the lower bound of the kth sign change +% xb(k,2) is the upper bound of the kth sign change +% If no brackets found, xb = []. +if nargin < 3, error('at least 3 arguments required'), end +if nargin < 4, ns = 50; end %if ns blank set to 50 +% Incremental search +x = linspace(xmin,xmax,ns); +f = func(x); +nb = 0; xb = []; %xb is null unless sign change detected +for k = 1:length(x)-1 + if sign(f(k)) ~= sign(f(k+1)) %check for sign change + nb = nb + 1; + xb(nb,1) = x(k); + xb(nb,2) = x(k+1); + end +end +if isempty(xb) %display that no brackets were found + fprintf('no brackets found\n') + fprintf('check interval or increase ns\n') +else + fprintf('number of brackets: %i\n',nb) %display number of brackets +end +``` + + +```octave +help incsearch +``` + + 'incsearch' is a function from the file /home/ryan/Documents/UConn/ME3255/me3255_S2017/lecture_06/incsearch.m + + incsearch: incremental search root locator + xb = incsearch(func,xmin,xmax,ns): + finds brackets of x that contain sign changes + of a function on an interval + input: + func = name of function + xmin, xmax = endpoints of interval + ns = number of subintervals (default = 50) + output: + xb(k,1) is the lower bound of the kth sign change + xb(k,2) is the upper bound of the kth sign change + If no brackets found, xb = []. + + + Additional help for built-in functions and operators is + available in the online version of the manual. Use the command + 'doc ' to search the manual index. + + Help and information about Octave is also available on the WWW + at http://www.octave.org and via the help@octave.org + mailing list. + + + +```octave +incsearch(f_m,50, 200,55) +``` + + no brackets found + check interval or increase ns + ans = [](1x0) + + +## Bisection method + +Divide interval in half until error is reduced to some level + +in previous example of freefall, choose x_l=50, x_u=200 + +x_r = (50+200)/2 = 125 + +f_m(125) = -0.408 + +x_r= (125+200)/2 = 162.5 + +f_m(162.5) = 0.3594 + +x_r = (125+162.5)/2=143.75 + +f_m(143.75)= 0.0206 + + +```octave +f_m(143.75) +``` + + ans = 0.020577 + + +Much better root locator, with 4 iterations, our function is already close to zero + +Automate this with a function: +`bisect.m` + +```matlab +function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin) +% bisect: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses bisection method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + xr = (xl + xu)/2; + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); +``` + +## False position (linear interpolation) + +Rather than bisecting each bracket (1/2 each time) we can calculate the slope between the two points and update the xr position in this manner + +$ x_{r} = x_{u} - \frac{f(x_{u})(x_{l}-x_{u})}{f(x_{l})-f(x_{u})}$ + + +```octave +xl=50; xu=200; +xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); + +plot(m,f_m(m),xl,f_m(xl),'s',xu,f_m(xu),'s',xr,0) +``` + + +![svg](lecture_06_files/lecture_06_18_0.svg) + + +Much better root locator, with 4 iterations, our function is already close to zero + +Automate this with a function: +`falsepos.m` + +```matlab +function [root,fx,ea,iter]=falsepos(func,xl,xu,es,maxit,varargin) +% falsepos: root location zeroes +% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...): +% uses false position method to find the root of func +% input: +% func = name of function +% xl, xu = lower and upper guesses +% es = desired relative error (default = 0.0001%) +% maxit = maximum allowable iterations (default = 50) +% p1,p2,... = additional parameters used by func +% output: +% root = real root +% fx = function value at root +% ea = approximate relative error (%) +% iter = number of iterations +if nargin<3,error('at least 3 input arguments required'),end +test = func(xl,varargin{:})*func(xu,varargin{:}); +if test>0,error('no sign change'),end +if nargin<4|isempty(es), es=0.0001;end +if nargin<5|isempty(maxit), maxit=50;end +iter = 0; xr = xl; ea = 100; +while (1) + xrold = xr; + % xr = (xl + xu)/2; % bisect method + xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method + iter = iter + 1; + if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end + test = func(xl,varargin{:})*func(xr,varargin{:}); + if test < 0 + xu = xr; + elseif test > 0 + xl = xr; + else + ea = 0; + end + if ea <= es | iter >= maxit,break,end +end +root = xr; fx = func(xr, varargin{:}); +``` + + +```octave + +``` diff --git a/lecture_06/lecture_06_files/lecture_06_18_0.svg b/lecture_06/lecture_06_files/lecture_06_18_0.svg new file mode 100644 index 0000000..9652b37 --- /dev/null +++ b/lecture_06/lecture_06_files/lecture_06_18_0.svg @@ -0,0 +1,144 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5 + + + + + -4 + + + + + -3 + + + + + -2 + + + + + -1 + + + + + 0 + + + + + 1 + + + + + 0 + + + + + 50 + + + + + 100 + + + + + 150 + + + + + 200 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + gnuplot_plot_3a + + + + + + gnuplot_plot_4a + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lecture_06/lecture_06_files/lecture_06_5_0.svg b/lecture_06/lecture_06_files/lecture_06_5_0.svg new file mode 100644 index 0000000..3ecaecd --- /dev/null +++ b/lecture_06/lecture_06_files/lecture_06_5_0.svg @@ -0,0 +1,145 @@ + + +Gnuplot +Produced by GNUPLOT 5.0 patchlevel 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -5 + + + + + -4 + + + + + -3 + + + + + -2 + + + + + -1 + + + + + 0 + + + + + 1 + + + + + 60 + + + + + 80 + + + + + 100 + + + + + 120 + + + + + 140 + + + + + 160 + + + + + 180 + + + + + 200 + + + + + + + + + gnuplot_plot_1a + + + + + + gnuplot_plot_2a + + + + + + + + + + + + + \ No newline at end of file