diff --git a/Project3/Proj3.ipynb b/Project3/Proj3.ipynb new file mode 100644 index 0000000..005d874 --- /dev/null +++ b/Project3/Proj3.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "23f024e6-7fe7-4481-8814-c65f0790b4e9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6e4f30b7-35a2-4201-b554-9bbdbfeb0c2a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numpy import linalg as LA" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bc3fd1a5-e8e3-4237-8a16-e16707b6fd44", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import timeit" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e5f36bac-6389-4bab-bea5-c72998ea6646", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "791d2933-2988-466d-b873-2e04202c9ee3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def eigenSolver(low, high, rows, cols):\n", + " eigenvalues, eigenvectors =LA.eig(np.random.randint(low = low, high= high, size=(rows, cols)))\n", + " return [eigenvalues, eigenvectors]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e4495147-8885-4813-8a74-59081c499947", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "low = 0\n", + "high = 10\n", + "rows = 2\n", + "cols = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "152054a6-0bc4-4437-ba88-bf519a6a4637", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + " time = timeit.repeat(lambda: eigenSolver(low, high, rows, cols), repeat = 100, number=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cb6e95e3-bca4-4ff2-8e67-c21caa6afede", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Time $\\\\mu$')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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5Ha79d577+m//uu/JElOp1NPPvmktm/frueee07vvvuufvazn0mSJk+erN/97neKjY0NHO8nP/lJm34ZYzRr1ixVVFRo7dq1ysvL02effabs7OxW7T777DO99tprevPNN/Xmm29q7dq1evTRR3totACcD04FArC9uLg4eTweRUVFKSUlJbB9yZIlGj9+vH79618Htv3xj39Uenq6du/erYsuukiSdMEFF+g3v/lNq32eOV9r2LBh+uUvf6kf/OAHevrpp+XxeBQXFyeHw9HqeGdbtWqVPvroI+3bt0/p6emSpL/85S+65JJL9OGHH+ryyy+XJPl8Pv35z39WTEyMJCknJ0fvvPOOHnnkkfMbGABBR8UKQJ9VUFCg1atXq1+/foHHyJEjJTVXifwmTJjQ5rWrV6/WV77yFQ0aNEgxMTG6/fbbdezYMZ06darTx9+5c6fS09MDoUqSMjMzFR8fr507dwa2DR06NBCqJCk1NVVlZWVdeq8AQoOKFYA+y+fz6atf/aoee+yxNs+lpqYG/j86OrrVcwcOHNDMmTM1Z84c/fKXv1T//v21fv16fe9731NjY2Onj2+MkcPh+NztYWFhrZ53OBzy+XydPg6A0CFYAegTPB6PvF5vq23jx49Xbm6uhg4dKre78/8cbtq0SU1NTfrtb38rp7O58P8///M/n3u8s2VmZqqoqEjFxcWBqtWOHTtUWVmpUaNGdbo/AHoPTgUC6BOGDh2qjRs3av/+/SovL5fP59OPfvQjVVRU6NZbb9UHH3ygvXv3auXKlfrud7/bYSgaMWKEmpqa9Pvf/1579+7VX/7yFz3zzDNtjnfy5Em98847Ki8vV01NTZv9XHfddRozZoy+853vaPPmzfrggw90++23a9q0ae2efgTQ+xGsAPQJP/nJT+RyuZSZmakBAwaoqKhIaWlpeu+99+T1ejVjxgyNHj1ac+fOVVxcXKAS1Z6xY8fq8ccf12OPPabRo0frhRde0KJFi1q1mTx5subMmaPs7GwNGDCgzeR3qfmU3muvvaaEhARNnTpV1113nYYPH65ly5YF/f0DCA2HMcZY3QkAAAA7oGIFAAAQJAQrAACAICFYAQAABAnBCgAAIEgIVgAAAEFCsAIAAAgSghUAAECQEKwAAACChGAFAAAQJAQrAACAICFYAQAABMn/D7yKUvWSqI8BAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(np.arange(0,100), time)\n", + "plt.xlabel(\"Iteration\")\n", + "plt.ylabel(\"Time $\\mu$\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0bc2a08-1a7b-4d03-95b7-4c97e26ac921", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/performance/timingGenSelfAdjEigenSolver.py b/performance/timingGenSelfAdjEigenSolver.py new file mode 100644 index 0000000..6cf5d1e --- /dev/null +++ b/performance/timingGenSelfAdjEigenSolver.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +import timeit + +import numpy as np +from numpy import linalg as LA +import plotting + + +# takes in a function and a list of matrix sizes N (for NxN matrices) and tests performance for each matrix +def calc_timing(func, sizes): + stats = np.zeros((len(sizes), 3)) # N, mean execution time, std execution time + rng = np.random.default_rng() + + for i, n in enumerate(sizes): + matrix = rng.random(size=(n, n)) + sym_pos_def = 0.5 * (matrix + matrix.T) + n * np.identity(n) # ensure matrix is symmetric positive definite + time = timeit.repeat(lambda sym_pos_def=sym_pos_def: func(sym_pos_def), repeat=10000,number=1) + stats[i] = [n, np.mean(time), np.std(time)] + + return stats + +results = calc_timing(lambda x: LA.eig(x), range(10, 50, 10)) +plotting.perf_plotting([results], ["Eigensolver"], "TestPlot")