From e7abd6443d4297db0314fff39d90347ba9f0db83 Mon Sep 17 00:00:00 2001 From: "Ryan C. Cooper" Date: Thu, 5 Oct 2017 22:27:42 -0400 Subject: [PATCH] added Gauss and LU --- .../09_Linear-Algebra-checkpoint.ipynb | 133 +- 09_Linear-Algebra/09_Linear-Algebra.ipynb | 2 +- 09_Linear-Algebra/octave-workspace | Bin 0 -> 153 bytes .../10_Gauss_elimination-checkpoint.ipynb | 1802 +++++++++++++++++ .../lecture_10-checkpoint.ipynb | 1802 +++++++++++++++++ .../10_Gauss_elimination.ipynb | 1786 ++++++++++++++++ 10_Gauss_elimination/GaussNaive.m | 25 + 10_Gauss_elimination/GaussPivot.m | 33 + 10_Gauss_elimination/Tridiag.m | 22 + 10_Gauss_elimination/nohup.out | 0 10_Gauss_elimination/octave-workspace | Bin 0 -> 47934 bytes "10_Gauss_elimination/\340\004'\001" | 0 "10_Gauss_elimination/\360\206P\001" | 0 .../11_LU-decomposition-checkpoint.ipynb | 760 +++++++ .../lecture_11-checkpoint.ipynb | 760 +++++++ 11_LU-decomposition/11_LU-decomposition.ipynb | 760 +++++++ 11_LU-decomposition/LU_naive.m | 27 + 11_LU-decomposition/LU_pivot.m | 36 + 11_LU-decomposition/mass_springs.png | Bin 0 -> 5031 bytes 11_LU-decomposition/mass_springs.svg | 214 ++ 11_LU-decomposition/octave-workspace | Bin 0 -> 244789 bytes 21 files changed, 8096 insertions(+), 66 deletions(-) create mode 100644 10_Gauss_elimination/.ipynb_checkpoints/10_Gauss_elimination-checkpoint.ipynb create mode 100644 10_Gauss_elimination/.ipynb_checkpoints/lecture_10-checkpoint.ipynb create mode 100644 10_Gauss_elimination/10_Gauss_elimination.ipynb create mode 100644 10_Gauss_elimination/GaussNaive.m create mode 100644 10_Gauss_elimination/GaussPivot.m create mode 100644 10_Gauss_elimination/Tridiag.m create mode 100644 10_Gauss_elimination/nohup.out create mode 100644 10_Gauss_elimination/octave-workspace create mode 100644 "10_Gauss_elimination/\340\004'\001" create mode 100644 "10_Gauss_elimination/\360\206P\001" create mode 100644 11_LU-decomposition/.ipynb_checkpoints/11_LU-decomposition-checkpoint.ipynb create mode 100644 11_LU-decomposition/.ipynb_checkpoints/lecture_11-checkpoint.ipynb create mode 100644 11_LU-decomposition/11_LU-decomposition.ipynb create mode 100644 11_LU-decomposition/LU_naive.m create mode 100644 11_LU-decomposition/LU_pivot.m create mode 100644 11_LU-decomposition/mass_springs.png create mode 100644 11_LU-decomposition/mass_springs.svg create mode 100644 11_LU-decomposition/octave-workspace diff --git a/09_Linear-Algebra/.ipynb_checkpoints/09_Linear-Algebra-checkpoint.ipynb b/09_Linear-Algebra/.ipynb_checkpoints/09_Linear-Algebra-checkpoint.ipynb index 6bc2ad3..cba99b5 100644 --- a/09_Linear-Algebra/.ipynb_checkpoints/09_Linear-Algebra-checkpoint.ipynb +++ b/09_Linear-Algebra/.ipynb_checkpoints/09_Linear-Algebra-checkpoint.ipynb @@ -205,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { @@ -227,18 +227,25 @@ " 1 2 3 4\n", " 5 6 7 8\n", " 9 10 11 12\n", + "\n", + "C =\n", + "\n", + " 20 28 36 44\n", + " 38 44 50 56\n", "\n" ] } ], "source": [ "A=[5,3,0;1,2,3] \n", - "B=[1,2,3,4;5,6,7,8;9,10,11,12]" + "B=[1,2,3,4;5,6,7,8;9,10,11,12]\n", + "C=A*B;\n", + "C" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { @@ -372,10 +379,19 @@ "\n", "Consider 4 masses connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", "\n", - "![Springs-masses](mass_springs.svg)\n", - "\n", - "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "![Springs-masses](mass_springs.png)\n", "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", "\n", "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", @@ -414,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { @@ -426,20 +442,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "K =\n", - "\n", - " 20 -10 0 0\n", - " -10 20 -10 0\n", - " 0 -10 20 -10\n", - " 0 0 -10 10\n", - "\n", - "y =\n", - "\n", - " 9.8100\n", - " 19.6200\n", - " 29.4300\n", - " 39.2400\n", - "\n", "x =\n", "\n", " 9.8100\n", @@ -457,17 +459,21 @@ "m3=3;\n", "m4=4;\n", "g=9.81; % m/s^2\n", - "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", - "y=[m1*g;m2*g;m3*g;m4*g]\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k];\n", + "y=[m1*g;m2*g;m3*g;m4*g];\n", "\n", "x=K\\y" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ - "## Matrix Operations\n", + "## Special Matrices\n", "\n", "Identity matrix `eye(M,N)` **Assume M=N unless specfied**\n", "\n", @@ -487,8 +493,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "source": [ + "## Matrix operations\n", "### Transpose\n", "\n", "The transpose of a matrix changes the rows -> columns and columns-> rows\n", @@ -514,9 +525,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } }, "outputs": [ { @@ -602,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { @@ -619,15 +633,16 @@ "Diagonal Matrix\n", "\n", " 1 0 0\n", - " 0 1 0\n", + " 0 4 0\n", " 0 0 1\n", "\n", - "ans = 3\n" + "ans = 6\n" ] } ], "source": [ - "id_m=eye(3)\n", + "id_m=eye(3);\n", + "id_m(2,2)=4\n", "trace(id_m)" ] }, @@ -658,7 +673,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { @@ -672,9 +687,9 @@ "text": [ "A =\n", "\n", - " 0.5762106 0.3533174 0.7172134\n", - " 0.7061664 0.4863733 0.9423436\n", - " 0.4255961 0.0016613 0.3561407\n", + " 0.71624 0.28713 0.91248\n", + " 0.43423 0.50924 0.89731\n", + " 0.81776 0.15682 0.48825\n", "\n" ] } @@ -685,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { @@ -699,9 +714,9 @@ "text": [ "Ainv =\n", "\n", - " 41.5613 -30.1783 -3.8467\n", - " 36.2130 -24.2201 -8.8415\n", - " -49.8356 36.1767 7.4460\n", + " -1.189272 -0.032028 2.281478\n", + " -5.750167 4.369462 2.716129\n", + " 3.838847 -1.349811 -2.645516\n", "\n" ] } @@ -712,7 +727,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { @@ -726,9 +741,9 @@ "text": [ "B =\n", "\n", - " 0.524529 0.470856 0.708116\n", - " 0.084491 0.730986 0.528292\n", - " 0.303545 0.782522 0.389282\n", + " 0.88372 0.43914 0.13476\n", + " 0.43439 0.34519 0.30337\n", + " 0.84604 0.86479 0.21558\n", "\n" ] } @@ -739,7 +754,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { @@ -753,34 +768,22 @@ "text": [ "ans =\n", "\n", - " -182.185 125.738 40.598\n", - " -133.512 97.116 17.079\n", - " 282.422 -200.333 -46.861\n", - "\n", - "ans =\n", - "\n", - " -182.185 125.738 40.598\n", - " -133.512 97.116 17.079\n", - " 282.422 -200.333 -46.861\n", - "\n", - "ans =\n", - "\n", - " 41.5613 36.2130 -49.8356\n", - " -30.1783 -24.2201 36.1767\n", - " -3.8467 -8.8415 7.4460\n", + " -1.189272 -5.750167 3.838847\n", + " -0.032028 4.369462 -1.349811\n", + " 2.281478 2.716129 -2.645516\n", "\n", "ans =\n", "\n", - " 41.5613 36.2130 -49.8356\n", - " -30.1783 -24.2201 36.1767\n", - " -3.8467 -8.8415 7.4460\n", + " -1.189272 -5.750167 3.838847\n", + " -0.032028 4.369462 -1.349811\n", + " 2.281478 2.716129 -2.645516\n", "\n" ] } ], "source": [ - "inv(A*B)\n", - "inv(B)*inv(A)\n", + "%inv(A*B)\n", + "%inv(B)*inv(A)\n", "\n", "inv(A')\n", "\n", diff --git a/09_Linear-Algebra/09_Linear-Algebra.ipynb b/09_Linear-Algebra/09_Linear-Algebra.ipynb index 71dc415..cba99b5 100644 --- a/09_Linear-Algebra/09_Linear-Algebra.ipynb +++ b/09_Linear-Algebra/09_Linear-Algebra.ipynb @@ -379,7 +379,7 @@ "\n", "Consider 4 masses connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", "\n", - "![Springs-masses](mass_springs.svg)\n", + "![Springs-masses](mass_springs.png)\n", "\n", "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:" ] diff --git a/09_Linear-Algebra/octave-workspace b/09_Linear-Algebra/octave-workspace index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8c437bb6e55a5d1b6115661b3a20e86870909d32 100644 GIT binary patch literal 153 zcmeZIE=ep))iu=hVPIxpU`Wg>29gX6|5<=Ua%xV_zyJULGXmL6K+FfkHXuRW)ST4Z s)VvZqpa4)UCy*#Ej4v)J%FIiLX#g3JmQ#{Vk|uVbru4khf}H#k0D5999{>OV literal 0 HcmV?d00001 diff --git a/10_Gauss_elimination/.ipynb_checkpoints/10_Gauss_elimination-checkpoint.ipynb b/10_Gauss_elimination/.ipynb_checkpoints/10_Gauss_elimination-checkpoint.ipynb new file mode 100644 index 0000000..1f6b0bb --- /dev/null +++ b/10_Gauss_elimination/.ipynb_checkpoints/10_Gauss_elimination-checkpoint.ipynb @@ -0,0 +1,1802 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Gauss Elimination\n", + "### Solving sets of equations with matrix operations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dimensions of a matrix = degrees of freedom of the system \n", + "\n", + "- Given set of known outputs, $y_{1},~y_{2},~...y_{N}$ \n", + "- set of equations \n", + "- unknown inputs, $x_{1},~x_{2},~...x_{N}$, \n", + "- these can be written in a vector matrix format as:\n", + "\n", + "$y=Ax$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Example \n", + "\n", + "Consider a problem with 2 DOF:\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "1 & 3 \\\\\n", + "2 & 1 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "The solution for $x_{1}$ and $x_{2}$ is the intersection of two lines:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x21=[-2:2];\n", + "x11=1-3*x21;\n", + "x21=[-2:2];\n", + "x22=1-2*x21;\n", + "plot(x11,x21,x21,x22)\n", + "xlabel('x_1')\n", + "ylabel('x_2')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.40000\n", + " 0.20000\n", + "\n" + ] + } + ], + "source": [ + "A=[1,3;2,1]; y=[1;1];\n", + "A\\y % matlab's Ax=y solution for x" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3 Degrees of Freedom\n", + "\n", + "For a $3\\times3$ matrix, the solution is the intersection of the 3 planes.\n", + "\n", + "$10x_{1}+2x_{2}+x_{3}=1$\n", + "\n", + "$2x_{1}+x_{2}+x_{3}=1$\n", + "\n", + "$x_{1}+2x_{2}+10x_{3}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "10 & 2 & 1\\\\\n", + "2 & 1 & 1 \\\\\n", + "1 & 2 & 10\\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1 \\\\\n", + "1\\end{array}\\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=25;\n", + "x11=linspace(-2,2,N);\n", + "x12=linspace(-2,2,N);\n", + "[X11,X12]=meshgrid(x11,x12);\n", + "X13=1-10*X11-2*X12;\n", + "\n", + "x21=linspace(-2,2,N);\n", + "x22=linspace(-2,2,N);\n", + "[X21,X22]=meshgrid(x21,x22);\n", + "X23=1-2*X11-X22;\n", + "\n", + "x31=linspace(-2,2,N);\n", + "x32=linspace(-2,2,N);\n", + "[X31,X32]=meshgrid(x31,x32);\n", + "X33=1/10*(1-X31-2*X32);\n", + "\n", + "mesh(X11,X12,X13);\n", + "hold on;\n", + "mesh(X21,X22,X23)\n", + "mesh(X31,X32,X33)\n", + "x=[10,2, 1;2,1, 1; 1, 2, 10]\\[1;1;1];\n", + "plot3(x(1),x(2),x(3),'o')\n", + "xlabel('x1')\n", + "ylabel('x2')\n", + "zlabel('x3')\n", + "view(10,45)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## N>3 Degrees of Freedoms\n", + "\n", + "After 3 DOF problems, the solutions are described as *hyperplane* intersections. Which are even harder to visualize" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Gauss elimination\n", + "### Solving sets of equations systematically\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "2 & 1 & 1 & 1 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(2,:)-Ay(1,:)/5 = ([2 1 1 1]-1/5[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(3,:)-Ay(1,:)/10 = ([1 2 10 1]-1/10[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 1.8 & 9.9 & 0.9\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Ay(3,:)-1.8\\*5/3\\*Ay(2,:) = ([0 1.8 9.9 0.9]-3\\*[0 3/5 4/5 4/5])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 0 & 7.5 & -1.5\\end{array} \n", + "\\right] $\n", + "\n", + "now, $7.5x_{3}=-1.5$ so $x_{3}=-\\frac{1}{5}$\n", + "\n", + "then, $3/5x_{2}+4/5(-1/5)=1$ so $x_{2}=\\frac{8}{5}$\n", + "\n", + "finally, $10x_{1}+2(8/5)+1(-\\frac{1}{5})=1$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Mass-spring example\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../09_Linear-Algebra/mass_springs.png)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 200 -100 0 0\n", + " -100 200 -100 0\n", + " 0 -100 200 -100\n", + " 0 0 -100 100\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=100; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K1 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 -100.00000 200.00000 -100.00000 29.43000\n", + " 0.00000 0.00000 -100.00000 100.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K1=[K y];\n", + "K1(2,:)=K1(1,:)/2+K1(2,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 0.00000 133.33333 -100.00000 45.78000\n", + " 0.00000 0.00000 -100.00000 100.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K2=K1;\n", + "K2(3,:)=K1(2,:)*100/150+K1(3,:)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 0.00000 133.33333 -100.00000 45.78000\n", + " 0.00000 0.00000 0.00000 25.00000 73.57500\n", + "\n" + ] + } + ], + "source": [ + "K2(4,:)=-K2(3,:)*K2(4,3)/K2(3,3)+K2(4,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x4 = 2.9430\n", + "x3 = 2.5506\n", + "x2 = 1.8639\n", + "x1 = 0.98100\n" + ] + } + ], + "source": [ + "yp=K2(:,5);\n", + "x4=yp(4)/K2(4,4)\n", + "x3=(yp(3)-K2(3,4)*x4)/K2(3,3)\n", + "x2=(yp(2)-K2(2,3)*x3)/K2(2,2)\n", + "x1=(yp(1)-K2(1,2)*x2)/K2(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.98100\n", + " 1.86390\n", + " 2.55060\n", + " 2.94300\n", + "\n" + ] + } + ], + "source": [ + "K\\y" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Automate Gauss Elimination\n", + "\n", + "We can automate Gauss elimination with a function whose input is A and y:\n", + "\n", + "`x=GaussNaive(A,y)`" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.98100\n", + " 1.86390\n", + " 2.55060\n", + " 2.94300\n", + "\n" + ] + } + ], + "source": [ + "x=GaussNaive(K,y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Problem (Diagonal element is zero)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "If a diagonal element is 0 or very small either:\n", + "\n", + "1. no solution found\n", + "2. errors are introduced \n", + "\n", + "Therefore, we would want to pivot before applying Gauss elimination\n", + "\n", + "Consider:\n", + "\n", + "(a) $\\left[ \\begin{array}{cccc}\n", + "0 & 2 & 3 \\\\\n", + "4 & 6 & 7 \\\\\n", + "2 & -3 & 6 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "8 \\\\\n", + "-3 \\\\\n", + "5\\end{array} \\right]$\n", + "\n", + "(b) $\\left[ \\begin{array}{cccc}\n", + "0.0003 & 3.0000 \\\\\n", + "1.0000 & 1.0000 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "2.0001 \\\\\n", + "1.0000 \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " NaN\n", + " NaN\n", + " NaN\n", + "\n", + "ans =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n" + ] + } + ], + "source": [ + "format short\n", + "Aa=[0,2,3;4,6,7;2,-3,6]; ya=[8;-3;5];\n", + "GaussNaive(Aa,ya)\n", + "Aa\\ya" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n", + "Aug =\n", + "\n", + " 4.00000 6.00000 7.00000 -3.00000\n", + " 0.00000 -6.00000 2.50000 6.50000\n", + " 0.00000 0.00000 3.83333 10.16667\n", + "\n", + "npivots = 2\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Aa,ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.325665420556713\n", + " 0.666666666666667\n", + "\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "format long\n", + "Ab=[0.3E-13,3.0000;1.0000,1.0000];yb=[2+0.1e-13;1.0000];\n", + "GaussNaive(Ab,yb)\n", + "Ab\\yb" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n", + "Aug =\n", + "\n", + " 1.000000000000000 1.000000000000000 1.000000000000000\n", + " 0.000000000000000 2.999999999999970 1.999999999999980\n", + "\n", + "npivots = 1\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Ab,yb)\n", + "Ab\\yb\n", + "format short" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = -3.0000\n", + "ans = 3.0000\n" + ] + } + ], + "source": [ + "% determinant is (-1)^(number_of_pivots)*diagonal_elements\n", + "det(Ab)\n", + "Aug(1,1)*Aug(2,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Spring-Mass System again\n", + "Now, 4 masses are connected in series to 4 springs with $K_{1}$=10 N/m, $K_{2}$=5 N/m, \n", + "$K_{3}$=2 N/m \n", + "and $K_{4}$=1 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_1+k_2 & -k_2 & 0 & 0 \\\\\n", + "-k_2 & k_2+k_3 & -k_3 & 0 \\\\\n", + "0 & -k_3 & k_3+k_4 & -k_4 \\\\\n", + "0 & 0 & -k_4 & k_4 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 15 -5 0 0\n", + " -5 7 -2 0\n", + " 0 -2 3 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; k2=5;k3=2;k4=1; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2, k2+k3, -k3 0; 0 -k3, k3+k4, -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Tridiagonal matrix\n", + "\n", + "This matrix, K, could be rewritten as 3 vectors e, f and g\n", + "\n", + "$e=\\left[ \\begin{array}{c}\n", + "0 \\\\\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\end{array} \\right]$\n", + "\n", + "$f=\\left[ \\begin{array}{c}\n", + "15 \\\\\n", + "7 \\\\\n", + "3 \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "$g=\\left[ \\begin{array}{c}\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\\\\n", + "0 \\end{array} \\right]$\n", + "\n", + "Where all other components are 0 and the length of the vectors are n and the first component of e and the last component of g are zero\n", + "\n", + "`e(1)=0` \n", + "\n", + "`g(end)=0`\n", + "\n", + "No need to pivot and number of calculations reduced enormously.\n", + "\n", + "|method |Number of Floating point operations for n$\\times$n-matrix|\n", + "|----------------|---------|\n", + "| Gauss | n-cubed |\n", + "| Tridiagonal | n |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100 27.4680 61.8030 101.0430\n", + "\n", + "ans =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n" + ] + } + ], + "source": [ + "e=[0;-5;-2;-1];\n", + "g=[-5;-2;-1;0];\n", + "f=[15;7;3;1];\n", + "Tridiag(e,f,g,y)\n", + "K\\y\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "% tic ... t=toc \n", + "% is Matlab timer used for debugging programs\n", + "t_GE = zeros(1,100);\n", + "t_GE_tridiag = zeros(1,100);\n", + "t_TD = zeros(1,100);\n", + "%for n = 1:200\n", + "for n=1:100\n", + " A = rand(n,n);\n", + " e = rand(n,1); e(1)=0;\n", + " f = rand(n,1);\n", + " g = rand(n,1); g(end)=0;\n", + " Atd=diag(f, 0) - diag(e(2:n), -1) - diag(g(1:n-1), 1);\n", + " b = rand(n,1);\n", + " tic;\n", + " x = GaussPivot(A,b);\n", + " t_GE(n) = toc;\n", + " tic;\n", + " x = A\\b;\n", + " t_GE_tridiag(n) = toc;\n", + " tic;\n", + " x = Tridiag(e,f,g,b);\n", + " t_TD(n) = toc;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t101\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ttime (s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tnumber of elements\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tGauss elim\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tGauss elim\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tMatlab \\\n", + "\n", + "\t\n", + "\t\tMatlab \n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tTriDiag\n", + "\n", + "\t\n", + "\t\tTriDiag\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n=1:100;\n", + "loglog(n,t_GE,n,t_TD,n,t_GE_tridiag)\n", + "legend('Gauss elim','Matlab \\','TriDiag')\n", + "xlabel('number of elements')\n", + "ylabel('time (s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n", + "Aug =\n", + "\n", + " 15.00000 -5.00000 0.00000 0.00000 9.81000\n", + " 0.00000 5.33333 -2.00000 0.00000 22.89000\n", + " 0.00000 0.00000 2.25000 -1.00000 38.01375\n", + " 0.00000 0.00000 0.00000 0.55556 56.13500\n", + "\n", + "npivots = 0\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(K,y)" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/10_Gauss_elimination/.ipynb_checkpoints/lecture_10-checkpoint.ipynb b/10_Gauss_elimination/.ipynb_checkpoints/lecture_10-checkpoint.ipynb new file mode 100644 index 0000000..77a6c55 --- /dev/null +++ b/10_Gauss_elimination/.ipynb_checkpoints/lecture_10-checkpoint.ipynb @@ -0,0 +1,1802 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Gauss Elimination\n", + "### Solving sets of equations with matrix operations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dimensions of a matrix = degrees of freedom of the system \n", + "\n", + "- Given set of known outputs, $y_{1},~y_{2},~...y_{N}$ \n", + "- set of equations \n", + "- unknown inputs, $x_{1},~x_{2},~...x_{N}$, \n", + "- these can be written in a vector matrix format as:\n", + "\n", + "$y=Ax$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Example \n", + "\n", + "Consider a problem with 2 DOF:\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "1 & 3 \\\\\n", + "2 & 1 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "The solution for $x_{1}$ and $x_{2}$ is the intersection of two lines:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x21=[-2:2];\n", + "x11=1-3*x21;\n", + "x21=[-2:2];\n", + "x22=1-2*x21;\n", + "plot(x11,x21,x21,x22)\n", + "xlabel('x_1')\n", + "ylabel('x_2')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.40000\n", + " 0.20000\n", + "\n" + ] + } + ], + "source": [ + "A=[1,3;2,1]; y=[1;1];\n", + "A\\y % matlab's Ax=y solution for x" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3 Degrees of Freedom\n", + "\n", + "For a $3\\times3$ matrix, the solution is the intersection of the 3 planes.\n", + "\n", + "$10x_{1}+2x_{2}+x_{3}=1$\n", + "\n", + "$2x_{1}+x_{2}+x_{3}=1$\n", + "\n", + "$x_{1}+2x_{2}+10x_{3}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "10 & 2 & 1\\\\\n", + "2 & 1 & 1 \\\\\n", + "1 & 2 & 10\\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1 \\\\\n", + "1\\end{array}\\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "N=25;\n", + "x11=linspace(-2,2,N);\n", + "x12=linspace(-2,2,N);\n", + "[X11,X12]=meshgrid(x11,x12);\n", + "X13=1-10*X11-2*X12;\n", + "\n", + "x21=linspace(-2,2,N);\n", + "x22=linspace(-2,2,N);\n", + "[X21,X22]=meshgrid(x21,x22);\n", + "X23=1-2*X11-X22;\n", + "\n", + "x31=linspace(-2,2,N);\n", + "x32=linspace(-2,2,N);\n", + "[X31,X32]=meshgrid(x31,x32);\n", + "X33=1/10*(1-X31-2*X32);\n", + "\n", + "mesh(X11,X12,X13);\n", + "hold on;\n", + "mesh(X21,X22,X23)\n", + "mesh(X31,X32,X33)\n", + "x=[10,2, 1;2,1, 1; 1, 2, 10]\\[1;1;1];\n", + "plot3(x(1),x(2),x(3),'o')\n", + "xlabel('x1')\n", + "ylabel('x2')\n", + "zlabel('x3')\n", + "view(10,45)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## N>3 Degrees of Freedoms\n", + "\n", + "After 3 DOF problems, the solutions are described as *hyperplane* intersections. Which are even harder to visualize" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Gauss elimination\n", + "### Solving sets of equations systematically\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "2 & 1 & 1 & 1 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(2,:)-Ay(1,:)/5 = ([2 1 1 1]-1/5[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(3,:)-Ay(1,:)/10 = ([1 2 10 1]-1/10[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 1.8 & 9.9 & 0.9\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Ay(3,:)-1.8\\*5/3\\*Ay(2,:) = ([0 1.8 9.9 0.9]-3\\*[0 3/5 4/5 4/5])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 0 & 7.5 & -1.5\\end{array} \n", + "\\right] $\n", + "\n", + "now, $7.5x_{3}=-1.5$ so $x_{3}=-\\frac{1}{5}$\n", + "\n", + "then, $3/5x_{2}+4/5(-1/5)=1$ so $x_{2}=\\frac{8}{5}$\n", + "\n", + "finally, $10x_{1}+2(8/5)+1(-\\frac{1}{5})=1$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Mass-spring example\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K1 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 -10.00000 20.00000 -10.00000 29.43000\n", + " 0.00000 0.00000 -10.00000 10.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K1=[K y];\n", + "K1(2,:)=K1(1,:)/2+K1(2,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 0.00000 13.33333 -10.00000 45.78000\n", + " 0.00000 0.00000 -10.00000 10.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K2=K1;\n", + "K2(3,:)=K1(2,:)*2/3+K1(3,:)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 20.00000 -10.00000 0.00000 0.00000 9.81000\n", + " 0.00000 15.00000 -10.00000 0.00000 24.52500\n", + " 0.00000 0.00000 13.33333 -10.00000 45.78000\n", + " 0.00000 0.00000 0.00000 2.50000 73.57500\n", + "\n" + ] + } + ], + "source": [ + "K2(4,:)=-K2(3,:)*K2(4,3)/K2(3,3)+K2(4,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x4 = 29.430\n", + "x3 = 25.506\n", + "x2 = 18.639\n", + "x1 = 9.8100\n" + ] + } + ], + "source": [ + "yp=K2(:,5);\n", + "x4=yp(4)/K2(4,4)\n", + "x3=(yp(3)+10*x4)/K2(3,3)\n", + "x2=(yp(2)+10*x3)/K2(2,2)\n", + "x1=(yp(1)+10*x2)/K2(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100\n", + " 18.6390\n", + " 25.5060\n", + " 29.4300\n", + "\n" + ] + } + ], + "source": [ + "K\\y" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Automate Gauss Elimination\n", + "\n", + "We can automate Gauss elimination with a function whose input is A and y:\n", + "\n", + "`x=GaussNaive(A,y)`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 18.6390\n", + " 25.5060\n", + " 29.4300\n", + "\n" + ] + } + ], + "source": [ + "x=GaussNaive(K,y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Problem (Diagonal element is zero)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "If a diagonal element is 0 or very small either:\n", + "\n", + "1. no solution found\n", + "2. errors are introduced \n", + "\n", + "Therefore, we would want to pivot before applying Gauss elimination\n", + "\n", + "Consider:\n", + "\n", + "(a) $\\left[ \\begin{array}{cccc}\n", + "0 & 2 & 3 \\\\\n", + "4 & 6 & 7 \\\\\n", + "2 & -3 & 6 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "8 \\\\\n", + "-3 \\\\\n", + "5\\end{array} \\right]$\n", + "\n", + "(b) $\\left[ \\begin{array}{cccc}\n", + "0.0003 & 3.0000 \\\\\n", + "1.0000 & 1.0000 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "2.0001 \\\\\n", + "1.0000 \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " NaN\n", + " NaN\n", + " NaN\n", + "\n", + "ans =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n" + ] + } + ], + "source": [ + "format short\n", + "Aa=[0,2,3;4,6,7;2,-3,6]; ya=[8;-3;5];\n", + "GaussNaive(Aa,ya)\n", + "Aa\\ya" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n", + "Aug =\n", + "\n", + " 4.00000 6.00000 7.00000 -3.00000\n", + " 0.00000 -6.00000 2.50000 6.50000\n", + " 0.00000 0.00000 3.83333 10.16667\n", + "\n", + "npivots = 2\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Aa,ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.325665420556713\n", + " 0.666666666666667\n", + "\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "format long\n", + "Ab=[0.3E-13,3.0000;1.0000,1.0000];yb=[2+0.1e-13;1.0000];\n", + "GaussNaive(Ab,yb)\n", + "Ab\\yb" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n", + "Aug =\n", + "\n", + " 1.000000000000000 1.000000000000000 1.000000000000000\n", + " 0.000000000000000 2.999999999999970 1.999999999999980\n", + "\n", + "npivots = 1\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Ab,yb)\n", + "Ab\\yb\n", + "format short" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = -3.0000\n", + "ans = 3.0000\n" + ] + } + ], + "source": [ + "% determinant is (-1)^(number_of_pivots)*diagonal_elements\n", + "det(Ab)\n", + "Aug(1,1)*Aug(2,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Spring-Mass System again\n", + "Now, 4 masses are connected in series to 4 springs with $K_{1}$=10 N/m, $K_{2}$=5 N/m, \n", + "$K_{3}$=2 N/m \n", + "and $K_{4}$=1 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_1+k_2 & -k_2 & 0 & 0 \\\\\n", + "-k_2 & k_2+k_3 & -k_3 & 0 \\\\\n", + "0 & -k_3 & k_3+k_4 & -k_4 \\\\\n", + "0 & 0 & -k_4 & k_4 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 15 -5 0 0\n", + " -5 7 -2 0\n", + " 0 -2 3 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; k2=5;k3=2;k4=1; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2, k2+k3, -k3 0; 0 -k3, k3+k4, -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Tridiagonal matrix\n", + "\n", + "This matrix, K, could be rewritten as 3 vectors e, f and g\n", + "\n", + "$e=\\left[ \\begin{array}{c}\n", + "0 \\\\\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\end{array} \\right]$\n", + "\n", + "$f=\\left[ \\begin{array}{c}\n", + "15 \\\\\n", + "7 \\\\\n", + "3 \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "$g=\\left[ \\begin{array}{c}\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\\\\n", + "0 \\end{array} \\right]$\n", + "\n", + "Where all other components are 0 and the length of the vectors are n and the first component of e and the last component of g are zero\n", + "\n", + "`e(1)=0` \n", + "\n", + "`g(end)=0`\n", + "\n", + "No need to pivot and number of calculations reduced enormously.\n", + "\n", + "|method |Number of Floating point operations for n$\\times$n-matrix|\n", + "|----------------|---------|\n", + "| Gauss | n-cubed |\n", + "| Tridiagonal | n |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100 27.4680 61.8030 101.0430\n", + "\n", + "ans =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n" + ] + } + ], + "source": [ + "e=[0;-5;-2;-1];\n", + "g=[-5;-2;-1;0];\n", + "f=[15;7;3;1];\n", + "Tridiag(e,f,g,y)\n", + "K\\y\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "% tic ... t=toc \n", + "% is Matlab timer used for debugging programs\n", + "t_GE = zeros(1,100);\n", + "t_GE_tridiag = zeros(1,100);\n", + "t_TD = zeros(1,100);\n", + "%for n = 1:200\n", + "for n=1:100\n", + " A = rand(n,n);\n", + " e = rand(n,1); e(1)=0;\n", + " f = rand(n,1);\n", + " g = rand(n,1); g(end)=0;\n", + " Atd=diag(f, 0) - diag(e(2:n), -1) - diag(g(1:n-1), 1);\n", + " b = rand(n,1);\n", + " tic;\n", + " x = GaussPivot(A,b);\n", + " t_GE(n) = toc;\n", + " tic;\n", + " x = A\\b;\n", + " t_GE_tridiag(n) = toc;\n", + " tic;\n", + " x = Tridiag(e,f,g,b);\n", + " t_TD(n) = toc;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t101\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ttime (s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tnumber of elements\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tGauss elim\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tGauss elim\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tMatlab \\\n", + "\n", + "\t\n", + "\t\tMatlab \n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tTriDiag\n", + "\n", + "\t\n", + "\t\tTriDiag\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n=1:100;\n", + "loglog(n,t_GE,n,t_TD,n,t_GE_tridiag)\n", + "legend('Gauss elim','Matlab \\','TriDiag')\n", + "xlabel('number of elements')\n", + "ylabel('time (s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n", + "Aug =\n", + "\n", + " 15.00000 -5.00000 0.00000 0.00000 9.81000\n", + " 0.00000 5.33333 -2.00000 0.00000 22.89000\n", + " 0.00000 0.00000 2.25000 -1.00000 38.01375\n", + " 0.00000 0.00000 0.00000 0.55556 56.13500\n", + "\n", + "npivots = 0\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(K,y)" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/10_Gauss_elimination/10_Gauss_elimination.ipynb b/10_Gauss_elimination/10_Gauss_elimination.ipynb new file mode 100644 index 0000000..780de50 --- /dev/null +++ b/10_Gauss_elimination/10_Gauss_elimination.ipynb @@ -0,0 +1,1786 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Gauss Elimination\n", + "### Solving sets of equations with matrix operations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dimensions of unknown vector = degrees of freedom of the system \n", + "\n", + "- Given set of known outputs, $y_{1},~y_{2},~...y_{N}$ \n", + "- set of equations \n", + "- unknown inputs, $x_{1},~x_{2},~...x_{N}$, \n", + "- these can be written in a vector matrix format as:\n", + "\n", + "$y=Ax$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Example \n", + "\n", + "Consider a problem with 2 DOF:\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "$2x_{1}+x_{2}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "1 & 3 \\\\\n", + "2 & 1 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "The solution for $x_{1}$ and $x_{2}$ is the intersection of two lines:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t6\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t8\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x21=[-2:2];\n", + "x11=1-3*x21;\n", + "x21=[-2:2];\n", + "x22=1-2*x21;\n", + "plot(x11,x21,x21,x22)\n", + "xlabel('x_1')\n", + "ylabel('x_2')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.40000\n", + " 0.20000\n", + "\n" + ] + } + ], + "source": [ + "A=[1,3;2,1]; y=[1;1];\n", + "A\\y % matlab's Ax=y solution for x" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 3 Degrees of Freedom\n", + "\n", + "For a $3\\times3$ matrix, the solution is the intersection of the 3 planes.\n", + "\n", + "$10x_{1}+2x_{2}+x_{3}=1$\n", + "\n", + "$2x_{1}+x_{2}+x_{3}=1$\n", + "\n", + "$x_{1}+2x_{2}+10x_{3}=1$\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "10 & 2 & 1\\\\\n", + "2 & 1 & 1 \\\\\n", + "1 & 2 & 10\\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\\\\n", + "x_{3} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1 \\\\\n", + "1\\end{array}\\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t1.5\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t2\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t-10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t10\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\t30\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\tgnuplot_plot_1a\n", + "\n", + "\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_2a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_3a\n", + "\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n", + "\t\n", + "\tgnuplot_plot_4a\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\n", + "\t\t\n", + "\t\tx1\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx2\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tx3\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mesh(X11,X12,X13);\n", + "hold on;\n", + "mesh(X21,X22,X23)\n", + "mesh(X31,X32,X33)\n", + "x=[10,2, 1;2,1, 1; 1, 2, 10]\\[1;1;1];\n", + "plot3(x(1),x(2),x(3),'o')\n", + "xlabel('x1')\n", + "ylabel('x2')\n", + "zlabel('x3')\n", + "view(10,45)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## N>3 Degrees of Freedoms\n", + "\n", + "After 3 DOF problems, the solutions are described as *hyperplane* intersections. Which are even harder to visualize" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Gauss elimination\n", + "### Solving sets of equations systematically\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "2 & 1 & 1 & 1 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(2,:)-Ay(1,:)/5 = ([2 1 1 1]-1/5[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "1 & 2 & 10 & 1\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Ay(3,:)-Ay(1,:)/10 = ([1 2 10 1]-1/10[10 2 1 1])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 1.8 & 9.9 & 0.9\\end{array} \n", + "\\right] $" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Ay(3,:)-1.8\\*5/3\\*Ay(2,:) = ([0 1.8 9.9 0.9]-3\\*[0 3/5 4/5 4/5])\n", + "\n", + "$\\left[ \\begin{array}{ccc|c}\n", + " & A & & y \\\\\n", + "10 & 2 & 1 & 1\\\\\n", + "0 & 3/5 & 4/5 & 4/5 \\\\\n", + "0 & 0 & 7.5 & -1.5\\end{array} \n", + "\\right] $\n", + "\n", + "now, $7.5x_{3}=-1.5$ so $x_{3}=-\\frac{1}{5}$\n", + "\n", + "then, $3/5x_{2}+4/5(-1/5)=1$ so $x_{2}=\\frac{8}{5}$\n", + "\n", + "finally, $10x_{1}+2(8/5)+1(-\\frac{1}{5})=1$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Mass-spring example\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../09_Linear-Algebra/mass_springs.png)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 200 -100 0 0\n", + " -100 200 -100 0\n", + " 0 -100 200 -100\n", + " 0 0 -100 100\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=100; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K1 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 -100.00000 200.00000 -100.00000 29.43000\n", + " 0.00000 0.00000 -100.00000 100.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K1=[K y];\n", + "K1(2,:)=K1(1,:)/2+K1(2,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 0.00000 133.33333 -100.00000 45.78000\n", + " 0.00000 0.00000 -100.00000 100.00000 39.24000\n", + "\n" + ] + } + ], + "source": [ + "K2=K1;\n", + "K2(3,:)=K1(2,:)*100/150+K1(3,:)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K2 =\n", + "\n", + " 200.00000 -100.00000 0.00000 0.00000 9.81000\n", + " 0.00000 150.00000 -100.00000 0.00000 24.52500\n", + " 0.00000 0.00000 133.33333 -100.00000 45.78000\n", + " 0.00000 0.00000 0.00000 25.00000 73.57500\n", + "\n" + ] + } + ], + "source": [ + "K2(4,:)=-K2(3,:)*K2(4,3)/K2(3,3)+K2(4,:)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x4 = 2.9430\n", + "x3 = 2.5506\n", + "x2 = 1.8639\n", + "x1 = 0.98100\n" + ] + } + ], + "source": [ + "yp=K2(:,5);\n", + "x4=yp(4)/K2(4,4)\n", + "x3=(yp(3)-K2(3,4)*x4)/K2(3,3)\n", + "x2=(yp(2)-K2(2,3)*x3)/K2(2,2)\n", + "x1=(yp(1)-K2(1,2)*x2)/K2(1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.98100\n", + " 1.86390\n", + " 2.55060\n", + " 2.94300\n", + "\n" + ] + } + ], + "source": [ + "K\\y" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Automate Gauss Elimination\n", + "\n", + "We can automate Gauss elimination with a function whose input is A and y:\n", + "\n", + "`x=GaussNaive(A,y)`" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.98100\n", + " 1.86390\n", + " 2.55060\n", + " 2.94300\n", + "\n" + ] + } + ], + "source": [ + "x=GaussNaive(K,y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Problem (Diagonal element is zero)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "If a diagonal element is 0 or very small either:\n", + "\n", + "1. no solution found\n", + "2. errors are introduced \n", + "\n", + "Therefore, we would want to pivot before applying Gauss elimination\n", + "\n", + "Consider:\n", + "\n", + "(a) $\\left[ \\begin{array}{cccc}\n", + "0 & 2 & 3 \\\\\n", + "4 & 6 & 7 \\\\\n", + "2 & -3 & 6 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "8 \\\\\n", + "-3 \\\\\n", + "5\\end{array} \\right]$\n", + "\n", + "(b) $\\left[ \\begin{array}{cccc}\n", + "0.0003 & 3.0000 \\\\\n", + "1.0000 & 1.0000 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "2.0001 \\\\\n", + "1.0000 \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " NaN\n", + " NaN\n", + " NaN\n", + "\n", + "ans =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n" + ] + } + ], + "source": [ + "format short\n", + "Aa=[0,2,3;4,6,7;2,-3,6]; ya=[8;-3;5];\n", + "GaussNaive(Aa,ya)\n", + "Aa\\ya" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " -5.423913\n", + " 0.021739\n", + " 2.652174\n", + "\n", + "Aug =\n", + "\n", + " 4.00000 6.00000 7.00000 -3.00000\n", + " 0.00000 -6.00000 2.50000 6.50000\n", + " 0.00000 0.00000 3.83333 10.16667\n", + "\n", + "npivots = 2\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Aa,ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 0.325665420556713\n", + " 0.666666666666667\n", + "\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "format long\n", + "Ab=[0.3E-13,3.0000;1.0000,1.0000];yb=[2+0.1e-13;1.0000];\n", + "GaussNaive(Ab,yb)\n", + "Ab\\yb" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n", + "Aug =\n", + "\n", + " 1.000000000000000 1.000000000000000 1.000000000000000\n", + " 0.000000000000000 2.999999999999970 1.999999999999980\n", + "\n", + "npivots = 1\n", + "ans =\n", + "\n", + " 0.333333333333333\n", + " 0.666666666666667\n", + "\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(Ab,yb)\n", + "Ab\\yb\n", + "format short" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = -3.0000\n", + "ans = 3.0000\n" + ] + } + ], + "source": [ + "% determinant is (-1)^(number_of_pivots)*diagonal_elements\n", + "det(Ab)\n", + "Aug(1,1)*Aug(2,2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Spring-Mass System again\n", + "Now, 4 masses are connected in series to 4 springs with $K_{1}$=10 N/m, $K_{2}$=5 N/m, \n", + "$K_{3}$=2 N/m \n", + "and $K_{4}$=1 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses have the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k_{2}(x_{2}-x_{1})-k_{1}x_{1}=0$\n", + "\n", + "$m_{2}g+k_{3}(x_{3}-x_{2})-k_{2}(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k_{4}(x_{4}-x_{3})-k_{3}(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k_{4}(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "k_1+k_2 & -k_2 & 0 & 0 \\\\\n", + "-k_2 & k_2+k_3 & -k_3 & 0 \\\\\n", + "0 & -k_3 & k_3+k_4 & -k_4 \\\\\n", + "0 & 0 & -k_4 & k_4 \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 15 -5 0 0\n", + " -5 7 -2 0\n", + " 0 -2 3 -1\n", + " 0 0 -1 1\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k1=10; k2=5;k3=2;k4=1; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[k1+k2 -k2 0 0; -k2, k2+k3, -k3 0; 0 -k3, k3+k4, -k4; 0 0 -k4 k4]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Tridiagonal matrix\n", + "\n", + "This matrix, K, could be rewritten as 3 vectors e, f and g\n", + "\n", + "$e=\\left[ \\begin{array}{c}\n", + "0 \\\\\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\end{array} \\right]$\n", + "\n", + "$f=\\left[ \\begin{array}{c}\n", + "15 \\\\\n", + "7 \\\\\n", + "3 \\\\\n", + "1 \\end{array} \\right]$\n", + "\n", + "$g=\\left[ \\begin{array}{c}\n", + "-5 \\\\\n", + "-2 \\\\\n", + "-1 \\\\\n", + "0 \\end{array} \\right]$\n", + "\n", + "Where all other components are 0 and the length of the vectors are n and the first component of e and the last component of g are zero\n", + "\n", + "`e(1)=0` \n", + "\n", + "`g(end)=0`\n", + "\n", + "No need to pivot and number of calculations reduced enormously.\n", + "\n", + "|method |Number of Floating point operations for n$\\times$n-matrix|\n", + "|----------------|---------|\n", + "| Gauss | n-cubed |\n", + "| Tridiagonal | n |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 9.8100 27.4680 61.8030 101.0430\n", + "\n", + "ans =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n" + ] + } + ], + "source": [ + "e=[0;-5;-2;-1];\n", + "g=[-5;-2;-1;0];\n", + "f=[15;7;3;1];\n", + "Tridiag(e,f,g,y)\n", + "K\\y\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "% tic ... t=toc \n", + "% is Matlab timer used for debugging programs\n", + "t_GE = zeros(1,100);\n", + "t_GE_tridiag = zeros(1,100);\n", + "t_TD = zeros(1,100);\n", + "%for n = 1:200\n", + "for n=1:100\n", + " A = rand(n,n);\n", + " e = rand(n,1); e(1)=0;\n", + " f = rand(n,1);\n", + " g = rand(n,1); g(end)=0;\n", + " Atd=diag(f, 0) - diag(e(2:n), -1) - diag(g(1:n-1), 1);\n", + " b = rand(n,1);\n", + " tic;\n", + " x = GaussPivot(A,b);\n", + " t_GE(n) = toc;\n", + " tic;\n", + " x = A\\b;\n", + " t_GE_tridiag(n) = toc;\n", + " tic;\n", + " x = Tridiag(e,f,g,b);\n", + " t_TD(n) = toc;\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-5\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-4\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-3\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-2\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t10-1\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t101\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t102\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\t\n", + "\t\ttime (s)\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\tnumber of elements\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tGauss elim\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tGauss elim\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tMatlab \\\n", + "\n", + "\t\n", + "\t\tMatlab \n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tTriDiag\n", + "\n", + "\t\n", + "\t\tTriDiag\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n=1:100;\n", + "loglog(n,t_GE,n,t_TD,n,t_GE_tridiag)\n", + "legend('Gauss elim','Matlab \\','TriDiag')\n", + "xlabel('number of elements')\n", + "ylabel('time (s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x =\n", + "\n", + " 9.8100\n", + " 27.4680\n", + " 61.8030\n", + " 101.0430\n", + "\n", + "Aug =\n", + "\n", + " 15.00000 -5.00000 0.00000 0.00000 9.81000\n", + " 0.00000 5.33333 -2.00000 0.00000 22.89000\n", + " 0.00000 0.00000 2.25000 -1.00000 38.01375\n", + " 0.00000 0.00000 0.00000 0.55556 56.13500\n", + "\n", + "npivots = 0\n" + ] + } + ], + "source": [ + "[x,Aug,npivots]=GaussPivot(K,y)" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/10_Gauss_elimination/GaussNaive.m b/10_Gauss_elimination/GaussNaive.m new file mode 100644 index 0000000..d8c60d3 --- /dev/null +++ b/10_Gauss_elimination/GaussNaive.m @@ -0,0 +1,25 @@ +function [x,Aug] = GaussNaive(A,y) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n+1; +Aug = [A y]; +% forward elimination +for k = 1:n-1 + for i = k+1:n + factor = Aug(i,k)/Aug(k,k); + Aug(i,k:nb) = Aug(i,k:nb)-factor*Aug(k,k:nb); + end +end +% back substitution +x = zeros(n,1); +x(n) = Aug(n,nb)/Aug(n,n); +for i = n-1:-1:1 + x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +end diff --git a/10_Gauss_elimination/GaussPivot.m b/10_Gauss_elimination/GaussPivot.m new file mode 100644 index 0000000..20df9e8 --- /dev/null +++ b/10_Gauss_elimination/GaussPivot.m @@ -0,0 +1,33 @@ +function [x,Aug,npivots] = GaussPivot(A,b) +% GaussPivot: Gauss elimination pivoting +% x = GaussPivot(A,b): Gauss elimination with pivoting. +% input: +% A = coefficient matrix +% b = right hand side vector +% output: +% x = solution vector +[m,n]=size(A); +if m~=n, error('Matrix A must be square'); end +nb=n+1; +Aug=[A b]; +npivots=0; % initially no pivots used +% forward elimination +for k = 1:n-1 + % partial pivoting + [big,i]=max(abs(Aug(k:n,k))); + ipr=i+k-1; + if ipr~=k + npivots=npivots+1; % if the max is not the current index ipr, pivot count + Aug([k,ipr],:)=Aug([ipr,k],:); + end + for i = k+1:n + factor=Aug(i,k)/Aug(k,k); + Aug(i,k:nb)=Aug(i,k:nb)-factor*Aug(k,k:nb); + end +end +% back substitution +x=zeros(n,1); +x(n)=Aug(n,nb)/Aug(n,n); +for i = n-1:-1:1 + x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +end diff --git a/10_Gauss_elimination/Tridiag.m b/10_Gauss_elimination/Tridiag.m new file mode 100644 index 0000000..ac4ec9b --- /dev/null +++ b/10_Gauss_elimination/Tridiag.m @@ -0,0 +1,22 @@ +function x = Tridiag(e,f,g,r) +% Tridiag: Tridiagonal equation solver banded system +% x = Tridiag(e,f,g,r): Tridiagonal system solver. +% input: +% e = subdiagonal vector +% f = diagonal vector +% g = superdiagonal vector +% r = right hand side vector +% output: +% x = solution vector +n=length(f); +% forward elimination +for k = 2:n + factor = e(k)/f(k-1); + f(k) = f(k) - factor*g(k-1); + r(k) = r(k) - factor*r(k-1); +end +% back substitution +x(n) = r(n)/f(n); +for k = n-1:-1:1 + x(k) = (r(k)-g(k)*x(k+1))/f(k); +end diff --git a/10_Gauss_elimination/nohup.out b/10_Gauss_elimination/nohup.out new file mode 100644 index 0000000..e69de29 diff --git a/10_Gauss_elimination/octave-workspace b/10_Gauss_elimination/octave-workspace new file mode 100644 index 0000000000000000000000000000000000000000..08dd0b678f1471c24e0c082c478fe1a800224c16 GIT binary patch literal 47934 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' 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 lu" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=inv(L)*y; x=inv(U)*d; t_lu(N)=toc;\n", + "\n", + " tic; x=inv(A)*y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Spring-mass system\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use," + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/11_LU-decomposition/.ipynb_checkpoints/lecture_11-checkpoint.ipynb b/11_LU-decomposition/.ipynb_checkpoints/lecture_11-checkpoint.ipynb new file mode 100644 index 0000000..7f37020 --- /dev/null +++ b/11_LU-decomposition/.ipynb_checkpoints/lecture_11-checkpoint.ipynb @@ -0,0 +1,760 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# LU Decomposition\n", + "### efficient storage of matrices for solutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Consider equation set:\n", + "\n", + "$y=Ax$\n", + "\n", + "Assume that we can perform Gauss elimination and achieve this formula:\n", + "\n", + "$Ux=d$ \n", + "\n", + "$U$: upper triangular matrix derived from Gauss elimination \n", + "\n", + "$d$: is the set of dependent variables after Gauss elimination. \n", + "\n", + "Assume lower triangular matrix, $L$, exists \n", + "\n", + "- ones on the diagonal \n", + "- same dimensions as $U$ \n", + "- following is true:\n", + "\n", + "$L(Ux-d)=Ax-y=0$\n", + "\n", + "Now, $Ax=LUx$, so $A=LU$, and $y=Ld$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "f21=0.5\n", + "\n", + "A(2,1)=1-1 = 0 \n", + "\n", + "A(2,2)=3-0.5=2.5\n", + "\n", + "y(2)=1-0.5=0.5\n", + "\n", + "$L(Ux-d)=\n", + "\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0.5 & 1 \\end{array} \\right]\n", + "\\left(\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "0 & 2.5 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]-\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "0.5\\end{array}\\right]\\right)=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "L =\n", + "\n", + " 1.00000 0.00000\n", + " 0.50000 1.00000\n", + "\n", + "U =\n", + "\n", + " 2.00000 1.00000\n", + " 0.00000 2.50000\n", + "\n", + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3]\n", + "L=[1,0;0.5,1]\n", + "U=[2,1;0,2.5]\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 5.0000\n", + "ans = 1\n", + "ans = 5\n", + "ans = 5\n", + "ans = 5.0000\n" + ] + } + ], + "source": [ + "% what is the determinant of L, U and A?\n", + "\n", + "det(A)\n", + "det(L)\n", + "det(U)\n", + "det(L)*det(U)\n", + "det(L*U)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\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 lu" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0005\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0015\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=inv(L)*y; x=inv(U)*d; t_lu(N)=toc;\n", + "\n", + " tic; x=inv(A)*y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Spring-mass system\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use," + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/11_LU-decomposition/11_LU-decomposition.ipynb b/11_LU-decomposition/11_LU-decomposition.ipynb new file mode 100644 index 0000000..726d345 --- /dev/null +++ b/11_LU-decomposition/11_LU-decomposition.ipynb @@ -0,0 +1,760 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "%plot --format svg" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "setdefaults" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# LU Decomposition\n", + "### efficient storage of matrices for solutions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Consider equation set:\n", + "\n", + "$y=Ax$\n", + "\n", + "Assume that we can perform Gauss elimination and achieve this formula:\n", + "\n", + "$Ux=d$ \n", + "\n", + "$U$: upper triangular matrix derived from Gauss elimination \n", + "\n", + "$d$: is the set of dependent variables after Gauss elimination. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Assume lower triangular matrix, $L$, exists \n", + "\n", + "- ones on the diagonal \n", + "- same dimensions as $U$ \n", + "- following is true:\n", + "\n", + "$L(Ux-d)=Ax-y=0$\n", + "\n", + "Now, $Ax=LUx$, so $A=LU$, and $y=Ld$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "$2x_{1}+x_{2}=1$\n", + "\n", + "$x_{1}+3x_{2}=1$\n", + "\n", + "\n", + "$\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "1 & 3 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]=\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "1\\end{array}\\right]$\n", + "\n", + "f21=0.5\n", + "\n", + "A(2,1)=1-1 = 0 \n", + "\n", + "A(2,2)=3-0.5=2.5\n", + "\n", + "y(2)=1-0.5=0.5\n", + "\n", + "$L(Ux-d)=\n", + "\\left[ \\begin{array}{cc}\n", + "1 & 0 \\\\\n", + "0.5 & 1 \\end{array} \\right]\n", + "\\left(\\left[ \\begin{array}{cc}\n", + "2 & 1 \\\\\n", + "0 & 2.5 \\end{array} \\right]\n", + "\\left[\\begin{array}{c} \n", + "x_{1} \\\\ \n", + "x_{2} \\end{array}\\right]-\n", + "\\left[\\begin{array}{c} \n", + "1 \\\\\n", + "0.5\\end{array}\\right]\\right)=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 2 1\n", + " 1 3\n", + "\n", + "d =\n", + "\n", + " 1.00000\n", + " 0.50000\n", + "\n", + "y =\n", + "\n", + " 1\n", + " 1\n", + "\n" + ] + } + ], + "source": [ + "A=[2,1;1,3];\n", + "L=[1,0;0.5,1];\n", + "U=[2,1;0,2.5];\n", + "L*U\n", + "\n", + "d=[1;0.5]\n", + "y=L*d" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans = 5.0000\n", + "ans = 1\n", + "ans = 5\n", + "ans = 5\n", + "ans = 5.0000\n" + ] + } + ], + "source": [ + "% what is the determinant of L, U and A?\n", + "\n", + "det(A)\n", + "det(L)\n", + "det(U)\n", + "det(L)*det(U)\n", + "det(L*U)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Pivoting for LU factorization\n", + "\n", + "LU factorization uses the same method as Gauss elimination so it is also necessary to perform partial pivoting when creating the lower and upper triangular matrices. \n", + "\n", + "Matlab and Octave use pivoting in the command \n", + "\n", + "`[L,U,P]=lu(A)`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'lu' is a built-in function from the file libinterp/corefcn/lu.cc\n", + "\n", + " -- Built-in Function: [L, U] = lu (A)\n", + " -- Built-in Function: [L, U, P] = lu (A)\n", + " -- Built-in Function: [L, U, P, Q] = lu (S)\n", + " -- Built-in Function: [L, U, P, Q, R] = lu (S)\n", + " -- Built-in Function: [...] = lu (S, THRES)\n", + " -- Built-in Function: Y = lu (...)\n", + " -- Built-in Function: [...] = lu (..., \"vector\")\n", + " Compute the LU decomposition of A.\n", + "\n", + " If A is full subroutines from LAPACK are used and if A is sparse\n", + " then UMFPACK is used.\n", + "\n", + " The result is returned in a permuted form, according to the\n", + " optional return value P. For example, given the matrix 'a = [1, 2;\n", + " 3, 4]',\n", + "\n", + " [l, u, p] = lu (A)\n", + "\n", + " returns\n", + "\n", + " l =\n", + "\n", + " 1.00000 0.00000\n", + " 0.33333 1.00000\n", + "\n", + " u =\n", + "\n", + " 3.00000 4.00000\n", + " 0.00000 0.66667\n", + "\n", + " p =\n", + "\n", + " 0 1\n", + " 1 0\n", + "\n", + " The matrix is not required to be square.\n", + "\n", + " When called with two or three output arguments and a spare input\n", + " matrix, 'lu' does not attempt to perform sparsity preserving column\n", + " permutations. Called with a fourth output argument, the sparsity\n", + " preserving column transformation Q is returned, such that 'P * A *\n", + " Q = L * U'.\n", + "\n", + " Called with a fifth output argument and a sparse input matrix, 'lu'\n", + " attempts to use a scaling factor R on the input matrix such that 'P\n", + " * (R \\ A) * Q = L * U'. This typically leads to a sparser and more\n", + " stable factorization.\n", + "\n", + " An additional input argument THRES, that defines the pivoting\n", + " threshold can be given. THRES can be a scalar, in which case it\n", + " defines the UMFPACK pivoting tolerance for both symmetric and\n", + " unsymmetric cases. If THRES is a 2-element vector, then the first\n", + " element defines the pivoting tolerance for the unsymmetric UMFPACK\n", + " pivoting strategy and the second for the symmetric strategy. By\n", + " default, the values defined by 'spparms' are used ([0.1, 0.001]).\n", + "\n", + " Given the string argument \"vector\", 'lu' returns the values of P\n", + " and Q as vector values, such that for full matrix, 'A (P,:) = L *\n", + " U', and 'R(P,:) * A (:, Q) = L * U'.\n", + "\n", + " With two output arguments, returns the permuted forms of the upper\n", + " and lower triangular matrices, such that 'A = L * U'. With one\n", + " output argument Y, then the matrix returned by the LAPACK routines\n", + " is returned. If the input matrix is sparse then the matrix L is\n", + " embedded into U to give a return value similar to the full case.\n", + " For both full and sparse matrices, 'lu' loses the permutation\n", + " information.\n", + "\n", + " See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.\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 lu" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Gnuplot\n", + "Produced by GNUPLOT 5.0 patchlevel 3 \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\t\n", + "\t \n", + "\t \n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0002\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0004\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0006\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.0008\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0.001\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t0\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t20\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t40\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t60\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t80\n", + "\t\n", + "\n", + "\n", + "\t\t\n", + "\t\t100\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\tLU decomp\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\tLU decomp\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\tOctave \\\\\n", + "\n", + "\t\n", + "\t\tOctave \\\n", + "\t\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "% time LU solution vs backslash\n", + "t_lu=zeros(100,1);\n", + "t_bs=zeros(100,1);\n", + "for N=1:100\n", + " A=rand(N,N);\n", + " y=rand(N,1);\n", + " [L,U,P]=lu(A);\n", + "\n", + " tic; d=L\\y; x=U\\d; t_lu(N)=toc;\n", + "\n", + " tic; x=A\\y; t_bs(N)=toc;\n", + "end\n", + "plot([1:100],t_lu,[1:100],t_bs) \n", + "legend('LU decomp','Octave \\\\')\n", + "axis([0,100,0,0.001])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Spring-mass system\n", + "\n", + "4 masses are connected in series to 4 springs with K=10 N/m. What are the final positions of the masses? \n", + "\n", + "![Springs-masses](../lecture_09/mass_springs.svg)\n", + "\n", + "The masses haves the following amounts, 1, 2, 3, and 4 kg for masses 1-4. Using a FBD for each mass:\n", + "\n", + "$m_{1}g+k(x_{2}-x_{1})-kx_{1}=0$\n", + "\n", + "$m_{2}g+k(x_{3}-x_{2})-k(x_{2}-x_{1})=0$\n", + "\n", + "$m_{3}g+k(x_{4}-x_{3})-k(x_{3}-x_{2})=0$\n", + "\n", + "$m_{4}g-k(x_{4}-x_{3})=0$\n", + "\n", + "in matrix form:\n", + "\n", + "$\\left[ \\begin{array}{cccc}\n", + "2k & -k & 0 & 0 \\\\\n", + "-k & 2k & -k & 0 \\\\\n", + "0 & -k & 2k & -k \\\\\n", + "0 & 0 & -k & k \\end{array} \\right]\n", + "\\left[ \\begin{array}{c}\n", + "x_{1} \\\\\n", + "x_{2} \\\\\n", + "x_{3} \\\\\n", + "x_{4} \\end{array} \\right]=\n", + "\\left[ \\begin{array}{c}\n", + "m_{1}g \\\\\n", + "m_{2}g \\\\\n", + "m_{3}g \\\\\n", + "m_{4}g \\end{array} \\right]$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K =\n", + "\n", + " 20 -10 0 0\n", + " -10 20 -10 0\n", + " 0 -10 20 -10\n", + " 0 0 -10 10\n", + "\n", + "y =\n", + "\n", + " 9.8100\n", + " 19.6200\n", + " 29.4300\n", + " 39.2400\n", + "\n" + ] + } + ], + "source": [ + "k=10; % N/m\n", + "m1=1; % kg\n", + "m2=2;\n", + "m3=3;\n", + "m4=4;\n", + "g=9.81; % m/s^2\n", + "K=[2*k -k 0 0; -k 2*k -k 0; 0 -k 2*k -k; 0 0 -k k]\n", + "y=[m1*g;m2*g;m3*g;m4*g]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "This matrix, K, is symmetric. \n", + "\n", + "`K(i,j)==K(j,i)`\n", + "\n", + "Now we can use," + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Cholesky Factorization\n", + "\n", + "We can decompose the matrix, K into two matrices, $U$ and $U^{T}$, where\n", + "\n", + "$K=U^{T}U$\n", + "\n", + "each of the components of U can be calculated with the following equations:\n", + "\n", + "$u_{ii}=\\sqrt{a_{ii}-\\sum_{k=1}^{i-1}u_{ki}^{2}}$\n", + "\n", + "$u_{ij}=\\frac{a_{ij}-\\sum_{k=1}^{i-1}u_{ki}u_{kj}}{u_{ii}}$\n", + "\n", + "so for K" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u11 = 4.4721\n", + "u12 = -2.2361\n", + "u13 = 0\n", + "u14 = 0\n", + "u22 = 3.8730\n", + "u23 = -2.5820\n", + "u24 = 0\n", + "u33 = 3.6515\n", + "u34 = -2.7386\n", + "u44 = 1.5811\n", + "U =\n", + "\n", + " 4.47214 -2.23607 0.00000 0.00000\n", + " 0.00000 3.87298 -2.58199 0.00000\n", + " 0.00000 0.00000 3.65148 -2.73861\n", + " 0.00000 0.00000 0.00000 1.58114\n", + "\n" + ] + } + ], + "source": [ + "u11=sqrt(K(1,1))\n", + "u12=(K(1,2))/u11\n", + "u13=(K(1,3))/u11\n", + "u14=(K(1,4))/u11\n", + "u22=sqrt(K(2,2)-u12^2)\n", + "u23=(K(2,3)-u12*u13)/u22\n", + "u24=(K(2,4)-u12*u14)/u22\n", + "u33=sqrt(K(3,3)-u13^2-u23^2)\n", + "u34=(K(3,4)-u13*u14-u23*u24)/u33\n", + "u44=sqrt(K(4,4)-u14^2-u24^2-u34^2)\n", + "U=[u11,u12,u13,u14;0,u22,u23,u24;0,0,u33,u34;0,0,0,u44]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ans =\n", + "\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + " 1 1 1 1\n", + "\n" + ] + } + ], + "source": [ + "(U'*U)'==U'*U" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average time spent for Cholesky factored solution = 1.465964e-05+/-9.806001e-06\n", + "average time spent for backslash solution = 1.555967e-05+/-1.048561e-05\n" + ] + } + ], + "source": [ + "% time solution for Cholesky vs backslash\n", + "t_chol=zeros(1000,1);\n", + "t_bs=zeros(1000,1);\n", + "for i=1:1000\n", + " tic; d=U'*y; x=U\\d; t_chol(i)=toc;\n", + " tic; x=K\\y; t_bs(i)=toc;\n", + "end\n", + "fprintf('average time spent for Cholesky factored solution = %e+/-%e',mean(t_chol),std(t_chol))\n", + "\n", + "fprintf('average time spent for backslash solution = %e+/-%e',mean(t_bs),std(t_bs))" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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/11_LU-decomposition/LU_naive.m b/11_LU-decomposition/LU_naive.m new file mode 100644 index 0000000..92efde6 --- /dev/null +++ b/11_LU-decomposition/LU_naive.m @@ -0,0 +1,27 @@ +function [L, U] = LU_naive(A) +% GaussNaive: naive Gauss elimination +% x = GaussNaive(A,b): Gauss elimination without pivoting. +% input: +% A = coefficient matrix +% y = right hand side vector +% output: +% x = solution vector +[m,n] = size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +% forward elimination +for k = 1:n-1 + for i = k+1:n + fik = U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb) = U(i,k:nb)-fik*U(k,k:nb); + end +end +%% back substitution +%x = zeros(n,1); +%x(n) = Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/11_LU-decomposition/LU_pivot.m b/11_LU-decomposition/LU_pivot.m new file mode 100644 index 0000000..37abb26 --- /dev/null +++ b/11_LU-decomposition/LU_pivot.m @@ -0,0 +1,36 @@ +function [L,U,P] = LU_pivot(A) +% GaussPivot: Gauss elimination pivoting +% x = GaussPivot(A,b): Gauss elimination with pivoting. +% input: +% A = coefficient matrix +% b = right hand side vector +% output: +% x = solution vector +[m,n]=size(A); +if m~=n, error('Matrix A must be square'); end +nb = n; +L=diag(ones(n,1)); +U=A; +P=diag(ones(n,1)); +% forward elimination +for k = 1:n-1 + % partial pivoting + [big,i]=max(abs(U(k:n,k))); + ipr=i+k-1; + if ipr~=k + P([k,ipr],:)=P([ipr,k],:); % if the max is not the current index ipr, pivot count + %L([k,ipr],:)=L([ipr,k],:); + %U([k,ipr],:)=U([ipr,k],:); + end + for i = k+1:n + fik=U(i,k)/U(k,k); + L(i,k)=fik; + U(i,k:nb)=U(i,k:nb)-fik*U(k,k:nb); + end +end +% back substitution +%x=zeros(n,1); +%x(n)=Aug(n,nb)/Aug(n,n); +%for i = n-1:-1:1 +% x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i); +%end diff --git a/11_LU-decomposition/mass_springs.png b/11_LU-decomposition/mass_springs.png new file mode 100644 index 0000000000000000000000000000000000000000..259a33353fa69e0a9aae47f2b0c210b637748773 GIT binary patch literal 5031 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 literal 0 HcmV?d00001 diff --git a/11_LU-decomposition/mass_springs.svg b/11_LU-decomposition/mass_springs.svg new file mode 100644 index 0000000..2bec8a4 --- /dev/null +++ b/11_LU-decomposition/mass_springs.svg @@ -0,0 +1,214 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + m1 + m2 + m3 + + + m4 + + + + + + + + + diff --git a/11_LU-decomposition/octave-workspace b/11_LU-decomposition/octave-workspace new file mode 100644 index 0000000000000000000000000000000000000000..fdace261f089516e1fad3b11df944acdb6b16fc6 GIT binary patch literal 244789 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 T`|T{e?p?6{F{?_zg*^B#)p95i literal 0 HcmV?d00001