diff --git a/lab1.ipynb b/lab1.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..0c8bca83a97eab24def0fcb4296da9b408eccf71
--- /dev/null
+++ b/lab1.ipynb
@@ -0,0 +1,254 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "from scipy import optimize\n",
+    "import matplotlib.pyplot as plt"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Some necessary libraries are imported."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def f(x):\n",
+    "    first_elm = np.dot(np.dot(x, Q), x)\n",
+    "    second_elm = np.dot(b, x)\n",
+    "    f_x = first_elm + second_elm + c\n",
+    "    return f_x"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Objective function has been defined in order to use the scipy.optimize later."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "global Q\n",
+    "global b\n",
+    "global c\n",
+    "\n",
+    "Q = np.loadtxt(\"Q.txt\")\n",
+    "b = np.loadtxt(\"b.txt\")\n",
+    "c = np.loadtxt(\"c.txt\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The matrices defining the objective function have been inputted as global variables."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "5\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(b.size)\n",
+    "n = b.size\n",
+    "err_tol = 1e-5\n",
+    "alpha = 1\n",
+    "# recommended sigma [10^-5, 10^-1]\n",
+    "sigma = 1e-1\n",
+    "# recommended beta [1/10, 1/2]\n",
+    "beta = 0.4\n",
+    "x = np.random.uniform(-1e4, 1e4, n)\n",
+    "gradient = np.add(np.dot(2, np.dot(Q, x)), b)\n",
+    "\n",
+    "alpha_arr = np.array([])\n",
+    "f_x_arr = np.array([])\n",
+    "x_arr = np.array([])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Initial guess is created and initial gradient is calculated."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0.06400000000000002\n",
+      "[-0.05708123  0.68024703 -0.0796436  -0.93631147 -0.16706706]\n",
+      "0.6922831525384057\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "while np.linalg.norm(gradient) >= err_tol:\n",
+    "    # Calculation of f(x_k)\n",
+    "    first_elm = np.dot(np.dot(x, Q), x)\n",
+    "    second_elm = np.dot(b, x)\n",
+    "    f_x = first_elm + second_elm + c\n",
+    "    \n",
+    "    alpha_arr = np.append(alpha_arr, alpha)\n",
+    "    f_x_arr = np.append(f_x_arr, f_x)\n",
+    "    x_arr = np.append(x_arr, x)\n",
+    "\n",
+    "    # Calculation of f(x_k - alpha*gradient(f(x)))\n",
+    "    x_ = np.subtract(x, alpha*gradient)\n",
+    "    first_elm_ = np.dot(np.dot(x_, Q), x_)\n",
+    "    second_elm_ = np.dot(b, x_)\n",
+    "    f_x_ = first_elm_ + second_elm_ + c\n",
+    "\n",
+    "\n",
+    "    # Armijo's rule for selecting step size\n",
+    "    while f_x_ > (f_x -  alpha*sigma*np.linalg.norm(gradient)*np.linalg.norm(gradient)):\n",
+    "        alpha = alpha*beta\n",
+    "\n",
+    "        # Calculation of f(x_k - alpha*gradient(f(x)))\n",
+    "        x_ = np.subtract(x, alpha * gradient)\n",
+    "        first_elm_ = np.dot(np.dot(x_, Q), x_)\n",
+    "        second_elm_ = np.dot(b, x_)\n",
+    "        f_x_ = first_elm_ + second_elm_ + c\n",
+    "\n",
+    "        \n",
+    "    # x and gradient are updated    \n",
+    "    x = x_\n",
+    "    gradient = np.add(np.dot(2, np.dot(Q, x)), b)\n",
+    "\n",
+    "    \n",
+    "print(alpha)    \n",
+    "print(x)\n",
+    "print(f_x)\n",
+    "\n",
+    "\n",
+    "plt.plot(alpha_arr)\n",
+    "plt.title(\"Alpha values over iterations\")\n",
+    "plt.show()\n",
+    "\n",
+    "plt.plot(f_x_arr)\n",
+    "plt.title(\"Function values over iterations\")\n",
+    "plt.show()\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[-0.05704387  0.68023741 -0.07965977 -0.93629827 -0.16708381]\n",
+      "0.692283152298834\n"
+     ]
+    }
+   ],
+   "source": [
+    "# matrix inversion\n",
+    "x_min = np.dot(np.linalg.inv(Q), -b/2)\n",
+    "print(x_min)\n",
+    "print(f(x_min))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Optimization terminated successfully.\n",
+      "         Current function value: 0.692283\n",
+      "         Iterations: 467\n",
+      "         Function evaluations: 765\n",
+      "[-0.05709283  0.68023614 -0.07964932 -0.93628897 -0.16705926]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# scipy optimization\n",
+    "x0 = np.random.uniform(-1e5, 1e5, n)\n",
+    "minimum = optimize.fmin(f, x0)\n",
+    "print(minimum)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.8.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}