{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Table of Contents](table_of_contents.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Topic 7. Gram-Schmidt Orthogonalization\n", "Author: Jaron Ellingson, jaronce@byu.edu\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction\n", "\n", "Gram-Schmit Orthogonalization (sometimes refered to as the Gram-Schmidt Process) takes a set of vectors and finds an orthonormal basis which spans that set of vectors. The importance of the Gram-Schmidt Process lies in the fact that sometimes it is convienent to have an orthonormal basis for a set of vectors. Once you have an orthonormal basis, you can find the fourier decomposition, and other series representations such as spherical harmonics and Bessel functions. In addition, this process can be applied to other norm and inner product spaces such as $\\mathcal{L}_{2}$, which allows for finding an orthonormal set of functions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Explanation of the theory" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given a set of of vectors $\\textit{T}$ = $\\{\\textbf{p}_1,\\textbf{p}_2,\\dotso,\\textbf{p}_{n}\\}$ we want to find set of vectos $\\textit{T'}$ = $\\{\\textbf{e}_1,\\textbf{e}_2,\\dotso,\\textbf{e}_{n'}\\}$ with $n'\\leq n$ so that\n", "\n", "\\begin{equation}\n", "span\\{\\textbf{e}_1,\\textbf{e}_2,\\dotso,\\textbf{e}_{n'}\\} = span\\{\\textbf{p}_1,\\textbf{p}_2,\\dotso,\\textbf{p}_{n}\\}\n", "\\end{equation}\n", "and \n", "\\begin{equation}\n", "\\left\\langle \\textbf{e}_i,\\textbf{e}_j \\right\\rangle = \\delta_{i,j}\n", "\\end{equation}\n", "Assume that none of the $\\textbf{p}_i$ vectors are zero vectors." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The process will be developed stepwise. The norm $\\left\\lVert \\cdot \\right\\Vert$ is the induced norm.\n", "\n", "1. Normalize the first vector\n", "\\begin{equation}\n", "\\textbf{e}_1 = \\frac{\\textbf{p}_1}{\\left\\lVert \\textbf{p}_1 \\right\\Vert}\n", "\\end{equation} \n", "2. Compute the difference between the projection of $\\textbf{p}_2$ onto $\\textbf{q}_1$ and $\\textbf{p}_2$ by the orthogonality theorem, this is orthogonal to $\\textbf{p}_1$:\n", "\\begin{equation}\n", "\\textbf{q}_2 = \\textbf{p}_2 - \\left\\langle \\textbf{p}_2,\\textbf{e}_1 \\right\\rangle \\textbf{e}_1\n", "\\end{equation} \n", "If $\\textbf{q}_2 = 0$, then $\\textbf{e}_2 \\in span(\\textbf{e})_1$ and can be discarded; we well asume that such discards are done as necessary in what follows. If $\\textbf{q}_2 \\neq 0$,then normalize\n", "\\begin{equation}\n", "\\textbf{e}_2 = \\frac{\\textbf{q}_2}{\\left\\lVert \\textbf{q}_2 \\right\\Vert}\n", "\\end{equation} \n", "\n", "These steps are shown in the figure below." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-3, 3, -2, 2)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f35140d3898>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "plt.grid(False)\n", "plt.arrow(-1, -1, 2, 1.5, color=\"Red\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, -1, 3, 0, color=\"Red\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, -1, 2, 0, color=\"Green\", head_width=.1, length_includes_head=True)\n", "plt.arrow(1, -1, 0, 1.5, color=\"Black\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, -1, 0.75, 0, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, -1, 0, 0.75, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.text(-.5, -1.25,\"$e_1$\", color=\"Blue\",size=14)\n", "plt.text(-1.14, 0,\"$e_2$\", color=\"Blue\",size=14)\n", "plt.text(1.5, -1.25,\"$p_1$\", color=\"Red\",size=14)\n", "plt.text(.5, 0.5,\"$p_2$\", color=\"Red\",size=14)\n", "plt.text(1.1, 0.25,\"$q_2$\", color=\"Black\",size=14)\n", "#plt.text(1.1, 0.25,\"$q_2 = p_2 - proj_{p_1}(p_2)$\", color=\"Black\",size=14)\n", "plt.axis((-3, 3, -2, 2))\n", "#plt.axis('off')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. At the next stage, a vector orthongonal to $\\textbf{e}_1$ and $\\textbf{e}_2$ obained from the error between $\\textbf{p}_3$ and its projection onto span($\\textbf{e}_1,\\textbf{e}_2$):\n", "\n", "\\begin{equation}\n", "\\textbf{q}_3 = \\textbf{p}_3 - \\left\\langle \\textbf{p}_3,\\textbf{e}_1 \\right\\rangle \\textbf{e}_1 - \\left\\langle \\textbf{p}_3,\\textbf{e}_2 \\right\\rangle \\textbf{e}_2\n", "\\end{equation} \n", "\n", "This is normalized to produce $\\textbf{e}_3$\n", "\n", "\\begin{equation}\n", "\\textbf{e}_3 = \\frac{\\textbf{q}_3}{\\left\\lVert \\textbf{q}_3 \\right\\Vert}\n", "\\end{equation} " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-3, 3, -2, 2)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmYVNW19/Hv6qabGUEgMsnVKEZQsJUOcSBXnCKOEIcoKkKiEl7FIYkxGCNc9F6NN0aNV68JiKIRFFERB4iA4mVyYpQZAUVABQGZsaG71/vHLqWBbmio03W6q36f56mnT53aXXsVw1l19tlnbXN3REQk82TFHYCIiMRDCUBEJEMpAYiIZCglABGRDKUEICKSoZQAREQyVNIJwMwON7MJZjbfzOaZ2a2ltDEze9TMlpjZx2Z2UrL9iohIcqpF8B6FwO/cfYaZ1QWmm9k4d59fos15QKvE4yfAE4mfIiISk6TPANz9S3efkdjeDCwAmu/RrAvwrAfvA/XNrGmyfYuIyMGL4gzge2Z2BHAi8MEeLzUHVpR4vjKx78tS3qMX0Augdu3a7Y899tgoQxQRSWvTp09f6+6Ny9M2sgRgZnWAl4Hb3H3Twb6Puw8EBgLk5+f7tGnTIopQRCT9mdny8raNZBaQmeUQDv5D3f2VUpqsAg4v8bxFYp+IiMQkillABgwGFrj7Q2U0ew24NjEb6GRgo7vvNfwjIiKpE8UQ0GlAd2COmc1K7Psj0BLA3f8OjAbOB5YA24BfRtCviIgkIekE4O6TAdtPGwduSrYvERGJju4EFhHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZKpIEYGZPmdkaM5tbxuudzGyjmc1KPPpF0a+IiBy8KBaFBxgCPAY8u482k9z9woj6ExGRJEVyBuDuE4H1UbyXiIikRiqvAZxiZrPNbIyZHZfCfkVEpBRRDQHtzwzg39x9i5mdD7wKtCqtoZn1AnoBtGzZMkXhiYhknpScAbj7JnffktgeDeSYWaMy2g5093x3z2/cuHEqwhMRyUgpSQBm1sTMLLHdIdHvulT0LSIipYtkCMjMngc6AY3MbCXQH8gBcPe/A5cB/8/MCoHtwJXu7lH0LSIiByeSBODu3fbz+mOEaaIiIlJJ6E5gEZEMpQQgIpKhlABERDKUEoCISIZSAhARyVBKACIiGUoJQEQkQykBiIhkKCUAEZEMpQQgkoy1a8EMHn4YfvxjqFEDjjkGxo6NOzKR/VICEEnGrFnh55NPwgMPwMcfQ7t2cNVVsH17vLGJ7IcSgEgyZs2C7GwYORLOPDN8+3/gAVi3DhYuhPx8yMuD44+HQYPijlZkN6laEEYkPc2aBRddFA7836lXL/wsLoaJE6FWLdi6NSSBSy6Bhg3jiVVkDzoDEEnGrFlw4om775s6NVwLaN06HPwBCgrAPTxEKgklAEnaqlVw7bXhi239+nDppbB6ddxRpcC338KiReGbfkl//StceWU4+G/YACecAC1awO9/D41KXQhPJBZKAJKUTz+Fk06C5s1h8mR4990wMaZ377gjS4G5c8M3+uefh0mTQjLo3h2WLIH77w9t6teH2bPDH9SwYRmSGaWqUAKQpPTuDdddF453rVuH65133w1vvw0rVkCnTtCmTZgYM2JE3NFGbNYsaNUKBgyAbt3CUNA334Rk0KTJ7m0POyycCUyaFE+sIqWwyrwyY35+vk+bNi3uMKQMy5fDEUdAzZqQVeKrRFFRGP2YOzd84c3Lg6++gvbtYfFiqF07tpCj1acPrFkDL75Y+uurV4c/iLp1YeNGOO20cLbQtm1q45SMYmbT3T2/PG01C0gO2uzZYcLL9Ol7v5abC02bhgeEL8SNGsH69WmUAGbNgs6dy359+XLo1WvXxd+bb9bBXyqVqBaFfwq4EFjj7seX8roBfwPOB7YBPd19RhR9S3xycsLsxiZNoE6dfbedPj2cGRx+eGpiq3Du4aavO+4ou02HDrtuFBOphKK6BjAE2MdXIc4DWiUevYAnIupXYnTyydCgQbjuOXMmLF0K48bBTTftPjFm/fowS2jgwPhijZwZbNoEF18cdyQiBy2SBODuE4H1+2jSBXjWg/eB+mbWNIq+JT4NGsCYMWF4+4wzwlj/7beHGY/fXRMoKICuXaFvXzj11HjjrVLcYd48eOQRXunQgVlTp8YdkaShVF0DaA6sKPF8ZWLfl3s2NLNehLMEWrZsmZLg5ODl58M775T+mjv07BkqJHTvntKwqqaVK8P0qVGjwh9qYSGF27bREzitf3/GjBsXd4SSZirdRWB3HwgMhDALKOZwJAlTpsDw4WEK6Kuvhn3//Keug+7l9tvhhRdC/aBq1WDLlu9ferdGDYqACZMmsXnzZurWrRtfnJJ2UpUAVgElL/+1SOyTNNax4943ycoeiovD1NAvvtj7tZo1efrHP2b7pEnUrl2b119/nauuuir1MUraStWNYK8B11pwMrDR3fca/hHJOFlZ8NJLoaJoSbVqseOWWxg1fTruzpYtWxikaqISsUgSgJk9D7wH/MjMVprZdWbW28y+KwgwGlgGLAEGATdG0a9IlbdjB/ziF2GObE5O2Fe9Opx6KuM7diS7RGJ47733+Oabb2IKVNJRVLOAurl7U3fPcfcW7j7Y3f/u7n9PvO7ufpO7H+Xubd1dt/eKDB8eDvYrV4aLJP/2b2F6aePG8PLLDH76aTZt2vR982rVqjFy5MgYA5Z0o1pAIqm2ZUsY8rnyyjB3trAQunSBl18OhZPGjePb3FzGjBmz269t3bpVw0ASKSUAkVT63/8NtYGKi8O6ATNn7hr/b9cuFFA69lgmTpzIzp07qV27NtnZ2dSoUYNatWrx4YcfsnXr1ng/g6SNSjcNVCQtrV0bhnYAzj8f3ngjDPeUoVOnTjz55JO4O7/85S/JysriiSeeoGHDhtROm2JKEjedAYhUtH79dh38586FN9/c58EfIDc3lx49etCzZ08ATj31VHr27MlFF11UavvFixdzzjnnUKNGDY466ijGjBlDjRo1GD9+fJSfRNKMEoBIRfn883Cgv/deuP76MOxz3HGRd/PJJ5/QoUMH8vPzmTt3Lo8++ijXX389BQUF5OXlRd6fpA8lAJGoucMNN4RZPQCffQaDBu33W//B6tOnDxdffDH3338/Rx99NBdccAGdO3emefPmbN++nU6dOtGmTRvatWvHiLRblUeSoWsAIlGaP3/Xt/w//Sl8+69AK1asYOzYsUzfY1GG3NxcTjjhBKpVq8YjjzxCXl4eX331Fe3bt+f888/XdQQBdAYgFWDwYPjZz+KOIsXc4cILdx38v/66wg/+ADNnziQ7O5vjj999GY6PP/6YvLw8mjZt+v0wUJMmTWjUqBHr1++rcK9kEiUAidyjj8L48WEIPCO8/34o6fDmm/A//xOSQaNGKenazCguLmbnzp3f75syZQpTp07da/x/+vTpFBUVcXjarMojyVICkEitWAGLFoUlIV94Ie5oKlhREZx0EpxySkgAmzeHdYJTqH379uTm5tK3b1+WLVvGqFGjuO666wA44YQTvm+3fv16rr32Wgam1ao8kiwlAInUCy+Ea50FBWEoKG2NGRNKN8+cGap5FhXtf13MCtCsWTMGDx7MqFGjaNeuHUOGDOHGG2+kTp06HH300QAUFBTQtWtX+vbty6lalUdKUAKQSA0eDN9+G7Y//xyWLIk3nsgVFIRFkM8/Pyx9VlAQSjrE6Oqrr+bzzz9ny5YtjBw5kvXr19O2bVuysrJwd3r27MmZZ55Jd63KI3tQApDILF0Ky5fveu4evhynjaFDoUYNWL0a3norjHfl5sYd1V4+/vjj74d/pkyZwvDhw3n11VfJy8sjLy+POXPmxByhVBaaBiqRGTYsHPS/U1AATz0Fd98dX0yR2LwZ6tUL2x06hBo+e9bvr0Rmz57NHXfcAUDHjh0p1qo8UgYlAInM00+Hg35Jq1eHqfFt2sQTU9L+9je47baw/cEHIQFUckuXLo07BKkilAAkEjt3hoN/tWqhujHs2l6zpgomgDVr4LDDwnaXLjByZIXdySsSF10DkEjk5MCqVSERdOsW9u3cGRa86tQp1tAO3J137jr4L1gQFmvRwV/SkM4ARL7z2Wdw5JFhu3dveOKJWMMRqWhRrQnc2cwWmdkSM+tbyus9zexrM5uVeFwfRb8ikXCHX/5y18F/xQod/CUjJJ0AzCwbeBw4D2gDdDOz0kZ8h7t7XuLxZLL9ikRizpxwF++QIXDPPSEZtGgRd1QiKRHFEFAHYIm7LwMwsxeALsD8CN5bpGK4Q+fOMHZseL52LTRsGG9MIikWxRBQc2BFiecrE/v2dKmZfWxmL5lZmdWozKyXmU0zs2lff/11BOGJ7GHKlPCtf+zYMNTjroO/ZKRUzQJ6HTjC3dsB44Bnymro7gPdPd/d8xt/t4yeSBQKC+H446FjR6heHbZsCRd7RTJUFAlgFVDyG32LxL7vufs6d//uFqEngfYR9CtSfm+8EeaqzpsHI0aEgkVaFEUyXBTXAD4CWpnZkYQD/5XAVSUbmFlTd/8y8fRiYEEE/Yrs37ffQvPmsH59mOWzcGGlrN8jEoekzwDcvRDoA7xFOLC/6O7zzOweM7s40ewWM5tnZrOBW4CeyfYrsl/PPgs1a4aD/9tvw7JlOviLlBDJjWDuPhoYvce+fiW27wTujKIvkf3auBHq1w/bp50GEyeGi74ishv9r5D08uCDuw7+06bB5Mk6+IuUQaUgJD189RU0bRq2L78chg9X/R6R/dBXI6n6br9918F/8WJ48UUd/EXKQWcAUnUtXQqJdW+55ZZQu19Eyk0JQKoed+jePSzRCKEOdbNm8cYkUgVpCEiqllmzwkXdoUPhvvtCMtjj4L9qFVx7bajuUL8+XHppWJlMRHanBCBVQ3ExnHkmnHhieL5+fVi4ZQ+ffgonnRTu/Zo8Gd59N9R5U8UHkb0pAUjl93//FxZhnzABBg0K3/obNCi1ae/ecN11cP/90Lo15OWFRenffju8/vOfh1+97LIUxi9SSekagFReO3dC27awaBHUqRPGcWrVKrP58uWhwOekSfDoo7v2FxXt+rVbb4Vf/QqeKbMcoUjmUAKQymnUKOjaNWyPHLlrex9mz4Z69WD69L1f+64CRKdOYVhIRJQApLLZtg2aNIHNm+FHPworduXklOtXc3Jg69bw63XqVHCcImlA1wCk8hg8OJRo3rw5fE1fuLDcB3+Ak08O4/vdu8PMmeE2gXHj4KabwjVkEdmdzgAkft98A4ceGrY7dQpXbA+ifk+DBjBmDNxxB5xxRhj7/+EP4corVQ5IpDRKABKvP/9513TOmTPDtJ0k5OfDO+9EEJdIBlACkHh88UWYrA9w1VXw3HMpqd9z9tnhYvHWrdCiRVgc7JRTKrxbkUpJCUBS77bbdtXtWbIEjjoqZV2PH5+yrkQqPY2MSup88kn4lv+3v8Hvfhdu6ErhwV9EdqczAKl47nDFFWG8BeDLL8NczQpWUBAmEekCsEjpIvmvYWadzWyRmS0xs76lvF7dzIYnXv/AzI6Iol+pAmbMCEfgESPgL38JySAFB38IY/uNG8Ovfx1WhSwqSkm3IlVG0gnAzLKBx4HzgDZANzNrs0ez64Bv3P1o4GHggWT7lSqgY0do3z5sb9gQFm5JodWrQ824J5+ECy8MM0179AjXAXbuTGkoIpVSFENAHYAl7r4MwMxeALoA80u06QL8R2L7JeAxMzN39wj6l0pmw/ptQC1aTxkUVuo6pD6cnPo4vvgi/CwuDveWAfzzn6GyRHFxSAqPPQaNGqU+NpHKIIoE0BxYUeL5SuAnZbVx90Iz2wg0BNbu+WZm1gvoBdCyZcsIwpNUmjwZxrxVC7K2s7C4NXxJeFQS7lBYGB5z58K338YdkUh8Kt3lMXcf6O757p7fuHHjuMORA/D22/DTn8IRR8DazdvgPwz+wzj3n50pLnbcSemj5DoxtWpB9ephOYEHHgjrBsydG+4FEMlUUSSAVcDhJZ63SOwrtY2ZVQMOAdZF0LdUEqNHh5usjjsuHFwb1mqI93eeuOAJ3lr6Fln3ZDHl8ykpjalGDahWLdQIeugh+PzzcE365pt33YMmksmiSAAfAa3M7EgzywWuBF7bo81rQI/E9mXAOxr/Tx+vvAIXXBAOtHPn7v5a7/zebLlzC7nZuXR8uiNtn2hLYXFhSuKaPDlcCH7vvTAT6Ac/SEm3IlVG0gnA3QuBPsBbwALgRXefZ2b3mNnFiWaDgYZmtgT4LbDXVFGpmp5/Pqy5e/bZ4UBbmtq5tSn4UwEjLh/B3DVzybk3hzcXv1nhsTVtuqvGnIjszSrzF/H8/HyfNm1a3GFIGZ5+OqyudfHFYf2W8thRtINjHzuWTzd8SsOaDVn525XUqFajYgOt4syM008/nXe1ko2Ug5lNd/f88rStdBeBpWp44olw8O/WrfwHf4Dc7FyW3bqM8d3Hs277Omr+V02enf1sxQUqImVSApAD9tBDcOONcP31MGzYwb3HWT88i6J+RZx2+Gn0eLUHNsDY+O3GaAMVkX1SApADcu+9oY7bLbfAoEHJvVeWZTH5V5OZdkMY5qv/QH3+OvWvEUQpIuWhBCDldtdd0K8f9O27q5pzFNo3a09xv2Iua3MZt4+7HRtgrN6yOroORKRUSgBSLr/5Ddx3HwwYAPffH/37mxkjLh/Boj6LAGjy1ybcMe6O6DsSke8pAch+9eoFjzwSinn261exfR3T8Bi8v3Nzh5v5y9S/YAOMZd8sq9hORTKUEoDs0zXXhLH+xx5LbTHPR897lFW/DTeUH/XoUVzzyjVU5inLIlWREoCUqWtXGDoUBg+Gm25Kff/N6jbD+zv3nXkfQ+cMJeueLGZ/NTv1gcTuGjZtah13EJKGlACkVOecE+b3P/dcmO8fpzt/eifr71gPQN4/8jjzmTMp9uJ4g0qRsG7BE3z66fVxhyJpSAlA9nLqqWHRlJdegquvjjuaoEHNBnh/Z9BFg5jw2QSy78lm4vKJcYdV4d5+O/zcuLEtG3WbhERMCUB2065dqOnzxhuhxk9lc/1J17P1j1upk1uH04ecTuvHWqesuFwcnnoKoBZZWYWMHBl3NJJulADke0cdBXPmwLhxobpnZVUrpxab79zMyCtGsnDdQnLuzWHUwgOoR1FFFBTAm28CZFFUVIsnn4w7Ikk3SgCCeyiVvGxZWDz97LPjjqh8uh7blR1/2sGPGv6IrsO7Uu/+emzfuT3usCLzr39Bdvau59OmwTqtoiERUgLIQOPHQ+fOYcF0d6hdG77+Gt5/P6zoVZXkZOewsM9C3u3xLpt3bKbWfbV4auZTcYcVicGDd61lDGFxm5dfji8eST8qB51hiouhVStYvhyOPBKWLAn7Z8wIyyVWZcVezFnPnsW7n70LwDd/+Ib6NerHG9RB2rYNGjbce83i/Hz46KN4YpKqQeWgpUwvvRRWySoqgs8+C/vGj6/6B38IxeUm9JjAzF/PBKDBAw14YPIDMUd1cCZPDgvX16sHUERWVgF16oREvXVr3NFJutAZQAYpKgrf+les2LWvWjVo0gQ++GD3RdSrOnfnmpHXMGxOqFf9xW+/oGndpjFHVX6FhfDaa2GI7rLLIDt7K8OH1+bQQ+GMM+KOTioznQFIqYYNC+P+JRUWwldfwQsvxBNTRTEzhl4ylCU3hzGuZg814zf/+k3MUZVftWpwySW7puLWqfMJl16qg79EK6kEYGaHmtk4M/sk8bNBGe2KzGxW4rHngvGSAjt3wh/+sPvwQe3a0Lo1jBwZqn2mo6MOPQrv7/zulN/xyAePYAOMT9Z9EndYIpVCsmcAfYG33b0V8DZlL/a+3d3zEo+Ly2gjFWjIEL6/k7R2bcjLCwf+efPgwgvBLNbwKtyDP3uQL3/3JQDHPHYMV7x0hYrLScZLNgF0AZ5JbD8DdE3y/aQC7NgRFnPZvh1+8pNwc9HMmaHeT7of+EtqUqcJ3t/577P/mxfnvUjWPVnM+HJG3GGJxCbZBHCYu3+Z2P4KOKyMdjXMbJqZvW9m+0wSZtYr0Xba119/nWR4AuEg3707TJkS5vqffnrcEcXr96f9ng1/2ABA+4Ht+enTP82Y4nIiJe13FpCZjQealPLSXcAz7l6/RNtv3H2v6wBm1tzdV5nZD4F3gLPcfen+gtMsIKloz8x6hp6jegLwzrXvcMaRle8qqxkccsgsNmzIizsUqQIinQXk7me7+/GlPEYBq82saaLTpsCaMt5jVeLnMuBdIA1mnUs66JHXg21/3MahNQ/lzGfP5OhHj2Zn0c64wxJJiWSHgF4DeiS2ewB7VeQyswZmVj2x3Qg4DZifZL8ZbdUquPbacKdo/fphquBqraF+0Grm1GTdHet4vdvrLP1mKbn/mcvL81VzQdJfsgngz8A5ZvYJcHbiOWaWb2bf1S5sDUwzs9nABODP7q4EcJA+/RROOgmaNw93i777LqxdC717xx1Z1XfhMRey8+6dHNf4OC4bcRk1/rMGW3fotltJX7oTuIo591xo3x7uu2/XvvHjw01Dn38eKnkWFobHrbfCDTfEF2tVNvnzyfz06VAZ7x8X/oNe7XvFFouuAciBOJBrAEoAVcjy5XDEEVCzJmSVOHcrKoJatWDNmlBDvlatcMPX8ceHEsING8YWcpXm7pz73LmMWzYOgHV3rOPQmoemPA4lADkQB5IAqlV0MBKd2bNDcbDp0/d+LTc31I6vVSs8LygIdWQqcX6v9MyMsd3HMmf1HNr9vR0N/7sh955xL3/69z/FHZpIJFQLqArJyQnf7Js0gaOP3v3RsmVos2EDnHACtGgBv/89NGoUb8zpoO1hbSnuV0zPvJ7cPeFubICxatOquMMSSZoSQBVy8snQoEG4qWvmTFi6NCzfeNNNoc4/hFlBs2eHi8XDhml2UFTMjKe7PM2yW5YB0OLhFvQZ3SfmqESSowRQhTRoAGPGhJo+Z5wR6vncfnv4tp+1x9/kYYeFM4FJk+KJNV0d2eBIvL/T97S+PP7R49gAY9HaRXGHJXJQdBE4jaxeHa4B1K0bksRpp8Hzz0PbtnFHlp7WbF3DYQ+G6iddj+3KK794BauA4kq6CCwHQusBZKjly8OaviecEH7efLMO/hXpB7V/gPd3Hj73YV5d+CpZ92Tx0Sqt1yhVh84ARCKwqWATh/z5EAA6NO/Ae9e9R5ZF8/1KZwByIHQGIJJi9arXw/s7z/38OT5c9SHZ92Qzftn4uMMS2SclAJEIXd3uar6961sOq30Y5/zzHFo+3JIdRTviDkukVEoAIhGrXq06X93+FaOvGs2KTSuo/p/VGT53eNxhiexFCUCkgpzX6jwK7y7kxCYncuXLV5J9TzZbdmyJOyyR7ykBiFSg7KxsZvx6BlN/NZViL6bu/XV5/MPH4w5LBFACEEmJUw4/heJ+xVzQ6gL6jOmDDTDWblsbd1iS4ZQARFLEzHjjqjeYd+M8ABr/pTH9JvT7/vWVm1byixG/YPUW1e+Q1FACEEmxNo3bUNyvmBtOuoF7J96LDTCWb1jOFSOu4JUFr3DBsAu0LKWkhBKASAzMjIEXDWT5bcsBOOJvR/DRFx9R5EXM/3o+fcao0JxUPCUAkRi1PKQli/ssBmBncfjWv71wO899/BxDZg6JMTLJBEklADO73MzmmVmxmZV567GZdTazRWa2xMz6JtOnSDop9mIue/GyvcpGbNu5jRtH38j0L0pZ/UckIsmeAcwFLgEmltXAzLKBx4HzgDZANzNrk2S/ImnBMJrUbUK1rGrUq16PrBL/JbcXbqfz0M4xRifpLqklId19AbC/ErgdgCXuvizR9gWgCzA/mb5F0oGZ8dY1b7F953amrpjKmCVjeG3RayzfuJzq2dVZt21domXlLdooVVcq1gRuDqwo8Xwl8JOyGptZL6AXQMvv1jkUSXM1c2py1g/P4qwfnsWDP3uQ9dvXM+HTCby++HWG/WAIl3RtEXeIkob2mwDMbDzQpJSX7nL3UVEH5O4DgYEQykFH/f4iVcGhNQ/l0jaXcmmbSxnSNe5oJF3tNwG4+9lJ9rEKOLzE8xaJfSIiEqNUTAP9CGhlZkeaWS5wJfBaCvoVEZF9SHYa6M/NbCVwCvCmmb2V2N/MzEYDuHsh0Ad4C1gAvOju85ILW0REkpXsLKCRwMhS9n8BnF/i+WhgdDJ9iYhItHQnsIhIhlICEBHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUMmuCXy5mc0zs2Izy99Hu8/MbI6ZzTKzacn0KSIi0UhqTWBgLnAJ8I9ytD3D3dcm2Z+IiEQk2UXhFwCYWTTRiIhIyqTqGoADY81supn1SlGfIiKyD/s9AzCz8UCTUl66y91HlbOfju6+ysx+AIwzs4XuPrGM/noBvQBatmxZzrcXEZEDtd8E4O5nJ9uJu69K/FxjZiOBDkCpCcDdBwIDAfLz8z3ZvkVEpHQVPgRkZrXNrO5328DPCBePRUQkRslOA/25ma0ETgHeNLO3EvubmdnoRLPDgMlmNhv4EHjT3f+VTL8iIpK8ZGcBjQRGlrL/C+D8xPYy4IRk+hERkejpTmARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZSglARCRDKQGIiGQoJQARkQylBCAikqGUAEREMlSyi8L/xcwWmtnHZjbSzOqX0a6zmS0ysyVm1jeZPkVEJBrJngGMA45393bAYuDOPRuYWTbwOHAe0AboZmZtkuxXRESSlFQCcPex7l6YePo+0KKUZh2AJe6+zN13AC8AXZLpV0REklctwvf6FTC8lP3NgRUlnq8EflKdoaJPAAADiUlEQVTWm5hZL6BX4mmBmc2NLMLKpRGwNu4gKpA+X9Wmz1d1/ai8DfebAMxsPNCklJfucvdRiTZ3AYXA0PJ2XBZ3HwgMTLzvNHfPT/Y9K6N0/mygz1fV6fNVXWY2rbxt95sA3P3s/XTWE7gQOMvdvZQmq4DDSzxvkdgnIiIxSnYWUGfgDuBid99WRrOPgFZmdqSZ5QJXAq8l06+IiCQv2VlAjwF1gXFmNsvM/g5gZs3MbDRA4iJxH+AtYAHworvPK+f7D0wyvsosnT8b6PNVdfp8VVe5P5uVPmojIiLpTncCi4hkKCUAEZEMVakTgJndmygzMcvMxppZs7hjilJ5S2lUVWZ2uZnNM7NiM0uLKXfpXtbEzJ4yszXpeP+NmR1uZhPMbH7i3+WtcccUJTOrYWYfmtnsxOcbsN/fqczXAMysnrtvSmzfArRx994xhxUZM/sZ8I67F5rZAwDu/oeYw4qMmbUGioF/ALe7e7nnJ1dGibImi4FzCDc0fgR0c/f5sQYWITP7d2AL8Ky7Hx93PFEys6ZAU3efYWZ1gelA13T5+zMzA2q7+xYzywEmA7e6+/tl/U6lPgP47uCfUBuovNnqIJSzlEaV5e4L3H1R3HFEKO3Lmrj7RGB93HFUBHf/0t1nJLY3E2YlNo83quh4sCXxNCfx2Ocxs1InAAAz+y8zWwFcDfSLO54K9CtgTNxByD6VVtYkbQ4gmcTMjgBOBD6IN5JomVm2mc0C1gDj3H2fny/2BGBm481sbimPLgDufpe7H04oM9En3mgP3P4+X6JNZKU0Uq08n0+kMjGzOsDLwG17jDJUee5e5O55hNGEDma2z2G8KIvBHZT9lZooYSgwGuhfgeFELoJSGpXaAfz9pQOVNaniEmPjLwND3f2VuOOpKO6+wcwmAJ2BMi/ox34GsC9m1qrE0y7AwrhiqQjlLKUhlYfKmlRhiYukg4EF7v5Q3PFEzcwafzeT0MxqEiYr7POYWdlnAb1MKG1aDCwHert72nzjMrMlQHVgXWLX+2k2y+nnwP8AjYENwCx3PzfeqJJjZucDjwDZwFPu/l8xhxQpM3se6EQol7wa6O/ug2MNKiJm1hGYBMwhHFMA/ujuo+OLKjpm1g54hvBvM4tQdueeff5OZU4AIiJScSr1EJCIiFQcJQARkQylBCAikqGUAEREMpQSgIhIhlICEBHJUEoAIiIZ6v8DpptyFp1t6igAAAAASUVORK5CYII=\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f34d758fe10>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.grid(False)\n", "plt.arrow(-1, 0, 1.5, 1, color=\"Red\", head_width=.1, length_includes_head=True)\n", "#plt.arrow(-1, -1, 3, 0, color=\"Red\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, 0, 1.5, -1, color=\"Green\", head_width=.1, length_includes_head=True)\n", "plt.arrow(0.5, -1, 0, 2, color=\"Black\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, 0, 0.75, 0, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, 0, -0.5, -0.5, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.arrow(-1, 0, 0, 0.75, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.arrow(0.5, -1, 0, 0.75, color=\"Blue\", head_width=.1, length_includes_head=True)\n", "plt.text(-.5, .15,\"$e_1$\", color=\"Blue\",size=14)\n", "plt.text(-1.14, 1,\"$e_2$\", color=\"Blue\",size=14)\n", "plt.text(-1.8, -.7,\"$e_3$\", color=\"Blue\",size=14)\n", "#plt.text(1.5, -1.25,\"$p_1$\", color=\"Red\",size=14)\n", "plt.text(0, 1.1,\"$p_3$\", color=\"Red\",size=14)\n", "plt.text(0.6, 0.7,\"$q_2$\", color=\"Black\",size=14)\n", "#plt.text(1.1, 0.25,\"$q_2 = p_2 - proj_{p_1}(p_2)$\", color=\"Black\",size=14)\n", "plt.axis((-3, 3, -2, 2))\n", "#plt.axis('off')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4. Now proceed inductively: To form the next orthongoanl vecotr using $\\textbf{p}_k$, determine the component orthongonal to all previously found vectors.\n", "\n", "\\begin{equation}\n", "\\textbf{q}_k = \\textbf{p}_k - \\sum_{i=1}^{k-1} \\left\\langle \\textbf{p}_k,\\textbf{e}_i \\right\\rangle \\textbf{e}_i\n", "\\end{equation}\n", "\n", "and normalize \n", "\n", "\\begin{equation}\n", "\\textbf{e}_k = \\frac{\\textbf{q}_k}{\\left\\lVert \\textbf{q}_k \\right\\Vert}\n", "\\end{equation} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple Numerical Examples\n", "\n", "### Example #1\n", "Given a set of vectors (shown here as test and test2), this function calculates the gram schmidt orthonormalization of the set. This example prints out the final results from the function.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.9486833 0.31622777]\n", " [-0.31622777 0.9486833 ]]\n", "[[ 0.70710678 0.70710678 0. ]\n", " [-0.57735027 0.57735027 0.57735027]\n", " [ 0.40824829 -0.40824829 0.81649658]]\n" ] } ], "source": [ "import numpy as np\n", "\n", "def gram_schmidt(vectors):\n", " basis = []\n", " for v in vectors:\n", " w = v - np.sum( np.dot(v,b)*b for b in basis )\n", " if (w > 1e-10).any(): \n", " basis.append(w/np.linalg.norm(w))\n", " return np.array(basis)\n", "\n", "test = np.array([[3.0, 1.0], [2.0, 2.0]])\n", "test2 = np.array([[1.0, 1.0, 0.0], [1.0, 3.0, 1.0], [2.0, -1.0, 1.0]])\n", "\n", "print(np.array(gram_schmidt(test)))\n", "print(np.array(gram_schmidt(test2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example #2\n", "The gram schmidt method can also be used for QR decomposition (A = Q\\*R). Where Q (Q\\*transpose(Q) = Idenity) is a unitary matrix and R is an upper triangular matrix." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A = [[7452 1050 8608 1157]\n", " [3652 3175 1384 6425]\n", " [8434 204 7797 3573]\n", " [7642 7533 566 9293]]\n", "Q * R = [[7452. 1050. 8608. 1157.]\n", " [3652. 3175. 1384. 6425.]\n", " [8434. 204. 7797. 3573.]\n", " [7642. 7533. 566. 9293.]]\n", "Q = [[ 0.52905388 -0.31446399 0.74287648 -0.26334183]\n", " [ 0.25927332 0.28476492 0.25073724 0.88815377]\n", " [ 0.59877085 -0.51828775 -0.58984596 0.15790194]\n", " [ 0.54254291 0.74256256 -0.19325401 -0.34190778]]\n", "R = [[14085.52192856 5587.82432055 9888.62569001 9459.20589068]\n", " [ 0. 6061.93445714 -5933.59056943 6514.57147057]\n", " [ 0. 0. 2033.29041635 -1432.93427866]\n", " [ 0. 0. 0. 2788.53614384]]\n", "Q * Tranpose(Q) = [[ 1.00000000e+00 3.60822483e-16 1.17961196e-16 -1.52655666e-16]\n", " [ 3.60822483e-16 1.00000000e+00 4.44089210e-16 -2.77555756e-16]\n", " [ 1.17961196e-16 4.44089210e-16 1.00000000e+00 -2.01227923e-16]\n", " [-1.52655666e-16 -2.77555756e-16 -2.01227923e-16 1.00000000e+00]]\n" ] } ], "source": [ "def gram_schmidt(A,verbose=False):\n", " m = A.shape[0]\n", " n = A.shape[1]\n", " R=np.zeros([m,n])\n", " Q=np.zeros([m,m])\n", " R[0,0]=np.linalg.norm(A[:,0])\n", " if R[0, 0] == 0:\n", " print (\"cannot complete Gram_Schimidt decomposition\")\n", " else:\n", " Q[:,0]=A[:,0]/R[0,0]\n", " for i in range(1,n):\n", " Q[:,i]=A[:,i]\n", " for j in range(i):\n", " R[j,i]=np.dot(Q[:,j].T,Q[:,i])\n", " Q[:,i]-=R[j,i]*Q[:,j]\n", " R[i,i]=np.linalg.norm(Q[:,i])\n", " if R[i,i]==0:\n", " print(\"cannot complete Gram_Schimidt decomposition\")\n", " else:\n", " Q[:, i] = Q[:, i] / R[i, i]\n", " return Q,R\n", "\n", "A = np.random.randint(0,10000,(4,4))\n", "print(\"A = \", A)\n", "\n", "Q, R = gram_schmidt(A)\n", "print (\"Q * R = \", np.dot(Q, R))\n", "\n", "print(\"Q = \", Q)\n", "print(\"R = \", R)\n", "print(\"Q * Tranpose(Q) = \", np.dot(Q, np.transpose(Q)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## An Engineering Application\n", "\n", "This example gives the Chebyshev polynomials as a function of cos. These polynomials are simular to the Legendre polynomials but start with the set of functions: $\\{cos(x), cos(2x), ... cos(nx)\\}$. The Gram-Schmidt Orthonormalization will find the orthonormal functions which span this set.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x7f34d7526ac8>" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f35140dcf28>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def norm(vector,t):\n", " return np.sqrt(np.trapz(vector*vector,t))\n", "\n", "def inner(vector1,vector2,t):\n", " return np.trapz(vector1*vector2,t)\n", "\n", "N = 100000\n", "t = np.linspace(-1,1,N)\n", "p = np.zeros((N,5))\n", "for kk in range(5):\n", " p[:,kk] = np.cos(t*kk)\n", " \n", "e1 = p[:,0]/norm(p[:,0],t)\n", "q2 = p[:,1]-inner(p[:,1],e1,t)*e1\n", "e2 = q2/norm(q2,t)\n", "q3 = p[:,2]-inner(p[:,2],e2,t)*e2-inner(p[:,2],e1,t)*e1\n", "e3 = q3/norm(q3,t)\n", "q4 = p[:,3]-inner(p[:,3],e3,t)*e3-inner(p[:,3],e2,t)*e2-inner(p[:,3],e1,t)*e1\n", "e4 = q4/norm(q4,t)\n", "q5 = p[:,4]-inner(p[:,4],e4,t)*e4-inner(p[:,4],e3,t)*e3-inner(p[:,4],e2,t)*e2-inner(p[:,4],e1,t)*e1\n", "e5 = q5/norm(q5,t)\n", "\n", "plt.plot(t,e1,label='e_1')\n", "plt.plot(t,e2,label='e_2')\n", "plt.plot(t,e3,label='e_3')\n", "plt.plot(t,e4,label='e_4')\n", "plt.plot(t,e5,label='e_5')\n", "plt.grid()\n", "plt.legend()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Chebyshev and Legendre polynomials are important in many physics applications. One major example is shown in quantum phyisics where these polynomials appear as solutions to the Schrodinger equation. These polynomials allow for calculations of the wavefunctions for the hydrogen atom and for determining electrical potential in spherical coordinates." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 2 }