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 @@
+
+
+
+
diff --git a/HW3/README.md b/HW3/README.md
new file mode 100644
index 0000000..45214a4
--- /dev/null
+++ b/HW3/README.md
@@ -0,0 +1,73 @@
+# Homework #3
+## due 2/15/17 by 11:59pm
+
+
+1. Create a new github repository called 'roots_and_optimization'.
+
+ a. Add rcc02007 and pez16103 as collaborators.
+
+ b. Clone the repository to your computer.
+
+ c. Copy your `projectile.m` function into the 'roots_and_optimization' folder.
+ *Disable the plotting routine for the solvers*
+
+ d. Use the four solvers `falsepos.m`, `bisect.m`, `newtraph.m` and `mod_secant.m`
+ to solve for the angle needed to reach h=1.72 m, with an initial speed of 15 m/s.
+
+ e. The `newtraph.m` function needs a derivative, calculate the derivative of your
+ function with respect to theta, `dprojectile_dtheta.m`. This function should
+ output d(h)/d(theta).
+
+
+ f. In your `README.md` file, document the following under the heading `#
+ Homework #3`:
+
+ i. Compare the number of iterations that each function needed to reach an
+ accuracy of 0.00001%. Include a table in your README.md with:
+
+ ```
+ | solver | initial guess(es) | ea | number of iterations|
+ | --- | --- | --- | --- |
+ |falsepos | | | |
+ |bisect | | | |
+ |newtraph | | | |
+ |mod_secant | | | |
+ ```
+
+ ii. Compare the convergence of the 4 methods. Plot the approximate error vs the
+ number of iterations that the solver has calculated. Save the plot as
+ `convergence.png` and display the plot in your `README.md` with:
+
+ `![Plot of convergence for four numerical solvers.](convergence.png)`
+
+ iii. In the `README.md` provide a description of the files used to create the
+ table and the convergence plot.
+
+2. The Newton-Raphson method and the modified secant method do not always converge to a
+solution. One simple example is the function f(x) = x*exp(-x^2). The root is at 0, but
+using the numerical solvers, `newtraph.m` and `mod_secant.m`, there are certain initial
+guesses that do not converge.
+
+ a. Calculate the first 5 iterations for the Newton-Raphson method with an initial
+ guess of x_i=2 for f(x)=x*exp(-x^2).
+
+ b. Add the results to a table in the `README.md` with:
+
+ ```
+ ### divergence of Newton-Raphson method
+
+ | iteration | x_i | approx error |
+ | --- | --- | --- |
+ | 0 | 2 | n/a |
+ | 1 | | |
+ | 2 | | |
+ | 3 | | |
+ | 4 | | |
+ | 5 | | |
+ ```
+
+ c. Repeat steps a-b for an initial guess of 0.2. (But change the heading from
+ 'divergence' to 'convergence')
+
+3. Commit your changes to your repository. Sync your local repository with github. Then
+copy and paste the "clone URL" into the following Google Form [Homework 3](https://goo.gl/forms/UJBGwp0fQcSxImkq2)
diff --git a/README.md b/README.md
index eebd665..73ca14a 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 |
@@ -67,8 +74,8 @@ general, I will not post homework solutions.
|3|1/31||Consistent Coding habits|
| |2/2|5|Root Finding|
|4|2/7|6|Root Finding con’d|
-| |2/9|7|Optimization|
-|5|2/14||Intro to Linear Algebra|
+| |2/9|7| **Snow Day**|
+|5|2/14|| Optimization |
| |2/16|8|Linear Algebra|
|6|2/21|9|Linear systems: Gauss elimination|
| |2/23|10|Linear Systems: LU factorization|
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+fxuPuMV2traVq5cWVJSsmDBghdeeIHtcJxvz549CoVi1apVUVFevgMW01dDRK+88oq1MSgo6E9/\n+hN53Si3wWBYsmRJYWHha6+9VlBQsHXr1h07duzbt4+InnrqqaNHj7IdoMv57E8Ww8ufkORyORFd\nuWK/7y8zcjh06FAWYnK9jo6Op5566ueff54zZ87GjRvZDscl3nzzTYlEcsstt3z//fdMi3UWIdMy\nadIk7xhYGjx4MBGJRCK7RRnuuOMOIqqpqWEnLNf497//XVtbO3PmzIcfftjaGBcX9z//8z+rV6/e\nunUrc9dezDd/sqy8PCExq+Z0rXhmWpg/ey/T0dGRkZFRWFg4a9YsL54Pq9fr29vbn3766a6HmMZ/\n/vOf3lGUdeutt7Idgvswg/bWh0Irpsbs5MmTLMTkXj74k2XLyxPS1KlT+Xz+jz/+2NraarsW1nff\nfUdEU6ZMYS80lzCZTBkZGYcPH54+ffq7777LdjgutHHjRrv+dJPJxNRuvP3220QUFxfHTmTOdvvt\nt4eGhur1eq1Wa7saRWlpKRENGTKEvdCcLzQ0lIiMRqNdO1PZwRz1br72k2XHy8eQgoKC7rvvvs7O\nzq1bt1obz507991334nFYi+rzjKbzX/84x+ZbJSdne3d3c1z586ddyPrcizMW69ZScjPz2/x4sVE\nlJ2dbdvO/F/advqkF5g6dSoRfffdd3aPCJ999pn1qHfzqZ+srrx/cVWNRvO73/3u6tWrCxcuTE1N\nvXDhwscff3z16tXXX3+d+XvuNXbv3v3iiy8S0ZQpU4RCod3RZ555Zty4cWzE5SYdHR1jx44lb1xv\ntLW1deHChSqV6p577rn//vtNJtM///nPkpKSW2655auvvvKy54b09PTCwsLw8PClS5cmJCTo9fp/\n/etfJ06cCAkJ2b17t0cvXX/s2LEPP/yQea1QKIgoJSWFebtixQrrZFjf+cnqyvsTEhFVVVX9+c9/\nZkYFiUgikaxatcr7/mh37tzpYMGCbdu2eWXxt5UXJyQiamhoePXVVw8cOGBtueeee15//fWui0V5\nOoPB8Le//e3zzz+3Xet64sSJr7/++ogRI1gM7OZ9++23q1at6vbQm2+++cADD1jf+shPVlc+kZAY\narW6urpaLBYnJSX5+Xl5XyV4pcbGRmboiBlYYjscFzKbzcXFxS0tLX5+fhMmTAgODmY7Ihb44E+W\nDyUkAADgMp/IugAAwH1ISAAAwAlISAAAwAlISAAAwAlISAAAwAlISAAAwAlISAAAwAlISAAAwAlI\nSAAAwAlISAAAwAlISAA3+OGHH3bu3Hn58mW2AwHwOUhI4IsaGxsbGxs7Ojq6Hvrkk0/WrFmjVCrd\nHxWAj0NCAl80d+7cyZMnFxUVsR0IAPzKy7cwB+ivDz74wGQyBQYGsh0IgM9BQgK4AVIRAFuwHxL4\nltLS0h07duzZs6e9vX369OlRUVFM+4MPPjhp0iQiysnJUSqVK1asiIuLYw698cYbRqPx8ccfDwgI\n+Pjjj4uKihobGydOnPj4448nJiYSUWNj4/bt248cOXL+/PlJkyYtWbLk7rvv7vbby8rKduzYUVFR\nUV1dnZiYeNtttz322GPet+srwMAgIYFv6Wkb6bVr1y5atIiI0tPTCwsLc3Jypk6dyhxKSkpqaWl5\n5ZVX3n33Xb1eLxKJ2tvbTSaTUCj8xz/+IZVKly5deuXKFWs7Eb399tvz5s2z+4oNGzZ88sknRBQQ\nECAUCltbWzs7O0NDQz/66KPbb7/dtbcN4AlQ1AC+Zd68eRUVFRKJhIhycnIqfsFkIwc2btw4a9as\nI0eOnDhx4tixY3PnzjUajVlZWc8+++zo0aMVCsWJEydKS0sfe+wxIlq7dq3ZbLb9+NatWz/55JOI\niIht27aVlpYWFRWdOHEiIyNDr9evXLmyubnZdbcM4CmQkAD6ZNy4cevWrQsLCyOioKCg9evX8/n8\nsrIyg8GQnZ0dHR1NRHw+/y9/+cvgwYMbGhp+/vln62e1Wu3777/P5/Nzc3NnzJjBNAoEgueee27h\nwoVXr17dsWMHKzcFwClISAB9smzZMtu3QUFBY8aMIaLf/e53fD7f9lBSUhIRXb161dry7bfftre3\nT5s2LT4+3u6ys2fPJqKjR4+6KGwAD4IqO4A+YZ6NbEmlUiKKjY21axcKhUTU3t5ubTl58iTTsmfP\nHruTm5qaiKi4uNjZ8QJ4HiQkgD7x8+tfd4JtuZDBYCCiwsLCwsLCbk9mSiEAfBwSEoDLMcksLS3N\nOoBkx98ffxMBkJAAXG/w4MFE1NjYaC0lB4CuUNQAvigyMpKI7CqzXWfmzJlEdODAAZR3AziAhAS+\niKlEcNuS3lOnTr3tttuamppWrVrV2tpqd7S6uvrcuXPuiQSAy9BlB75o7ty5+fn569at27dvH7Ny\nz9KlS13an/b+++///ve/P3z48KxZs+65554JEyYQUVlZ2cmTJ0+dOvXmm292rQgH8DVISOCL5s2b\n19TUtHPnzrKyMqY+OyUlxaXfGBUVtWfPnvfee2/HL5h2f3//WbNmYekgAMJadgBuZjabi4uL9Xo9\nj8eLiYmJj4/vb0E5gLdCQgIAAE7AP80AAIATkJAAAIATkJAAAIATkJAAAIAT/j+HjFxldPYA2QAA\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\n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\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)
+```
+
+ [0;31mUndefined function 'diff_match_dims' for input arguments of type 'double'.
+ [0m
+
+# 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
+```
+
+ [0;31mError: Function definitions are not permitted in this context.
+ [0m
+
+
+```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": [
+ ""
+ ],
+ "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": [
+ ""
+ ],
+ "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 @@
+
\ 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 @@
+
\ No newline at end of file
diff --git a/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb b/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb
new file mode 100644
index 0000000..d7ff495
--- /dev/null
+++ b/lecture_07/.ipynb_checkpoints/lecture_07-checkpoint.ipynb
@@ -0,0 +1,1042 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "%plot --format svg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "setdefaults"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Roots: Open methods\n",
+ "## Newton-Raphson"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)\n",
+ "\n",
+ "$f'(x_{i})=\\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n",
+ "\n",
+ "Use Newton-Raphson to find solution when $e^{x}=x$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "error_approx = 1\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "f= @(x) exp(-x)-x;\n",
+ "df= @(x) -exp(-x)-1;\n",
+ "\n",
+ "x_i= 0;\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_r=x_i;\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.50000\n",
+ "error_approx = 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.56631\n",
+ "error_approx = 0.11709\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.56714\n",
+ "error_approx = 0.0014673\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. \n",
+ "\n",
+ "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$.\n",
+ "\n",
+ "to use the Newton-Raphson method, we need the derivative $\\frac{df}{dm}$\n",
+ "\n",
+ "$\\frac{df}{dm}=\\frac{1}{2}\\sqrt{\\frac{g}{mc_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-\n",
+ "\\frac{g}{2m}\\mathrm{sech}^{2}(\\sqrt{\\frac{gc_{d}}{m}}t)$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "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",
+ "df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 142.74\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "newtraph(f_m,df_m,140,0.00001)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Secant Methods"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Not always able to evaluate the derivative. Approximation of derivative:\n",
+ "\n",
+ "$f'(x_{i})=\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=\n",
+ " x_{i}-\\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$\n",
+ " \n",
+ "What values should $x_{i}$ and $x_{i-1}$ take?\n",
+ "\n",
+ "To reduce arbitrary selection of variables, use the\n",
+ "\n",
+ "## Modified Secant method\n",
+ "\n",
+ "Change the x evaluations to a perturbation $\\delta$. \n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})(\\delta x_{i})}{f(x_{i}+\\delta x_{i})-f(x_{i})}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 142.74\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "mod_secant(f_m,1e-6,50,0.00001)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "error: 'plot_bool' undefined near line 12 column 6\n",
+ "error: called from\n",
+ " car_payments at line 12 column 3\n",
+ " mod_secant at line 22 column 8\n",
+ "error: 'Amt' undefined near line 1 column 14\n",
+ "error: evaluating argument list element number 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "Amt_numerical=mod_secant(@(A) car_payments(A,30000,0.05,5),1e-6,50,0.001)\n",
+ "car_payments(Amt,30000,0.05,5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "error: 'Amt' undefined near line 1 column 1\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "Amt*12*5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Amt = 566.14\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "% Amortization calculation\n",
+ "A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);\n",
+ "Amt=A(30000,0.05/12,5*12)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Matlab's function\n",
+ "\n",
+ "Matlab and Octave combine bracketing and open methods in the `fzero` function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m\n",
+ "\n",
+ " -- Function File: fzero (FUN, X0)\n",
+ " -- Function File: fzero (FUN, X0, OPTIONS)\n",
+ " -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)\n",
+ " Find a zero of a univariate function.\n",
+ "\n",
+ " FUN is a function handle, inline function, or string containing the\n",
+ " name of the function to evaluate.\n",
+ "\n",
+ " X0 should be a two-element vector specifying two points which\n",
+ " bracket a zero. In other words, there must be a change in sign of\n",
+ " the function between X0(1) and X0(2). More mathematically, the\n",
+ " following must hold\n",
+ "\n",
+ " sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0\n",
+ "\n",
+ " If X0 is a single scalar then several nearby and distant values are\n",
+ " probed in an attempt to obtain a valid bracketing. If this is not\n",
+ " successful, the function fails.\n",
+ "\n",
+ " OPTIONS is a structure specifying additional options. Currently,\n",
+ " 'fzero' recognizes these options: \"FunValCheck\", \"OutputFcn\",\n",
+ " \"TolX\", \"MaxIter\", \"MaxFunEvals\". For a description of these\n",
+ " options, see *note optimset: XREFoptimset.\n",
+ "\n",
+ " On exit, the function returns X, the approximate zero point and\n",
+ " FVAL, the function value thereof.\n",
+ "\n",
+ " INFO is an exit flag that can have these values:\n",
+ "\n",
+ " * 1 The algorithm converged to a solution.\n",
+ "\n",
+ " * 0 Maximum number of iterations or function evaluations has\n",
+ " been reached.\n",
+ "\n",
+ " * -1 The algorithm has been terminated from user output\n",
+ " function.\n",
+ "\n",
+ " * -5 The algorithm may have converged to a singular point.\n",
+ "\n",
+ " OUTPUT is a structure containing runtime information about the\n",
+ " 'fzero' algorithm. Fields in the structure are:\n",
+ "\n",
+ " * iterations Number of iterations through loop.\n",
+ "\n",
+ " * nfev Number of function evaluations.\n",
+ "\n",
+ " * bracketx A two-element vector with the final bracketing of the\n",
+ " zero along the x-axis.\n",
+ "\n",
+ " * brackety A two-element vector with the final bracketing of the\n",
+ " zero along the y-axis.\n",
+ "\n",
+ " See also: optimset, fsolve.\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 fzero"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 563.79\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "fzero(@(A) car_payments(A,30000,0.05,5,0),500)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Comparison of Solvers\n",
+ "\n",
+ "It's helpful to compare to the convergence of different routines to see how quickly you find a solution. \n",
+ "\n",
+ "Comparing the freefall example\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: called from\n",
+ " __line__ at line 120 column 16\n",
+ " line at line 56 column 8\n",
+ " __plt__>__plt2vv__ at line 500 column 10\n",
+ " __plt__>__plt2__ at line 246 column 14\n",
+ " __plt__ at line 133 column 15\n",
+ " semilogy at line 60 column 10\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "N=20;\n",
+ "iterations = linspace(1,400,N);\n",
+ "ea_nr=zeros(1,N); % appr error Newton-Raphson\n",
+ "ea_ms=zeros(1,N); % appr error Modified Secant\n",
+ "ea_fp=zeros(1,N); % appr error false point method\n",
+ "ea_bs=zeros(1,N); % appr error bisect method\n",
+ "for i=1:length(iterations)\n",
+ " [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,200,0,iterations(i));\n",
+ " [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));\n",
+ " [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));\n",
+ " [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));\n",
+ "end\n",
+ " \n",
+ "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n",
+ "legend('newton-raphson','mod-secant','false point','bisection')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ea_ms =\n",
+ "\n",
+ " Columns 1 through 6:\n",
+ "\n",
+ " 2.3382e+03 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n",
+ "\n",
+ " Columns 7 through 12:\n",
+ "\n",
+ " 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n",
+ "\n",
+ " Columns 13 through 18:\n",
+ "\n",
+ " 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14 1.9171e-14\n",
+ "\n",
+ " Columns 19 and 20:\n",
+ "\n",
+ " 1.9171e-14 1.9171e-14\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "ea_ms"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: called from\n",
+ " __line__ at line 120 column 16\n",
+ " line at line 56 column 8\n",
+ " __plt__>__plt2vv__ at line 500 column 10\n",
+ " __plt__>__plt2__ at line 246 column 14\n",
+ " __plt__ at line 133 column 15\n",
+ " semilogy at line 60 column 10\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "N=20;\n",
+ "f= @(x) x^10-1;\n",
+ "df=@(x) 10*x^9;\n",
+ "iterations = linspace(1,50,N);\n",
+ "ea_nr=zeros(1,N); % appr error Newton-Raphson\n",
+ "ea_ms=zeros(1,N); % appr error Modified Secant\n",
+ "ea_fp=zeros(1,N); % appr error false point method\n",
+ "ea_bs=zeros(1,N); % appr error bisect method\n",
+ "for i=1:length(iterations)\n",
+ " [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));\n",
+ " [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));\n",
+ " [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));\n",
+ " [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));\n",
+ "end\n",
+ " \n",
+ "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n",
+ "legend('newton-raphson','mod-secant','false point','bisection')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ea_bs =\n",
+ "\n",
+ " Columns 1 through 6:\n",
+ "\n",
+ " 9.5357e+03 -4.7554e-01 -2.1114e-01 6.0163e-02 -2.4387e-03 6.1052e-04\n",
+ "\n",
+ " Columns 7 through 12:\n",
+ "\n",
+ " 2.2891e-04 -9.5367e-06 2.3842e-06 8.9407e-07 -2.2352e-07 9.3132e-09\n",
+ "\n",
+ " Columns 13 through 18:\n",
+ "\n",
+ " -2.3283e-09 -8.7311e-10 3.6380e-11 -9.0949e-12 -3.4106e-12 8.5265e-13\n",
+ "\n",
+ " Columns 19 and 20:\n",
+ "\n",
+ " -3.5527e-14 8.8818e-15\n",
+ "\n",
+ "ans = 16.208\n"
+ ]
+ }
+ ],
+ "source": [
+ "ea_bs\n",
+ "newtraph(f,df,0.5,0,12)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 1.9683e+23\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "df(300)"
+ ]
+ },
+ {
+ "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_07/.lecture_07.md.swp b/lecture_07/.lecture_07.md.swp
new file mode 100644
index 0000000..0998c86
Binary files /dev/null and b/lecture_07/.lecture_07.md.swp differ
diff --git a/lecture_07/.newtraph.m.swp b/lecture_07/.newtraph.m.swp
new file mode 100644
index 0000000..9759dd2
Binary files /dev/null and b/lecture_07/.newtraph.m.swp differ
diff --git a/lecture_07/bisect.m b/lecture_07/bisect.m
new file mode 100644
index 0000000..9f696a0
--- /dev/null
+++ b/lecture_07/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{:});
diff --git a/lecture_07/car_payments.m b/lecture_07/car_payments.m
new file mode 100644
index 0000000..9d5b2a5
--- /dev/null
+++ b/lecture_07/car_payments.m
@@ -0,0 +1,17 @@
+function amount_left = car_payments(monthly_payment,price,apr,no_of_years,plot_bool)
+ interest_per_month = apr/12;
+ number_of_months = no_of_years*12;
+ principle=price;
+ P_vector=zeros(1,number_of_months);
+ for i = 1:number_of_months
+ principle=principle-monthly_payment;
+ principle=(1+interest_per_month)*principle;
+ P_vector(i)=principle;
+ end
+ amount_left=principle;
+ if plot_bool
+ plot([1:number_of_months]/12, P_vector)
+ xlabel('time (years)')
+ ylabel('principle amount left ($)')
+ end
+end
diff --git a/lecture_07/falsepos.m b/lecture_07/falsepos.m
new file mode 100644
index 0000000..d5575d5
--- /dev/null
+++ b/lecture_07/falsepos.m
@@ -0,0 +1,39 @@
+function [root,fx,ea,iter]=falsepos(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 - (func(xu)*(xl-xu))/(func(xl)-func(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_07/fzerosimp.m b/lecture_07/fzerosimp.m
new file mode 100644
index 0000000..05c7a9b
--- /dev/null
+++ b/lecture_07/fzerosimp.m
@@ -0,0 +1,41 @@
+function b = fzerosimp(xl,xu)
+a = xl; b = xu; fa = f(a); fb = f(b);
+c = a; fc = fa; d = b - c; e = d;
+while (1)
+ if fb == 0, break, end
+ if sign(fa) == sign(fb) %If needed, rearrange points
+ a = c; fa = fc; d = b - c; e = d;
+ end
+ if abs(fa) < abs(fb)
+ c = b; b = a; a = c;
+ fc = fb; fb = fa; fa = fc;
+ end
+ m = 0.5*(a - b); %Termination test and possible exit
+ tol = 2 * eps * max(abs(b), 1);
+ if abs(m) <= tol | fb == 0.
+ break
+ end
+ %Choose open methods or bisection
+ if abs(e) >= tol & abs(fc) > abs(fb)
+ s = fb/fc;
+ if a == c %Secant method
+ p = 2*m*s;
+ q = 1 - s;
+ else %Inverse quadratic interpolation
+ q = fc/fa; r = fb/fa;
+ p = s * (2*m*q * (q - r) - (b - c)*(r - 1));
+ q = (q - 1)*(r - 1)*(s - 1);
+ end
+ if p > 0, q = -q; else p = -p; end;
+ if 2*p < 3*m*q - abs(tol*q) & p < abs(0.5*e*q)
+ e = d; d = p/q;
+ else
+ d = m; e = m;
+ end
+ else %Bisection
+ d = m; e = m;
+ end
+ c = b; fc = fb;
+ if abs(d) > tol, b=b+d; else b=b-sign(b-a)*tol; end
+ fb = f(b);
+end
\ No newline at end of file
diff --git a/lecture_07/incsearch.m b/lecture_07/incsearch.m
new file mode 100644
index 0000000..bd82554
--- /dev/null
+++ b/lecture_07/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_07/lecture_07.ipynb b/lecture_07/lecture_07.ipynb
new file mode 100644
index 0000000..08d29c4
--- /dev/null
+++ b/lecture_07/lecture_07.ipynb
@@ -0,0 +1,1458 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "%plot --format svg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "setdefaults"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Roots: Open methods\n",
+ "## Newton-Raphson"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)\n",
+ "\n",
+ "$f'(x_{i})=\\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n",
+ "\n",
+ "Use Newton-Raphson to find solution when $e^{-x}=x$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.50000\n",
+ "error_approx = 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "f= @(x) exp(-x)-x;\n",
+ "df= @(x) -exp(-x)-1;\n",
+ "\n",
+ "x_i= 0;\n",
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.56631\n",
+ "error_approx = 0.11709\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.56714\n",
+ "error_approx = 0.0014673\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x_r = 0.56714\n",
+ "error_approx = 2.2106e-07\n"
+ ]
+ }
+ ],
+ "source": [
+ "x_r = x_i-f(x_i)/df(x_i)\n",
+ "error_approx = abs((x_r-x_i)/x_r)\n",
+ "x_i=x_r;"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s. \n",
+ "\n",
+ "$f(m)=\\sqrt{\\frac{gm}{c_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-v(t)$.\n",
+ "\n",
+ "to use the Newton-Raphson method, we need the derivative $\\frac{df}{dm}$\n",
+ "\n",
+ "$\\frac{df}{dm}=\\frac{1}{2}\\sqrt{\\frac{g}{mc_{d}}}\\tanh(\\sqrt{\\frac{gc_{d}}{m}}t)-\n",
+ "\\frac{g}{2m}\\mathrm{sech}^{2}(\\sqrt{\\frac{gc_{d}}{m}}t)$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "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",
+ "df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "root = 142.74\n",
+ "ea = 8.0930e-06\n",
+ "iter = 48\n"
+ ]
+ }
+ ],
+ "source": [
+ "[root,ea,iter]=newtraph(f_m,df_m,140,0.00001)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Secant Methods"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Not always able to evaluate the derivative. Approximation of derivative:\n",
+ "\n",
+ "$f'(x_{i})=\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{f'(x_{i})}$\n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})}{\\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=\n",
+ " x_{i}-\\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$\n",
+ " \n",
+ "What values should $x_{i}$ and $x_{i-1}$ take?\n",
+ "\n",
+ "To reduce arbitrary selection of variables, use the\n",
+ "\n",
+ "## Modified Secant method\n",
+ "\n",
+ "Change the x evaluations to a perturbation $\\delta$. \n",
+ "\n",
+ "$x_{i+1}=x_{i}-\\frac{f(x_{i})(\\delta x_{i})}{f(x_{i}+\\delta x_{i})-f(x_{i})}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "root = 142.74\n",
+ "ea = 3.0615e-07\n",
+ "iter = 7\n"
+ ]
+ }
+ ],
+ "source": [
+ "[root,ea,iter]=mod_secant(f_m,1,50,0.00001)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 1.1185e+04\r\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "car_payments(400,30000,0.05,5,1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Amt_numerical = 5467.0\n",
+ "ans = 3.9755e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "Amt_numerical=mod_secant(@(A) car_payments(A,700000,0.0875,30,0),1e-6,50,0.001)\n",
+ "car_payments(Amt_numerical,700000,0.0875,30,1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 1.9681e+06\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "Amt_numerical*12*30"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Amt = 566.14\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "% Amortization calculation\n",
+ "A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);\n",
+ "Amt=A(30000,0.05/12,5*12)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Matlab's function\n",
+ "\n",
+ "Matlab and Octave combine bracketing and open methods in the `fzero` function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m\n",
+ "\n",
+ " -- Function File: fzero (FUN, X0)\n",
+ " -- Function File: fzero (FUN, X0, OPTIONS)\n",
+ " -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)\n",
+ " Find a zero of a univariate function.\n",
+ "\n",
+ " FUN is a function handle, inline function, or string containing the\n",
+ " name of the function to evaluate.\n",
+ "\n",
+ " X0 should be a two-element vector specifying two points which\n",
+ " bracket a zero. In other words, there must be a change in sign of\n",
+ " the function between X0(1) and X0(2). More mathematically, the\n",
+ " following must hold\n",
+ "\n",
+ " sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0\n",
+ "\n",
+ " If X0 is a single scalar then several nearby and distant values are\n",
+ " probed in an attempt to obtain a valid bracketing. If this is not\n",
+ " successful, the function fails.\n",
+ "\n",
+ " OPTIONS is a structure specifying additional options. Currently,\n",
+ " 'fzero' recognizes these options: \"FunValCheck\", \"OutputFcn\",\n",
+ " \"TolX\", \"MaxIter\", \"MaxFunEvals\". For a description of these\n",
+ " options, see *note optimset: XREFoptimset.\n",
+ "\n",
+ " On exit, the function returns X, the approximate zero point and\n",
+ " FVAL, the function value thereof.\n",
+ "\n",
+ " INFO is an exit flag that can have these values:\n",
+ "\n",
+ " * 1 The algorithm converged to a solution.\n",
+ "\n",
+ " * 0 Maximum number of iterations or function evaluations has\n",
+ " been reached.\n",
+ "\n",
+ " * -1 The algorithm has been terminated from user output\n",
+ " function.\n",
+ "\n",
+ " * -5 The algorithm may have converged to a singular point.\n",
+ "\n",
+ " OUTPUT is a structure containing runtime information about the\n",
+ " 'fzero' algorithm. Fields in the structure are:\n",
+ "\n",
+ " * iterations Number of iterations through loop.\n",
+ "\n",
+ " * nfev Number of function evaluations.\n",
+ "\n",
+ " * bracketx A two-element vector with the final bracketing of the\n",
+ " zero along the x-axis.\n",
+ "\n",
+ " * brackety A two-element vector with the final bracketing of the\n",
+ " zero along the y-axis.\n",
+ "\n",
+ " See also: optimset, fsolve.\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 fzero"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 563.79\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "fzero(@(A) car_payments(A,30000,0.05,5,0),500)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Comparison of Solvers\n",
+ "\n",
+ "It's helpful to compare to the convergence of different routines to see how quickly you find a solution. \n",
+ "\n",
+ "Comparing the freefall example\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: called from\n",
+ " __line__ at line 120 column 16\n",
+ " line at line 56 column 8\n",
+ " __plt__>__plt2vv__ at line 500 column 10\n",
+ " __plt__>__plt2__ at line 246 column 14\n",
+ " __plt__ at line 133 column 15\n",
+ " semilogy at line 60 column 10\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "N=20;\n",
+ "iterations = linspace(1,400,N);\n",
+ "ea_nr=zeros(1,N); % appr error Newton-Raphson\n",
+ "ea_ms=zeros(1,N); % appr error Modified Secant\n",
+ "ea_fp=zeros(1,N); % appr error false point method\n",
+ "ea_bs=zeros(1,N); % appr error bisect method\n",
+ "for i=1:length(iterations)\n",
+ " [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,300,0,iterations(i));\n",
+ " [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));\n",
+ " [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));\n",
+ " [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));\n",
+ "end\n",
+ "\n",
+ "setdefaults\n",
+ "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n",
+ "legend('newton-raphson','mod-secant','false point','bisection')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ea_nr =\n",
+ "\n",
+ " Columns 1 through 8:\n",
+ "\n",
+ " 6.36591 0.06436 0.00052 0.00000 0.00000 0.00000 0.00000 0.00000\n",
+ "\n",
+ " Columns 9 through 16:\n",
+ "\n",
+ " 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000\n",
+ "\n",
+ " Columns 17 through 20:\n",
+ "\n",
+ " 0.00000 0.00000 0.00000 0.00000\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "ea_nr"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: called from\n",
+ " __line__ at line 120 column 16\n",
+ " line at line 56 column 8\n",
+ " __plt__>__plt2vv__ at line 500 column 10\n",
+ " __plt__>__plt2__ at line 246 column 14\n",
+ " __plt__ at line 133 column 15\n",
+ " semilogy at line 60 column 10\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n",
+ "warning: axis: omitting non-positive data in log plot\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "N=20;\n",
+ "f= @(x) x^10-1;\n",
+ "df=@(x) 10*x^9;\n",
+ "iterations = linspace(1,50,N);\n",
+ "ea_nr=zeros(1,N); % appr error Newton-Raphson\n",
+ "ea_ms=zeros(1,N); % appr error Modified Secant\n",
+ "ea_fp=zeros(1,N); % appr error false point method\n",
+ "ea_bs=zeros(1,N); % appr error bisect method\n",
+ "for i=1:length(iterations)\n",
+ " [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));\n",
+ " [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));\n",
+ " [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));\n",
+ " [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));\n",
+ "end\n",
+ " \n",
+ "semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))\n",
+ "legend('newton-raphson','mod-secant','false point','bisection')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ea_nr =\n",
+ "\n",
+ " Columns 1 through 7:\n",
+ "\n",
+ " 99.03195 11.11111 11.11111 11.11111 11.11111 11.11111 11.11111\n",
+ "\n",
+ " Columns 8 through 14:\n",
+ "\n",
+ " 11.11111 11.11111 11.11111 11.11109 11.11052 11.10624 10.99684\n",
+ "\n",
+ " Columns 15 through 20:\n",
+ "\n",
+ " 8.76956 2.12993 0.00000 0.00000 0.00000 0.00000\n",
+ "\n",
+ "ans = 16.208\n"
+ ]
+ }
+ ],
+ "source": [
+ "ea_nr\n",
+ "newtraph(f,df,0.5,0,12)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 1.9683e+23\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "df(300)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f =\n",
+ "\n",
+ "@(x) tan (x) - (x - 1) .^ 2\n",
+ "\n",
+ "ans = 0.37375\n"
+ ]
+ }
+ ],
+ "source": [
+ "% our class function\n",
+ "f= @(x) tan(x)-(x-1).^2\n",
+ "mod_secant(f,1e-3,1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = -3.5577e-13\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "f(ans)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 0.39218\n",
+ "ans = 0.39219\n"
+ ]
+ }
+ ],
+ "source": [
+ "tan(0.37375)\n",
+ "(0.37375-1)^2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans =\n",
+ "\n",
+ " Columns 1 through 8:\n",
+ "\n",
+ " -1.0000 1.5574 -3.1850 -4.1425 -7.8422 -19.3805 -25.2910 -35.1286\n",
+ "\n",
+ " Columns 9 through 11:\n",
+ "\n",
+ " -55.7997 -64.4523 -80.3516\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "f([0:10])"
+ ]
+ },
+ {
+ "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_07/lecture_07.md b/lecture_07/lecture_07.md
new file mode 100644
index 0000000..3aacefb
--- /dev/null
+++ b/lecture_07/lecture_07.md
@@ -0,0 +1,448 @@
+
+
+```octave
+%plot --format svg
+```
+
+
+```octave
+setdefaults
+```
+
+# Roots: Open methods
+## Newton-Raphson
+
+First-order approximation for the location of the root (i.e. assume the slope at the given point is constant, what is the solution when f(x)=0)
+
+$f'(x_{i})=\frac{f(x_{i})-0}{x_{i}-x_{i+1}}$
+
+$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$
+
+Use Newton-Raphson to find solution when $e^{-x}=x$
+
+
+```octave
+f= @(x) exp(-x)-x;
+df= @(x) -exp(-x)-1;
+
+x_i= 0;
+x_r = x_i-f(x_i)/df(x_i)
+error_approx = abs((x_r-x_i)/x_r)
+x_i=x_r;
+
+```
+
+ x_r = 0.50000
+ error_approx = 1
+
+
+
+```octave
+x_r = x_i-f(x_i)/df(x_i)
+error_approx = abs((x_r-x_i)/x_r)
+x_i=x_r;
+```
+
+ x_r = 0.56631
+ error_approx = 0.11709
+
+
+
+```octave
+x_r = x_i-f(x_i)/df(x_i)
+error_approx = abs((x_r-x_i)/x_r)
+x_i=x_r;
+```
+
+ x_r = 0.56714
+ error_approx = 0.0014673
+
+
+
+```octave
+x_r = x_i-f(x_i)/df(x_i)
+error_approx = abs((x_r-x_i)/x_r)
+x_i=x_r;
+```
+
+ x_r = 0.56714
+ error_approx = 2.2106e-07
+
+
+In the bungee jumper example, we created a function f(m) that when f(m)=0, then the mass had been chosen such that at t=4 s, the velocity is 36 m/s.
+
+$f(m)=\sqrt{\frac{gm}{c_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-v(t)$.
+
+to use the Newton-Raphson method, we need the derivative $\frac{df}{dm}$
+
+$\frac{df}{dm}=\frac{1}{2}\sqrt{\frac{g}{mc_{d}}}\tanh(\sqrt{\frac{gc_{d}}{m}}t)-
+\frac{g}{2m}\mathrm{sech}^{2}(\sqrt{\frac{gc_{d}}{m}}t)$
+
+
+```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
+df_m = @(m) 1/2*sqrt(g./m/c_d).*tanh(sqrt(g*c_d./m)*t)-g/2./m*sech(sqrt(g*c_d./m)*t).^2;
+```
+
+
+```octave
+[root,ea,iter]=newtraph(f_m,df_m,140,0.00001)
+```
+
+ root = 142.74
+ ea = 8.0930e-06
+ iter = 48
+
+
+## Secant Methods
+
+Not always able to evaluate the derivative. Approximation of derivative:
+
+$f'(x_{i})=\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}$
+
+$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$
+
+$x_{i+1}=x_{i}-\frac{f(x_{i})}{\frac{f(x_{i-1})-f(x_{i})}{x_{i-1}-x_{i}}}=
+ x_{i}-\frac{f(x_{i})(x_{i-1}-x_{i})}{f(x_{i-1})-f(x_{i})}$
+
+What values should $x_{i}$ and $x_{i-1}$ take?
+
+To reduce arbitrary selection of variables, use the
+
+## Modified Secant method
+
+Change the x evaluations to a perturbation $\delta$.
+
+$x_{i+1}=x_{i}-\frac{f(x_{i})(\delta x_{i})}{f(x_{i}+\delta x_{i})-f(x_{i})}$
+
+
+```octave
+[root,ea,iter]=mod_secant(f_m,1,50,0.00001)
+```
+
+ root = 142.74
+ ea = 3.0615e-07
+ iter = 7
+
+
+
+```octave
+car_payments(400,30000,0.05,5,1)
+```
+
+ ans = 1.1185e+04
+
+
+
+![svg](lecture_07_files/lecture_07_15_1.svg)
+
+
+
+```octave
+Amt_numerical=mod_secant(@(A) car_payments(A,700000,0.0875,30,0),1e-6,50,0.001)
+car_payments(Amt_numerical,700000,0.0875,30,1)
+```
+
+ Amt_numerical = 5467.0
+ ans = 3.9755e-04
+
+
+
+![svg](lecture_07_files/lecture_07_16_1.svg)
+
+
+
+```octave
+Amt_numerical*12*30
+```
+
+ ans = 1.9681e+06
+
+
+Amortization calculation makes the same calculation for the monthly payment amount, A, paying off the principle amount, P, over n pay periods with monthly interest rate, r.
+
+
+```octave
+% Amortization calculation
+A = @(P,r,n) P*(r*(1+r)^n)./((1+r)^n-1);
+Amt=A(30000,0.05/12,5*12)
+```
+
+ Amt = 566.14
+
+
+## Matlab's function
+
+Matlab and Octave combine bracketing and open methods in the `fzero` function.
+
+
+```octave
+help fzero
+```
+
+ 'fzero' is a function from the file /usr/share/octave/4.0.0/m/optimization/fzero.m
+
+ -- Function File: fzero (FUN, X0)
+ -- Function File: fzero (FUN, X0, OPTIONS)
+ -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (...)
+ Find a zero of a univariate function.
+
+ FUN is a function handle, inline function, or string containing the
+ name of the function to evaluate.
+
+ X0 should be a two-element vector specifying two points which
+ bracket a zero. In other words, there must be a change in sign of
+ the function between X0(1) and X0(2). More mathematically, the
+ following must hold
+
+ sign (FUN(X0(1))) * sign (FUN(X0(2))) <= 0
+
+ If X0 is a single scalar then several nearby and distant values are
+ probed in an attempt to obtain a valid bracketing. If this is not
+ successful, the function fails.
+
+ OPTIONS is a structure specifying additional options. Currently,
+ 'fzero' recognizes these options: "FunValCheck", "OutputFcn",
+ "TolX", "MaxIter", "MaxFunEvals". For a description of these
+ options, see *note optimset: XREFoptimset.
+
+ On exit, the function returns X, the approximate zero point and
+ FVAL, the function value thereof.
+
+ INFO is an exit flag that can have these values:
+
+ * 1 The algorithm converged to a solution.
+
+ * 0 Maximum number of iterations or function evaluations has
+ been reached.
+
+ * -1 The algorithm has been terminated from user output
+ function.
+
+ * -5 The algorithm may have converged to a singular point.
+
+ OUTPUT is a structure containing runtime information about the
+ 'fzero' algorithm. Fields in the structure are:
+
+ * iterations Number of iterations through loop.
+
+ * nfev Number of function evaluations.
+
+ * bracketx A two-element vector with the final bracketing of the
+ zero along the x-axis.
+
+ * brackety A two-element vector with the final bracketing of the
+ zero along the y-axis.
+
+ See also: optimset, fsolve.
+
+ 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
+fzero(@(A) car_payments(A,30000,0.05,5,0),500)
+```
+
+ ans = 563.79
+
+
+## Comparison of Solvers
+
+It's helpful to compare to the convergence of different routines to see how quickly you find a solution.
+
+Comparing the freefall example
+
+
+
+```octave
+N=20;
+iterations = linspace(1,400,N);
+ea_nr=zeros(1,N); % appr error Newton-Raphson
+ea_ms=zeros(1,N); % appr error Modified Secant
+ea_fp=zeros(1,N); % appr error false point method
+ea_bs=zeros(1,N); % appr error bisect method
+for i=1:length(iterations)
+ [root_nr,ea_nr(i),iter_nr]=newtraph(f_m,df_m,300,0,iterations(i));
+ [root_ms,ea_ms(i),iter_ms]=mod_secant(f_m,1e-6,300,0,iterations(i));
+ [root_fp,ea_fp(i),iter_fp]=falsepos(f_m,1,300,0,iterations(i));
+ [root_bs,ea_bs(i),iter_bs]=bisect(f_m,1,300,0,iterations(i));
+end
+
+setdefaults
+semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))
+legend('newton-raphson','mod-secant','false point','bisection')
+```
+
+ warning: axis: omitting non-positive data in log plot
+ warning: called from
+ __line__ at line 120 column 16
+ line at line 56 column 8
+ __plt__>__plt2vv__ at line 500 column 10
+ __plt__>__plt2__ at line 246 column 14
+ __plt__ at line 133 column 15
+ semilogy at line 60 column 10
+ warning: axis: omitting non-positive data in log plot
+ warning: axis: omitting non-positive data in log plot
+ warning: axis: omitting non-positive data in log plot
+
+
+
+![svg](lecture_07_files/lecture_07_24_1.svg)
+
+
+
+```octave
+ea_nr
+```
+
+ ea_nr =
+
+ Columns 1 through 8:
+
+ 6.36591 0.06436 0.00052 0.00000 0.00000 0.00000 0.00000 0.00000
+
+ Columns 9 through 16:
+
+ 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
+
+ Columns 17 through 20:
+
+ 0.00000 0.00000 0.00000 0.00000
+
+
+
+
+```octave
+N=20;
+f= @(x) x^10-1;
+df=@(x) 10*x^9;
+iterations = linspace(1,50,N);
+ea_nr=zeros(1,N); % appr error Newton-Raphson
+ea_ms=zeros(1,N); % appr error Modified Secant
+ea_fp=zeros(1,N); % appr error false point method
+ea_bs=zeros(1,N); % appr error bisect method
+for i=1:length(iterations)
+ [root_nr,ea_nr(i),iter_nr]=newtraph(f,df,0.5,0,iterations(i));
+ [root_ms,ea_ms(i),iter_ms]=mod_secant(f,1e-6,0.5,0,iterations(i));
+ [root_fp,ea_fp(i),iter_fp]=falsepos(f,0,5,0,iterations(i));
+ [root_bs,ea_bs(i),iter_bs]=bisect(f,0,5,0,iterations(i));
+end
+
+semilogy(iterations,abs(ea_nr),iterations,abs(ea_ms),iterations,abs(ea_fp),iterations,abs(ea_bs))
+legend('newton-raphson','mod-secant','false point','bisection')
+```
+
+ warning: axis: omitting non-positive data in log plot
+ warning: called from
+ __line__ at line 120 column 16
+ line at line 56 column 8
+ __plt__>__plt2vv__ at line 500 column 10
+ __plt__>__plt2__ at line 246 column 14
+ __plt__ at line 133 column 15
+ semilogy at line 60 column 10
+ warning: axis: omitting non-positive data in log plot
+ warning: axis: omitting non-positive data in log plot
+ warning: axis: omitting non-positive data in log plot
+
+
+
+![svg](lecture_07_files/lecture_07_26_1.svg)
+
+
+
+```octave
+ea_nr
+newtraph(f,df,0.5,0,12)
+```
+
+ ea_nr =
+
+ Columns 1 through 7:
+
+ 99.03195 11.11111 11.11111 11.11111 11.11111 11.11111 11.11111
+
+ Columns 8 through 14:
+
+ 11.11111 11.11111 11.11111 11.11109 11.11052 11.10624 10.99684
+
+ Columns 15 through 20:
+
+ 8.76956 2.12993 0.00000 0.00000 0.00000 0.00000
+
+ ans = 16.208
+
+
+
+```octave
+df(300)
+```
+
+ ans = 1.9683e+23
+
+
+
+```octave
+% our class function
+f= @(x) tan(x)-(x-1).^2
+mod_secant(f,1e-3,1)
+```
+
+ f =
+
+ @(x) tan (x) - (x - 1) .^ 2
+
+ ans = 0.37375
+
+
+
+```octave
+f(ans)
+```
+
+ ans = -3.5577e-13
+
+
+
+```octave
+tan(0.37375)
+(0.37375-1)^2
+```
+
+ ans = 0.39218
+ ans = 0.39219
+
+
+
+```octave
+f([0:10])
+```
+
+ ans =
+
+ Columns 1 through 8:
+
+ -1.0000 1.5574 -3.1850 -4.1425 -7.8422 -19.3805 -25.2910 -35.1286
+
+ Columns 9 through 11:
+
+ -55.7997 -64.4523 -80.3516
+
+
+
+
+```octave
+
+```
diff --git a/lecture_07/lecture_07.pdf b/lecture_07/lecture_07.pdf
new file mode 100644
index 0000000..70d8fc2
Binary files /dev/null and b/lecture_07/lecture_07.pdf differ
diff --git a/lecture_07/lecture_07_files/lecture_07_14_1.svg b/lecture_07/lecture_07_files/lecture_07_14_1.svg
new file mode 100644
index 0000000..9d54798
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_14_1.svg
@@ -0,0 +1,146 @@
+
\ No newline at end of file
diff --git a/lecture_07/lecture_07_files/lecture_07_15_1.svg b/lecture_07/lecture_07_files/lecture_07_15_1.svg
new file mode 100644
index 0000000..903c445
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_15_1.svg
@@ -0,0 +1,131 @@
+
\ No newline at end of file
diff --git a/lecture_07/lecture_07_files/lecture_07_16_1.svg b/lecture_07/lecture_07_files/lecture_07_16_1.svg
new file mode 100644
index 0000000..a3a2125
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_16_1.svg
@@ -0,0 +1,151 @@
+
\ No newline at end of file
diff --git a/lecture_07/lecture_07_files/lecture_07_22_1.svg b/lecture_07/lecture_07_files/lecture_07_22_1.svg
new file mode 100644
index 0000000..502c4c4
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_22_1.svg
@@ -0,0 +1,197 @@
+
\ No newline at end of file
diff --git a/lecture_07/lecture_07_files/lecture_07_24_1.svg b/lecture_07/lecture_07_files/lecture_07_24_1.svg
new file mode 100644
index 0000000..b511b10
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_24_1.svg
@@ -0,0 +1,197 @@
+
\ No newline at end of file
diff --git a/lecture_07/lecture_07_files/lecture_07_26_1.svg b/lecture_07/lecture_07_files/lecture_07_26_1.svg
new file mode 100644
index 0000000..a8b614c
--- /dev/null
+++ b/lecture_07/lecture_07_files/lecture_07_26_1.svg
@@ -0,0 +1,182 @@
+
\ No newline at end of file
diff --git a/lecture_07/mod_secant.m b/lecture_07/mod_secant.m
new file mode 100644
index 0000000..a3caa10
--- /dev/null
+++ b/lecture_07/mod_secant.m
@@ -0,0 +1,31 @@
+function [root,ea,iter]=mod_secant(func,dx,xr,es,maxit,varargin)
+% newtraph: Modified secant root location zeroes
+% [root,ea,iter]=mod_secant(func,dfunc,xr,es,maxit,p1,p2,...):
+% uses modified secant method to find the root of func
+% input:
+% func = name of function
+% dx = perturbation fraction
+% xr = initial guess
+% es = desired relative error (default = 0.0001%)
+% maxit = maximum allowable iterations (default = 50)
+% p1,p2,... = additional parameters used by function
+% output:
+% root = real root
+% ea = approximate relative error (%)
+% iter = number of iterations
+if nargin<3,error('at least 3 input arguments required'),end
+if nargin<4 || isempty(es),es=0.0001;end
+if nargin<5 || isempty(maxit),maxit=50;end
+iter = 0;
+while (1)
+ xrold = xr;
+ dfunc=(func(xr+dx)-func(xr))./dx;
+ xr = xr - func(xr)/dfunc;
+ iter = iter + 1;
+ if xr ~= 0
+ ea = abs((xr - xrold)/xr) * 100;
+ end
+ if ea <= es || iter >= maxit, break, end
+end
+root = xr;
+
diff --git a/lecture_07/newtraph.m b/lecture_07/newtraph.m
new file mode 100644
index 0000000..94ca667
--- /dev/null
+++ b/lecture_07/newtraph.m
@@ -0,0 +1,29 @@
+function [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,varargin)
+% newtraph: Newton-Raphson root location zeroes
+% [root,ea,iter]=newtraph(func,dfunc,xr,es,maxit,p1,p2,...):
+% uses Newton-Raphson method to find the root of func
+% input:
+% func = name of function
+% dfunc = name of derivative of function
+% xr = initial guess
+% es = desired relative error (default = 0.0001%)
+% maxit = maximum allowable iterations (default = 50)
+% p1,p2,... = additional parameters used by function
+% output:
+% root = real root
+% ea = approximate relative error (%)
+% iter = number of iterations
+if nargin<3,error('at least 3 input arguments required'),end
+if nargin<4 || isempty(es),es=0.0001;end
+if nargin<5 || isempty(maxit),maxit=50;end
+iter = 0;
+while (1)
+ xrold = xr;
+ xr = xr - func(xr)/dfunc(xr);
+ iter = iter + 1;
+ if xr ~= 0
+ ea = abs((xr - xrold)/xr) * 100;
+ end
+ if ea <= es || iter >= maxit, break, end
+end
+root = xr;
diff --git a/lecture_07/octave-workspace b/lecture_07/octave-workspace
new file mode 100644
index 0000000..a214fe9
Binary files /dev/null and b/lecture_07/octave-workspace differ
diff --git a/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb b/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb
new file mode 100644
index 0000000..2fd6442
--- /dev/null
+++ b/lecture_08/.ipynb_checkpoints/lecture_08-checkpoint.ipynb
@@ -0,0 +1,6 @@
+{
+ "cells": [],
+ "metadata": {},
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/lecture_08/Auchain_model.gif b/lecture_08/Auchain_model.gif
new file mode 100644
index 0000000..2f8c78c
Binary files /dev/null and b/lecture_08/Auchain_model.gif differ
diff --git a/lecture_08/Auchain_model.png b/lecture_08/Auchain_model.png
new file mode 100644
index 0000000..dce9cd7
Binary files /dev/null and b/lecture_08/Auchain_model.png differ
diff --git a/lecture_08/au_chain.jpg b/lecture_08/au_chain.jpg
new file mode 100644
index 0000000..492fee8
Binary files /dev/null and b/lecture_08/au_chain.jpg differ
diff --git a/lecture_08/goldenratio.png b/lecture_08/goldenratio.png
new file mode 100644
index 0000000..9493c8c
Binary files /dev/null and b/lecture_08/goldenratio.png differ
diff --git a/lecture_08/goldmin.m b/lecture_08/goldmin.m
new file mode 100644
index 0000000..fb4ce0b
--- /dev/null
+++ b/lecture_08/goldmin.m
@@ -0,0 +1,36 @@
+function [x,fx,ea,iter]=goldmin(f,xl,xu,es,maxit,varargin)
+% goldmin: minimization golden section search
+% [x,fx,ea,iter]=goldmin(f,xl,xu,es,maxit,p1,p2,...):
+% uses golden section search to find the minimum of f
+% input:
+% f = 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 f
+% output:
+% x = location of minimum
+% fx = minimum function value
+% ea = approximate relative error (%)
+% iter = number of iterations
+if nargin<3,error('at least 3 input arguments required'),end
+if nargin<4|isempty(es), es=0.0001;end
+if nargin<5|isempty(maxit), maxit=50;end
+phi=(1+sqrt(5))/2;
+iter=0;
+while(1)
+ d = (phi-1)*(xu - xl);
+ x1 = xl + d;
+ x2 = xu - d;
+ if f(x1,varargin{:}) < f(x2,varargin{:})
+ xopt = x1;
+ xl = x2;
+ else
+ xopt = x2;
+ xu = x1;
+ end
+ iter=iter+1;
+ if xopt~=0, ea = (2 - phi) * abs((xu - xl) / xopt) * 100;end
+ if ea <= es | iter >= maxit,break,end
+end
+x=xopt;fx=f(xopt,varargin{:});
diff --git a/lecture_08/lecture_08.ipynb b/lecture_08/lecture_08.ipynb
new file mode 100644
index 0000000..32b973c
--- /dev/null
+++ b/lecture_08/lecture_08.ipynb
@@ -0,0 +1,2762 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "function h = parabola(x)\n",
+ " y=1;\n",
+ " h=sum(x.^2+y.^2-1);\n",
+ "end\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 0\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "fzero(@(x) parabola(x),1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "%plot --format svg"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Optimization\n",
+ "\n",
+ "Many problems involve finding a minimum or maximum based on given constraints. Engineers and scientists typically use energy balance equations to find the conditions of minimum energy, but this value may never go to 0 and the actual value of energy may not be of interest. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The Lennard-Jones potential is commonly used to model interatomic bonding. \n",
+ "\n",
+ "$E_{LJ}(x)=4\\epsilon \\left(\\left(\\frac{\\sigma}{x}\\right)^{12}-\\left(\\frac{\\sigma}{x}\\right)^{6}\\right)$\n",
+ "\n",
+ "Considering a 1-D gold chain, we can calculate the bond length, $x_{b}$, with no force applied to the chain and even for tension, F. This will allow us to calculate the nonlinear spring constant of a 1-D gold chain. \n",
+ "\n",
+ "![TEM image of Gold chain](au_chain.jpg)\n",
+ "\n",
+ "Computational Tools to Study and Predict the Long-Term Stability of Nanowires.\n",
+ "By Martin E. Zoloff Michoff, Patricio VĂ©lez, Sergio A. Dassie and Ezequiel P. M. Leiva \n",
+ "\n",
+ "![Model of Gold chain, from molecular dynamics simulation](Auchain_model.png)\n",
+ "\n",
+ "[Single atom gold chain mechanics](http://www.uam.es/personal_pdi/ciencias/agrait/)\n",
+ "\n",
+ "### First, let's find the minimum energy $\\min(E_{LJ}(x))$\n",
+ "\n",
+ "## Brute force"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "setdefaults\n",
+ "epsilon = 0.039; % kcal/mol\n",
+ "sigma = 2.934; % Angstrom\n",
+ "x=linspace(2.8,6,200); % bond length in Angstrom\n",
+ "\n",
+ "Ex = lennard_jones(x,sigma,epsilon);\n",
+ "\n",
+ "[Emin,imin]=min(Ex);\n",
+ "\n",
+ "plot(x,Ex,x(imin),Emin,'o')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ans = 3.2824\n",
+ "ans = 3.2985\n",
+ "ans = 3.3146\n"
+ ]
+ }
+ ],
+ "source": [
+ "x(imin-1)\n",
+ "x(imin)\n",
+ "x(imin+1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Golden Search Algorithm\n",
+ "\n",
+ "We can't just look for a sign change for the problem (unless we can take a derivative) so we need a new approach to determine whether we have a maximum between the two bounds.\n",
+ "\n",
+ "Rather than using the midpoint of initial bounds, here the problem is more difficult. We need to compare the values of 4 function evaluations. The golden search uses the golden ratio to determine two interior points. \n",
+ "\n",
+ "![golden ratio](goldenratio.png)\n",
+ "\n",
+ "Start with bounds of 2.5 and 6 Angstrom. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "current_min = -0.019959\r\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "% define Au atomic potential\n",
+ "epsilon = 0.039; % kcal/mol\n",
+ "sigma = 2.934; % Angstrom\n",
+ "Au_x= @(x) lennard_jones(x,sigma,epsilon);\n",
+ "\n",
+ "% calculate golden ratio\n",
+ "phi = 1/2+sqrt(5)/2;\n",
+ "% set initial limits\n",
+ "x_l=2.8; \n",
+ "x_u=6; \n",
+ "\n",
+ "% Iteration #1\n",
+ "d=(phi-1)*(x_u-x_l);\n",
+ "\n",
+ "x1=x_l+d; % define point 1\n",
+ "x2=x_u-d; % define point 2\n",
+ "\n",
+ "\n",
+ "% evaluate Au_x(x1) and Au_x(x2)\n",
+ "\n",
+ "f1=Au_x(x1);\n",
+ "f2=Au_x(x2);\n",
+ "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n",
+ "hold on;\n",
+ "\n",
+ "if f2\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",
+ "\n",
+ "\n",
+ "\n",
+ "\t\n",
+ "\t\t\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.06\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.08\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t2.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t6\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 \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_5a\n",
+ "\n",
+ "\t \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_6a\n",
+ "\n",
+ "\t\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "% Iteration #2\n",
+ "d=(phi-1)*(x_u-x_l);\n",
+ "\n",
+ "x1=x_l+d; % define point 1\n",
+ "x2=x_u-d; % define point 2\n",
+ "\n",
+ "% evaluate Au_x(x1) and Au_x(x2)\n",
+ "\n",
+ "f1=Au_x(x1);\n",
+ "f2=Au_x(x2);\n",
+ "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n",
+ "hold on;\n",
+ "\n",
+ "if f2\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-0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.06\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.08\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t2.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t6\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 \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_5a\n",
+ "\n",
+ "\t \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_6a\n",
+ "\n",
+ "\t\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "% Iteration #3\n",
+ "d=(phi-1)*(x_u-x_l);\n",
+ "\n",
+ "x1=x_l+d; % define point 1\n",
+ "x2=x_u-d; % define point 2\n",
+ "\n",
+ "% evaluate Au_x(x1) and Au_x(x2)\n",
+ "\n",
+ "f1=Au_x(x1);\n",
+ "f2=Au_x(x2);\n",
+ "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n",
+ "hold on;\n",
+ "\n",
+ "if f2\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-0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.06\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.08\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t2.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t6\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 \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_5a\n",
+ "\n",
+ "\t \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_6a\n",
+ "\n",
+ "\t\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "% Iteration #3\n",
+ "d=(phi-1)*(x_u-x_l);\n",
+ "\n",
+ "x1=x_l+d; % define point 1\n",
+ "x2=x_u-d; % define point 2\n",
+ "\n",
+ "% evaluate Au_x(x1) and Au_x(x2)\n",
+ "\n",
+ "f1=Au_x(x1);\n",
+ "f2=Au_x(x2);\n",
+ "plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')\n",
+ "hold on;\n",
+ "\n",
+ "if f2\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-0.06\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t-0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.02\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.04\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.06\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t0.08\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t2.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t3.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t4.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t5.5\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\t\t\n",
+ "\t\t6\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",
+ "\tgnuplot_plot_3a\n",
+ "\n",
+ "\t \n",
+ "\t\n",
+ "\t\n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_4a\n",
+ "\n",
+ "\t \n",
+ "\t\n",
+ "\n",
+ "\t\n",
+ "\tgnuplot_plot_5a\n",
+ "\n",
+ "\t\n",
+ "\t\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "% define Au atomic potential\n",
+ "epsilon = 0.039; % kcal/mol\n",
+ "sigma = 2.934; % Angstrom\n",
+ "Au_x= @(x) lennard_jones(x,sigma,epsilon);\n",
+ "\n",
+ "% set initial limits\n",
+ "x_l=2.8; \n",
+ "x_u=3.5; \n",
+ "\n",
+ "% Iteration #1\n",
+ "x1=x_l;\n",
+ "x2=mean([x_l,x_u]);\n",
+ "x3=x_u;\n",
+ "\n",
+ "% evaluate Au_x(x1), Au_x(x2) and Au_x(x3)\n",
+ " \n",
+ "f1=Au_x(x1);\n",
+ "f2=Au_x(x2);\n",
+ "f3=Au_x(x3);\n",
+ "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n",
+ "x_fit = linspace(x1,x3,20);\n",
+ "y_fit = polyval(p,x_fit);\n",
+ "\n",
+ "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n",
+ "hold on\n",
+ "if f2x2\n",
+ " plot(x4,f4,'*',[x1,x2],[f1,f2])\n",
+ " x1=x2;\n",
+ " f1=f2;\n",
+ " else\n",
+ " plot(x4,f4,'*',[x3,x2],[f3,f2])\n",
+ " x3=x2;\n",
+ " f3=f2;\n",
+ " end\n",
+ " x2=x4; f2=f4;\n",
+ "else\n",
+ " error('no minimum in bracket')\n",
+ "end\n",
+ "hold off"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n",
+ "x_fit = linspace(x1,x3,20);\n",
+ "y_fit = polyval(p,x_fit);\n",
+ "\n",
+ "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n",
+ "hold on\n",
+ "if f2x2\n",
+ " plot(x4,f4,'*',[x1,x2],[f1,f2])\n",
+ " x1=x2;\n",
+ " f1=f2;\n",
+ " else\n",
+ " plot(x4,f4,'*',[x3,x2],[f3,f2])\n",
+ " x3=x2;\n",
+ " f3=f2;\n",
+ " end\n",
+ " x2=x4; f2=f4;\n",
+ "else\n",
+ " error('no minimum in bracket')\n",
+ "end\n",
+ "hold off\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p = polyfit([x1,x2,x3],[f1,f2,f3],2);\n",
+ "x_fit = linspace(x1,x3,20);\n",
+ "y_fit = polyval(p,x_fit);\n",
+ "\n",
+ "plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')\n",
+ "hold on\n",
+ "if f2x2\n",
+ " plot(x4,f4,'*',[x1,x2],[f1,f2])\n",
+ " x1=x2;\n",
+ " f1=f2;\n",
+ " else\n",
+ " plot(x4,f4,'*',[x3,x2],[f3,f2])\n",
+ " x3=x2;\n",
+ " f3=f2;\n",
+ " end\n",
+ " x2=x4; f2=f4;\n",
+ "else\n",
+ " error('no minimum in bracket')\n",
+ "end\n",
+ "hold off\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Parabolic interpolation does not converge in many scenarios even though it it a bracketing method. Instead, functions like `fminbnd` in Matlab and Octave use a combination of the two (Golden Ratio and Parabolic)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Using the solutions to minimization for the nonlinear spring constant\n",
+ "\n",
+ "Now, we have two routines to find minimums of a univariate function (Golden Ratio and Parabolic). Let's use these to solve for the minimum energy given a range of applied forces to the single atom gold chain\n",
+ "\n",
+ "$E_{total}(\\Delta x) = E_{LJ}(x_{min}+\\Delta x) - F \\cdot \\Delta x$\n",
+ "\n",
+ "$1 aJ = 10^{-18} J = 1~nN* 1~nm = 10^{-9}N * 10^{-9} m$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "warning: Matlab-style short-circuit operation performed for operator |\n",
+ "warning: called from\n",
+ " goldmin at line 17 column 1\n",
+ "warning: Matlab-style short-circuit operation performed for operator |\n",
+ "warning: Matlab-style short-circuit operation performed for operator |\n",
+ "xmin = 0.32933\n",
+ "Emin = -2.7096e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "epsilon = 0.039; % kcal/mol\n",
+ "epsilon = epsilon*6.9477e-21; % J/atom\n",
+ "epsilon = epsilon*1e18; % aJ/J\n",
+ "% final units for epsilon are aJ\n",
+ "\n",
+ "sigma = 2.934; % Angstrom\n",
+ "sigma = sigma*0.10; % nm/Angstrom\n",
+ "x=linspace(2.8,6,200)*0.10; % bond length in um\n",
+ "\n",
+ "Ex = lennard_jones(x,sigma,epsilon);\n",
+ "\n",
+ "%[Emin,imin]=min(Ex);\n",
+ "\n",
+ "[xmin,Emin] = goldmin(@(x) lennard_jones(x,sigma,epsilon),0.28,0.6)\n",
+ "\n",
+ "plot(x,Ex,xmin,Emin,'o')\n",
+ "ylabel('Lennard Jones Potential (aJ/atom)')\n",
+ "xlabel('bond length (nm)')\n",
+ "\n",
+ "Etotal = @(dx,F) lennard_jones(xmin+dx,sigma,epsilon)-F.*dx;\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "N=50;\n",
+ "warning('off')\n",
+ "dx = zeros(1,N); % [in nm]\n",
+ "F_applied=linspace(0,0.0022,N); % [in nN]\n",
+ "for i=1:N\n",
+ " optmin=goldmin(@(dx) Etotal(dx,F_applied(i)),-0.001,0.035);\n",
+ " dx(i)=optmin;\n",
+ "end\n",
+ "\n",
+ "plot(dx,F_applied)\n",
+ "xlabel('dx (nm)')\n",
+ "ylabel('Force (nN)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "For this function, it is possible to take a derivative and compare the analytical result:\n",
+ "\n",
+ "dE/dx = 0 = d(E_LJ)/dx - F\n",
+ "\n",
+ "F= d(E_LJ)/dx"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "F =\n",
+ "\n",
+ "@(dx) 4 * epsilon * 6 * (sigma ^ 6 ./ (xmin + dx) .^ 7 - 2 * sigma ^ 12 ./ (xmin + dx) .^ 13)\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "dx_full=linspace(0,0.06,50);\n",
+ "F= @(dx) 4*epsilon*6*(sigma^6./(xmin+dx).^7-2*sigma^12./(xmin+dx).^13)\n",
+ "plot(dx_full,F(dx_full),dx,F_applied)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "## Curve-fitting\n",
+ "Another example is minimizing error in your approximation of a function. If you have data (now we have Force-displacement data) we can fit this to a function, such as:\n",
+ "\n",
+ "$F(x) = K_{1}\\Delta x + \\frac{1}{2} K_{2}(\\Delta x)^{2}$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "function SSE = sse_of_parabola(K,xdata,ydata)\n",
+ " % calculate the sum of squares error for a parabola given a function, func, and xdata and ydata\n",
+ " % output is SSE=sum of squares error\n",
+ " K1=K(1);\n",
+ " K2=K(2);\n",
+ " y_function = K1*xdata+1/2*K2*xdata.^2;\n",
+ " SSE = sum((ydata-y_function).^2);\n",
+ "end\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "The nonlinear spring constants are K1=0.16 nN/nm and K2=-5.98 nN/nm^2\n",
+ "The mininum sum of squares error = 7.35e-08\n"
+ ]
+ }
+ ],
+ "source": [
+ "[K,SSE_min]=fminsearch(@(K) sse_of_parabola(K,dx,F_applied),[1,1]);\n",
+ "fprintf('\\nThe nonlinear spring constants are K1=%1.2f nN/nm and K2=%1.2f nN/nm^2\\n',K)\n",
+ "fprintf('The mininum sum of squares error = %1.2e',SSE_min)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot(dx,F_applied,'o',dx,K(1)*dx+1/2*K(2)*dx.^2)"
+ ]
+ },
+ {
+ "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_08/lecture_08.md b/lecture_08/lecture_08.md
new file mode 100644
index 0000000..79edc0a
--- /dev/null
+++ b/lecture_08/lecture_08.md
@@ -0,0 +1,626 @@
+
+
+```octave
+%plot --format svg
+```
+
+# Optimization
+
+Many problems involve finding a minimum or maximum based on given constraints. Engineers and scientists typically use energy balance equations to find the conditions of minimum energy, but this value may never go to 0 and the actual value of energy may not be of interest.
+
+The Lennard-Jones potential is commonly used to model interatomic bonding.
+
+$E_{LJ}(x)=4\epsilon \left(\left(\frac{\sigma}{x}\right)^{12}-\left(\frac{\sigma}{x}\right)^{6}\right)$
+
+Considering a 1-D gold chain, we can calculate the bond length, $x_{b}$, with no force applied to the chain and even for tension, F. This will allow us to calculate the nonlinear spring constant of a 1-D gold chain.
+
+![TEM image of Gold chain](au_chain.jpg)
+
+Computational Tools to Study and Predict the Long-Term Stability of Nanowires.
+By Martin E. Zoloff Michoff, Patricio VĂ©lez, Sergio A. Dassie and Ezequiel P. M. Leiva
+
+![Model of Gold chain, from molecular dynamics simulation](Auchain_model.png)
+
+[Single atom gold chain mechanics](http://www.uam.es/personal_pdi/ciencias/agrait/)
+
+### First, let's find the minimum energy $\min(E_{LJ}(x))$
+
+## Brute force
+
+
+```octave
+setdefaults
+epsilon = 0.039; % kcal/mol
+sigma = 2.934; % Angstrom
+x=linspace(2.8,6,200); % bond length in Angstrom
+
+Ex = lennard_jones(x,sigma,epsilon);
+
+[Emin,imin]=min(Ex);
+
+plot(x,Ex,x(imin),Emin,'o')
+```
+
+
+![svg](lecture_08_files/lecture_08_3_0.svg)
+
+
+
+```octave
+x(imin-1)
+x(imin)
+x(imin+1)
+```
+
+ ans = 3.2824
+ ans = 3.2985
+ ans = 3.3146
+
+
+## Golden Search Algorithm
+
+We can't just look for a sign change for the problem (unless we can take a derivative) so we need a new approach to determine whether we have a maximum between the two bounds.
+
+Rather than using the midpoint of initial bounds, here the problem is more difficult. We need to compare the values of 4 function evaluations. The golden search uses the golden ratio to determine two interior points.
+
+![golden ratio](goldenratio.png)
+
+Start with bounds of 2.5 and 6 Angstrom.
+
+
+```octave
+% define Au atomic potential
+epsilon = 0.039; % kcal/mol
+sigma = 2.934; % Angstrom
+Au_x= @(x) lennard_jones(x,sigma,epsilon);
+
+% calculate golden ratio
+phi = 1/2+sqrt(5)/2;
+% set initial limits
+x_l=2.8;
+x_u=6;
+
+% Iteration #1
+d=(phi-1)*(x_u-x_l);
+
+x1=x_l+d; % define point 1
+x2=x_u-d; % define point 2
+
+
+% evaluate Au_x(x1) and Au_x(x2)
+
+f1=Au_x(x1);
+f2=Au_x(x2);
+plot(x,Au_x(x),x_l,Au_x(x_l),'ro',x2,f2,'rs',x1,f1,'gs',x_u,Au_x(x_u),'go')
+hold on;
+
+if f2x2
+ plot(x4,f4,'*',[x1,x2],[f1,f2])
+ x1=x2;
+ f1=f2;
+ else
+ plot(x4,f4,'*',[x3,x2],[f3,f2])
+ x3=x2;
+ f3=f2;
+ end
+ x2=x4; f2=f4;
+else
+ error('no minimum in bracket')
+end
+hold off
+```
+
+
+![svg](lecture_08_files/lecture_08_11_0.svg)
+
+
+
+```octave
+p = polyfit([x1,x2,x3],[f1,f2,f3],2);
+x_fit = linspace(x1,x3,20);
+y_fit = polyval(p,x_fit);
+
+plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')
+hold on
+if f2x2
+ plot(x4,f4,'*',[x1,x2],[f1,f2])
+ x1=x2;
+ f1=f2;
+ else
+ plot(x4,f4,'*',[x3,x2],[f3,f2])
+ x3=x2;
+ f3=f2;
+ end
+ x2=x4; f2=f4;
+else
+ error('no minimum in bracket')
+end
+hold off
+
+```
+
+
+![svg](lecture_08_files/lecture_08_12_0.svg)
+
+
+
+```octave
+p = polyfit([x1,x2,x3],[f1,f2,f3],2);
+x_fit = linspace(x1,x3,20);
+y_fit = polyval(p,x_fit);
+
+plot(x,Au_x(x),x_fit,y_fit,[x1,x2,x3],[f1,f2,f3],'o')
+hold on
+if f2x2
+ plot(x4,f4,'*',[x1,x2],[f1,f2])
+ x1=x2;
+ f1=f2;
+ else
+ plot(x4,f4,'*',[x3,x2],[f3,f2])
+ x3=x2;
+ f3=f2;
+ end
+ x2=x4; f2=f4;
+else
+ error('no minimum in bracket')
+end
+hold off
+
+```
+
+
+![svg](lecture_08_files/lecture_08_13_0.svg)
+
+
+Parabolic interpolation does not converge in many scenarios even though it it a bracketing method. Instead, functions like `fminbnd` in Matlab and Octave use a combination of the two (Golden Ratio and Parabolic)
+
+## Using the solutions to minimization for the nonlinear spring constant
+
+Now, we have two routines to find minimums of a univariate function (Golden Ratio and Parabolic). Let's use these to solve for the minimum energy given a range of applied forces to the single atom gold chain
+
+$E_{total}(\Delta x) = E_{LJ}(x_{min}+\Delta x) - F \cdot \Delta x$
+
+
+```octave
+epsilon = 0.039; % kcal/mol
+epsilon = epsilon*6.9477e-21; % J/atom
+epsilon = epsilon*1e18; % aJ/J
+% final units for epsilon are aJ
+
+sigma = 2.934; % Angstrom
+sigma = sigma*0.10; % nm/Angstrom
+x=linspace(2.8,6,200)*0.10; % bond length in um
+
+Ex = lennard_jones(x,sigma,epsilon);
+
+%[Emin,imin]=min(Ex);
+
+[xmin,Emin] = fminbnd(@(x) lennard_jones(x,sigma,epsilon),0.28,0.6)
+
+plot(x,Ex,xmin,Emin,'o')
+ylabel('Lennard Jones Potential (aJ/atom)')
+xlabel('bond length (nm)')
+
+Etotal = @(dx,F) lennard_jones(xmin+dx,sigma,epsilon)-F.*dx;
+
+```
+
+ xmin = 0.32933
+ Emin = -2.7096e-04
+
+
+
+![svg](lecture_08_files/lecture_08_16_1.svg)
+
+
+
+```octave
+N=50;
+dx = zeros(1,N); % [in nm]
+F_applied=linspace(0,0.0022,N); % [in nN]
+for i=1:N
+ optmin=goldmin(@(dx) Etotal(dx,F_applied(i)),-0.001,0.035);
+ dx(i)=optmin;
+end
+
+plot(dx,F_applied)
+xlabel('dx (nm)')
+ylabel('Force (nN)')
+```
+
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: called from
+ goldmin at line 17 column 1
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+ warning: Matlab-style short-circuit operation performed for operator |
+
+
+
+![svg](lecture_08_files/lecture_08_17_1.svg)
+
+
+For this function, it is possible to take a derivative and compare the analytical result:
+
+
+```octave
+dx_full=linspace(0,0.06,50);
+F= @(dx) 4*epsilon*6*(sigma^6./(xmin+dx).^7-2*sigma^12./(xmin+dx).^13)
+plot(dx_full,F(dx_full),dx,F_applied)
+```
+
+ F =
+
+ @(dx) 4 * epsilon * 6 * (sigma ^ 6 ./ (xmin + dx) .^ 7 - 2 * sigma ^ 12 ./ (xmin + dx) .^ 13)
+
+
+
+
+![svg](lecture_08_files/lecture_08_19_1.svg)
+
+
+## Curve-fitting
+Another example is minimizing error in your approximation of a function. If you have data (now we have Force-displacement data) we can fit this to a function, such as:
+
+$F(x) = K_{1}\Delta x + \frac{1}{2} K_{2}(\Delta x)^{2}$
+
+
+
+```octave
+function SSE = sse_of_parabola(K,xdata,ydata)
+ % calculate the sum of squares error for a parabola given a function, func, and xdata and ydata
+ % output is SSE=sum of squares error
+ K1=K(1);
+ K2=K(2);
+ y_function = K1*xdata+1/2*K2*xdata.^2;
+ SSE = sum((ydata-y_function).^2);
+end
+
+```
+
+
+```octave
+[K,SSE_min]=fminsearch(@(K) sse_of_parabola(K,dx,F_applied),[1,1]);
+fprintf('\nThe nonlinear spring constants are K1=%1.2f nN/nm and K2=%1.2f nN/nm^2\n',K)
+fprintf('The mininum sum of squares error = %1.2e',SSE_min)
+```
+
+
+ The nonlinear spring constants are K1=0.16 nN/nm and K2=-5.98 nN/nm^2
+ The mininum sum of squares error = 7.35e-08
+
+
+
+```octave
+plot(dx,F_applied,'o',dx,K(1)*dx+1/2*K(2)*dx.^2)
+```
+
+
+![svg](lecture_08_files/lecture_08_23_0.svg)
+
diff --git a/lecture_08/lecture_08.pdf b/lecture_08/lecture_08.pdf
new file mode 100644
index 0000000..c251694
Binary files /dev/null and b/lecture_08/lecture_08.pdf differ
diff --git a/lecture_08/lecture_08_files/lecture_08_11_0.svg b/lecture_08/lecture_08_files/lecture_08_11_0.svg
new file mode 100644
index 0000000..c61f790
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_11_0.svg
@@ -0,0 +1,168 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_12_0.svg b/lecture_08/lecture_08_files/lecture_08_12_0.svg
new file mode 100644
index 0000000..b641032
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_12_0.svg
@@ -0,0 +1,163 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_13_0.svg b/lecture_08/lecture_08_files/lecture_08_13_0.svg
new file mode 100644
index 0000000..3e467e5
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_13_0.svg
@@ -0,0 +1,163 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_16_1.svg b/lecture_08/lecture_08_files/lecture_08_16_1.svg
new file mode 100644
index 0000000..ff27c29
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_16_1.svg
@@ -0,0 +1,142 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_17_1.svg b/lecture_08/lecture_08_files/lecture_08_17_1.svg
new file mode 100644
index 0000000..1f3103b
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_17_1.svg
@@ -0,0 +1,136 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_19_1.svg b/lecture_08/lecture_08_files/lecture_08_19_1.svg
new file mode 100644
index 0000000..2a891df
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_19_1.svg
@@ -0,0 +1,135 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_23_0.svg b/lecture_08/lecture_08_files/lecture_08_23_0.svg
new file mode 100644
index 0000000..8fa3bb1
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_23_0.svg
@@ -0,0 +1,196 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_3_0.svg b/lecture_08/lecture_08_files/lecture_08_3_0.svg
new file mode 100644
index 0000000..2c38150
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_3_0.svg
@@ -0,0 +1,147 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_6_1.svg b/lecture_08/lecture_08_files/lecture_08_6_1.svg
new file mode 100644
index 0000000..ecf7a18
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_6_1.svg
@@ -0,0 +1,169 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_7_1.svg b/lecture_08/lecture_08_files/lecture_08_7_1.svg
new file mode 100644
index 0000000..e63011c
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_7_1.svg
@@ -0,0 +1,169 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_8_1.svg b/lecture_08/lecture_08_files/lecture_08_8_1.svg
new file mode 100644
index 0000000..873b04d
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_8_1.svg
@@ -0,0 +1,169 @@
+
\ No newline at end of file
diff --git a/lecture_08/lecture_08_files/lecture_08_9_1.svg b/lecture_08/lecture_08_files/lecture_08_9_1.svg
new file mode 100644
index 0000000..28fd681
--- /dev/null
+++ b/lecture_08/lecture_08_files/lecture_08_9_1.svg
@@ -0,0 +1,169 @@
+
\ No newline at end of file
diff --git a/lecture_08/lennard_jones.m b/lecture_08/lennard_jones.m
new file mode 100644
index 0000000..d18a6ad
--- /dev/null
+++ b/lecture_08/lennard_jones.m
@@ -0,0 +1,4 @@
+function E_LJ =lennard_jones(x,sigma,epsilon)
+ E_LJ = 4*epsilon*((sigma./x).^12-(sigma./x).^6);
+end
+
diff --git a/lecture_08/octave-workspace b/lecture_08/octave-workspace
new file mode 100644
index 0000000..8c437bb
Binary files /dev/null and b/lecture_08/octave-workspace differ