{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from __future__ import division\n", "\n", "import numpy as np\n", "import numpy.linalg as la" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "A = np.array([\n", " [3, 4, 5],\n", " [2, 3, 1],\n", " [9, 2, 7]\n", " ], dtype=np.float64)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "A = np.array([\n", " [1e-20, 1],\n", " [1, 1],\n", " ])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "n = A.shape[0]\n", "\n", "elim_matrices = []\n", "\n", "W = A\n", "\n", "for i in xrange(n-1):\n", " M = np.eye(n)\n", " M[i+1:, i] = -W[i+1:, i]/W[i,i]\n", " \n", " elim_matrices.append(M)\n", " \n", " W = np.dot(M, W)\n", " print \"--------------------------------------\"\n", " print \"column %d\" % i\n", " print \"--------------------------------------\"\n", " print \"elimination mat:\"\n", " print M\n", " print \"left over:\"\n", " print W" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "--------------------------------------\n", "column 0\n", "--------------------------------------\n", "elimination mat:\n", "[[ 1.00000000e+00 0.00000000e+00]\n", " [ -1.00000000e+20 1.00000000e+00]]\n", "left over:\n", "[[ 1.00000000e-20 1.00000000e+00]\n", " [ 0.00000000e+00 -1.00000000e+20]]\n" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "L = reduce(np.dot, [la.inv(M) for M in elim_matrices])\n", "U = W\n", "\n", "print \"L\"\n", "print L\n", "print \"U\"\n", "print U" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "L\n", "[[ 1.00000000e+00 -0.00000000e+00]\n", " [ 1.00000000e+20 1.00000000e+00]]\n", "U\n", "[[ 1.00000000e-20 1.00000000e+00]\n", " [ 0.00000000e+00 -1.00000000e+20]]\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "A_rebuilt = np.dot(L, U)\n", "A_rebuilt" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "array([[ 1.00000000e-20, 1.00000000e+00],\n", " [ 1.00000000e+00, 0.00000000e+00]])" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "la.norm(A_rebuilt - A)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "1.0" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Why is this a terrible algorithm? What is its cost?" ] } ], "metadata": {} } ] }