Skip to content

Instantly share code, notes, and snippets.

@hestiwahyuningsih
Created December 21, 2025 13:42
Show Gist options
  • Select an option

  • Save hestiwahyuningsih/ae1563bbfb24af5619265f0f2614caaa to your computer and use it in GitHub Desktop.

Select an option

Save hestiwahyuningsih/ae1563bbfb24af5619265f0f2614caaa to your computer and use it in GitHub Desktop.
Python external user defined functions
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
{
"cells": [
{
"cell_type": "code",
"execution_count": 19,
"id": "3470d8f7-30af-4cef-8711-83084da1c8e3",
"metadata": {},
"outputs": [],
"source": [
"# Coefficient\n",
"a = -1\n",
"b = 10\n",
"c = -9\n",
"\n",
"# Discrinant\n",
"D = b**2 - 4*a*c\n",
"\n",
"# Roots\n",
"x1 = (-b - D**0.5) / (2*a)\n",
"x2 = (-b + D**0.5) / (2*a)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "72bc9314-f4a6-4311-99c7-671ac22970ac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"y = -1x^2 + 10x + -9\n",
"x1 = 9.0\n",
"x2 = 1.0\n"
]
}
],
"source": [
"# Info\n",
"print(\"y = \", end='')\n",
"print(a, \"x^2 + \", sep='', end='')\n",
"print(b, \"x + \", c, sep='')\n",
"print(\"x1 = \", x1, sep='')\n",
"print(\"x2 = \", x2, sep='')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "850e04cb-36a9-444f-b50f-6ba02dafe76d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x = [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]\n",
"\n",
"y = [-9.0, -4.25, 0.0, 3.75, 7.0, 9.75, 12.0, 13.75, 15.0, 15.75, 16.0, 15.75, 15.0, 13.75, 12.0, 9.75, 7.0, 3.75, 0.0, -4.25, -9.0]\n"
]
}
],
"source": [
"# Data\n",
"x = [i*0.5 for i in range(0, 21)]\n",
"y = [a*i**2 + b*i + c for i in x]\n",
"print(\"x =\", x)\n",
"print()\n",
"print(\"y =\", y)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "c71d5080-2343-48a4-913f-7e56f7fea0e7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ttEPwtbPoJ9jBM9p+tlLCTffrIJffqmM0aOVdt99UmJizD6f8/qYCRkZFuX8YejQoTr77LNVpkwZzZ07V3379lXHjh2dr2fnX//6l/r163fE1ydMmKCiRYsq1pRauVKNe/fW/kKF9Kk9EYsX97pJAACfKpCSohYdOyppzx7N6d9fW844Q7Fqz549zoDH9u3bVaJEifgNPn369NETTzyR431++OEH1a5d+4ivjx49Wrfeeqt27dql5OTkPI/4VK1aVVu2bMmx444liU6bNk3NmjVTUm47snKQ2K2bCowapfTrrtP+8ePD1j6/CFc/g36OFTyn6WevJYbxfSeSz2d7/y5XrlyuwSfmp7ruuecedejQIcf71KhRI8uvN2jQQGlpaVq7dq1q1aqV5X0sEGUViuwHEok3znw97p490ltvOZeJXbookTf2yPQz8ox+jh76mn72TJcu0qhRSpw0SYm7dkmlS8fk8zmvjxfzwad8+fLO7VgsWbJEiYmJqlChgnzhvfcs0konnuguOAMAINLOOUc6/XTpu++kN9+U7rgjrvvcN7u65s2bp2HDhmnp0qVavXq13njjDWdhc7t27VQ6DOk0Jrz6qvuxY8d8LzADACBPbCt7qKZP6H0ojvnm3dOmqyZOnKjGjRvrtNNO02OPPeYEn5dfflm+8NNP0syZ7hMwl6k/AADCql0798SARYtsOiWuOzfmp7ryynZzzbciS341Zoz7sXlzqWpVr1sDAAiScuWk1q2ld95xixo+95zilW9GfHxt//7M4lGdO3vdGgBAEHXqlFlEd+9exSuCTzz47DPp11+lsmWlK67wujUAgCBq1sydcdi6VZo8WfGK4BMPQovJbI41m3pEAABEVIECmWtM43iRM8En1m3eLH34oXvNNBcAwEsd/go+n38u/e9/cfmzIPjEutdek9LSMusoAADglRo1pIsuiuuDSwk+scyeWKHhREZ7AACxtMh5zBgpPV3xhuATy775Rvr+e6lwYen6671uDQAAUps2UsmS7lTXF1/EXY8QfGJZaLTn6qvdJxkAAF4rUkS68ca4XeRM8IlVu3dLEye610xzAQBicbpr0iTpjz8UTwg+serdd6WdO6WTTpIaN/a6NQAAZDr7bOnMM6WUFGnCBMUTgk88HEhq53MBABArEhIyZyPibLqL4BOLfvxR+uor9wT29u29bg0A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tIPwrLbT7t276eII+fbbb/XSSy/pjDPOoI/DbOvWrTr//POdQxw/+eQTff/993r66adVunRp+jqM7MikESNG6IUXXnCOR7LPrQ7c888/Tz/nk7322nud/dGfFevn5557TiNHjtTXX3/tlKCx98W9e/cq4mw7OyKrfv36Gd26dTvw+f79+zOqVKmSMXjwYLo+Qn777Tcr05Axc+ZM+jgCdu7cmVGzZs2MadOmZTRu3Djj7rvvpp/D6P77789o1KgRfRphl112WUanTp0O+VqbNm0ybrzxRvo+jOy1eNKkSQc+T09Pz6hUqVLGk08+eeBr27Zty0hOTs548803MyKNEZ8I27dvnxYuXOgM44UkJiY6n8+bNy/S/3xgbd++3flYpkwZr5viSza6dtlllx3yvEb4fPjhhzrnnHPUtm1bZ+rWCraOGjWKLg6z8847T9OnT9ePP/7ofL506VLNnj1bl1xyCX0dQWvWrHFOVzj49cPO2LJlINF4X4ybys3xasuWLc48csWKFQ/5un2+fPlyz9rlZ+np6c6aE5sqqFOnjtfN8Z2JEyc6U7Y21YXIWL16tTMFY1PkDzzwgNPXd911lwoVKuRUpEd49OnTxzktvHbt2k71f3uttjMfb7zxRro4giz0mKzeF0PfiySCD3w5GrFs2TLnLzeE1/r163X33Xc766hsoT4iF95txGfQoEHO5zbiY89pWw9B8Amft99+W2+88YYmTJig0047zTkD0v5osgW59LN/MdUVYeXKlXP+kti0adMhX7fPK1WqFOl/PnC6d+/unNlmZ7idcMIJXjfHd2za1hbln3322SpYsKBzs4XltkjRru0vZuSf7XSxQ5cPduqppzqHNCN8evfu7Yz6XHfddc6uOTvkumfPns4uUURO6L3Pq/dFgk+E2dB0vXr1nHnkg/+as8/tMFWEh62fs9AzadIkffHFF872VITfxRdfrO+++875yzh0s5EJmxqwawv5yD+bpj28HIOtQ/nb3/5G94bRnj17nDWXB7PnsL1GI3Ls9dkCzsHvizblaLu7ovG+yFRXFNg8vQ2b2htE/fr1NWzYMGerX8eOHaPxzwdmesuGqydPnuzU8gnNE9uCOasRgfCwvj183ZRtQ7VaM6ynCh8bdbCFtzbVdc011zh1v15++WXnhvCxOjO2pqdatWrOVNfixYs1dOhQderUiW7Op127dumnn346ZEGz/XFkG06sv21KceDAgapZs6YThKyekk0xWg22iIv4vjE4nn/++Yxq1aplFCpUyNnePn/+fHomjOypnNVtzJgx9HOEsZ09Mj766KOMOnXqOFt8a9eunfHyyy9H6F8Krh07djilGOy1uXDhwhk1atTIePDBBzNSUlK8blrcmzFjRpavye3btz+wpf3hhx/OqFixovMcv/jiizNWrFgRlbYl2P9EPl4BAAB4jzU+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AAAgMAg+AHxt8+bNzknQduBnyNy5c1WoUKFDTocGEAyc1QXA9/797387pz5b4KlVq5bq1q2rVq1aOSdxAwgWgg+AQOjWrZs+//xznXPOOfruu+/07bffKjk52etmAYgygg+AQPjzzz9Vp04drV+/XgsXLtTpp5/udZMAeIA1PgACYdWqVfr111+Vnp6utWvXet0cAB5hxAeA7+3bt0/169d31vbYGp9hw4Y5010VKlTwumkAoozgA8D3evfurXfffVdLly5V8eLF1bhxY5UsWVJTpkzxumkAooypLgC+9uWXXzojPK+99ppKlCihxMRE5/qrr77SiBEjvG4egChjxAcAAAQGIz4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AACAwCD4AAEBB8f8VlrEGHI2sTwAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"plt.grid()\n",
"plt.ylim([-10, 20])\n",
"\n",
"plt.plot(x, y, '-sr')\n",
"plt.plot([0, 0], [0, 0], '--k')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "0f47ea8d-1805-4625-bfa8-3ffd85936086",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Discriminant = 1\n",
"Roots: 2.0 1.0\n"
]
}
],
"source": [
"# TASK 1\n",
"# Part 1 without user defined function\n",
"\n",
"# Example: solving quadratic equation ax^2 + bx + c = 0\n",
"a = 1\n",
"b = -3\n",
"c = 2\n",
"\n",
"D = b**2 - 4*a*c\n",
"x1 = (-b + D**0.5)/(2*a)\n",
"x2 = (-b - D**0.5)/(2*a)\n",
"\n",
"print(\"Discriminant =\", D)\n",
"print(\"Roots:\", x1, x2)\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "c0d6336c-d9b1-4995-b6f9-c37343824070",
"metadata": {},
"outputs": [],
"source": [
"def roots_quadratics(coefs):\n",
" # Coefficient\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" # Discrinant\n",
" D = b**2 - 4*a*c\n",
" \n",
" # Roots\n",
" x1 = (-b - D**0.5) / (2*a)\n",
" x2 = (-b + D**0.5) / (2*a)\n",
"\n",
" return x1, x2"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "1b8b7de4-7fec-4420-b6e2-f204748e0257",
"metadata": {},
"outputs": [],
"source": [
"def data_quadratics(xmin, N, dx, coefs):\n",
" # Coefficient\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" # List for x\n",
" x = [i*dx for i in range (xmin, N+1)]\n",
"\n",
" # list for y\n",
" y = [a*i**2 + b*i + c for i in x]\n",
"\n",
" return x, y"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "7efa2bba-a4d6-42a1-af43-83816f146c4d",
"metadata": {},
"outputs": [],
"source": [
"def info_quadratics(coefs):\n",
" # Coefficient\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" x1, x2 = roots_quadratics(coefs)\n",
"\n",
" print(\"y = \", end='')\n",
" print(a, \"x^2 + \",sep='', end='')\n",
" print(b, \"x + \", c, sep='')\n",
" print(\"x1 = \", x1, sep='')\n",
" print(\"x2 = \", x2, sep='')"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "68dd094b-9b4d-4134-bb15-40ac101332cf",
"metadata": {},
"outputs": [],
"source": [
"def plot_quadratics(labels, data):\n",
" import matplotlib.pyplot as plt\n",
" \n",
" plt.xlabel(labels[0])\n",
" plt.ylabel(labels[1])\n",
" plt.grid()\n",
" plt.ylim([-10, 20])\n",
" \n",
" plt.plot(data[0], data[1], '-sr')\n",
" plt.plot([0, 10], [0, 0], '--k')\n",
" \n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "4d25c84a-374b-412e-8d46-f29e644cca3c",
"metadata": {},
"outputs": [
{
"ename": "RecursionError",
"evalue": "maximum recursion depth exceeded",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mRecursionError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[39]\u001b[39m\u001b[32m, line 8\u001b[39m\n\u001b[32m 5\u001b[39m coefs = [c, b, a]\n\u001b[32m 7\u001b[39m \u001b[38;5;66;03m# Calculate\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m x1, x2 = \u001b[43mroots_quadratics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoefs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[38;5;66;03m# Info\u001b[39;00m\n\u001b[32m 11\u001b[39m info_quadratics(coefs)\n",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 7\u001b[39m, in \u001b[36mroots_quadratics\u001b[39m\u001b[34m(coefs)\u001b[39m\n\u001b[32m 4\u001b[39m b = coefs[\u001b[32m1\u001b[39m]\n\u001b[32m 5\u001b[39m a = coefs[\u001b[32m2\u001b[39m]\n\u001b[32m----> \u001b[39m\u001b[32m7\u001b[39m x1, x2 = \u001b[43mroots_quadratics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoefs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33my = \u001b[39m\u001b[33m\"\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 10\u001b[39m \u001b[38;5;28mprint\u001b[39m(a, \u001b[33m\"\u001b[39m\u001b[33mx^2 + \u001b[39m\u001b[33m\"\u001b[39m,sep=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 7\u001b[39m, in \u001b[36mroots_quadratics\u001b[39m\u001b[34m(coefs)\u001b[39m\n\u001b[32m 4\u001b[39m b = coefs[\u001b[32m1\u001b[39m]\n\u001b[32m 5\u001b[39m a = coefs[\u001b[32m2\u001b[39m]\n\u001b[32m----> \u001b[39m\u001b[32m7\u001b[39m x1, x2 = \u001b[43mroots_quadratics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoefs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33my = \u001b[39m\u001b[33m\"\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 10\u001b[39m \u001b[38;5;28mprint\u001b[39m(a, \u001b[33m\"\u001b[39m\u001b[33mx^2 + \u001b[39m\u001b[33m\"\u001b[39m,sep=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n",
" \u001b[31m[... skipping similar frames: roots_quadratics at line 7 (2975 times)]\u001b[39m\n",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 7\u001b[39m, in \u001b[36mroots_quadratics\u001b[39m\u001b[34m(coefs)\u001b[39m\n\u001b[32m 4\u001b[39m b = coefs[\u001b[32m1\u001b[39m]\n\u001b[32m 5\u001b[39m a = coefs[\u001b[32m2\u001b[39m]\n\u001b[32m----> \u001b[39m\u001b[32m7\u001b[39m x1, x2 = \u001b[43mroots_quadratics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoefs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33my = \u001b[39m\u001b[33m\"\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 10\u001b[39m \u001b[38;5;28mprint\u001b[39m(a, \u001b[33m\"\u001b[39m\u001b[33mx^2 + \u001b[39m\u001b[33m\"\u001b[39m,sep=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m, end=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m)\n",
"\u001b[31mRecursionError\u001b[39m: maximum recursion depth exceeded"
]
}
],
"source": [
"# Coefficient\n",
"a = -1\n",
"b = 10\n",
"c = -9\n",
"coefs = [c, b, a]\n",
"\n",
"# Calculate\n",
"x1, x2 = roots_quadratics(coefs)\n",
"\n",
"# Info\n",
"info_quadratics(coefs)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "69ed42fd-06c7-40ac-9dea-4d7c27d00c39",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x = [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]\n",
"\n",
"y = [-9.0, -4.25, 0.0, 3.75, 7.0, 9.75, 12.0, 13.75, 15.0, 15.75, 16.0, 15.75, 15.0, 13.75, 12.0, 9.75, 7.0, 3.75, 0.0, -4.25, -9.0]\n"
]
}
],
"source": [
"# Data\n",
"x, y = data_quadratics(0, 20, 0.5, coefs)\n",
"\n",
"print(\"x =\", x)\n",
"print()\n",
"print(\"y =\", y)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "51ff0dc2-1e5b-417b-bac6-10a0060ca881",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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VnXavnnz5lq5cqUigcAnAt58801nWwxbwrdw4UKddtppzgaqlmwRofHll186OZvmzZvnJK60jfAst9OuXbto4jD57rvv9MILL+jUU0+ljUNsy5YtOuecc5xNHD/55BP9+OOPevLJJ3XUUUfR1iFkWyaNHDlSzz33nLM9kj23PHDPPvss7VxAdu21e5196M+JtfMzzzyjUaNG6ZtvvnFS0Nh9ce/evQo7W86O8GrYsGF69+7dM57v378/vVq1aulDhgyh6cPkzz//tDQN6V9++SVtHAY7duxIr127dvq0adPSmzZtmn7nnXfSziF07733pjdp0oQ2DbOLL744vUuXLtm+165du/TrrruOtg8huxZPmjQp4/mBAwfSq1Spkv74449nfG/r1q3pycnJ6W+88UZ6uNHjE2b79u3TggULnG68gMTEROf53Llzw/3rfWvbtm3O13LlynldlbhkvWsXX3xxtvMaofPBBx/ozDPPVPv27Z2hW0vY+tJLL9HEIXb22WdrxowZWrFihfN8yZIlmjVrli688ELaOoxWr17t7K6Q9fphe2zZNJBI3BdjJnNzrNq8ebMzjly5cuVs37fny5Yt86xe8ezAgQPOnBMbKqhXr57X1Yk7EydOdIZsbagL4bFq1SpnCMaGyO+77z6nre+44w4VKVLEyUiP0Ojbt6+zW3jdunWd7P92rbY9H6+77jqaOIws6DE53RcDPwsnAh/EZW/E0qVLnU9uCK1169bpzjvvdOZR2UR9hC94tx6fRx55xHluPT52Ttt8CAKf0Hnrrbf0+uuva8KECTr55JOdPSDtQ5NNyKWd4xdDXWFWoUIF55PExo0bs33fnlepUiXcv953evTo4ezZZnu4HXPMMV5XJ+7YsK1Nyj/jjDNUuHBh52ETy22Soh3bJ2YUnK10sU2XszrppJOcTZoROn369HF6fa6++mpn1Zxtct2rVy9nlSjCJ3Dv8+q+SOATZtY13aBBA2ccOeunOXtum6kiNGz+nAU9kyZN0ueff+4sT0XoXXDBBfrhhx+cT8aBh/VM2NCAHVuQj4KzYdqD0zHYPJRjjz2W5g2h3bt3O3Mus7Jz2K7RCB+7PluAk/W+aEOOtrorEvdFhroiwMbprdvUbhANGzbU8OHDnaV+nTt3jsSv983wlnVXT5482cnlExgntglzliMCoWFte/C8KVuGarlmmE8VOtbrYBNvbajryiuvdPJ+vfjii84DoWN5ZmxOT40aNZyhrkWLFmnYsGHq0qULzVxAO3fu1M8//5xtQrN9OLIFJ9beNqQ4ePBg1a5d2wmELJ+SDTFaDrawC/u6MTieffbZ9Bo1aqQXKVLEWd4+b948WiaE7FTO6TFmzBjaOcxYzh4eH374YXq9evWcJb5169ZNf/HFF8P0m/xr+/btTioGuzYXLVo0vVatWun3339/ekpKitdVi3kzZ87M8ZrcsWPHjCXtDzzwQHrlypWdc/yCCy5IX758eUTqlmD/CX94BQAA4D3m+AAAAN8g8AEAAL5B4AMAAHyDwAcAAPgGgQ8AAPANAh8AAOAbBD4AAMA3CHwAAIBvEPgAAADfIPABAAC+QeADIK5t2rTJ2QnaNvwMmDNnjooUKZJtd2gA/sBeXQDi3scff+zs+mwBT506dVS/fn21adPG2YkbgL8Q+ADwhe7du2v69Ok688wz9cMPP+i7775TcnKy19UCEGEEPgB8Yc+ePapXr57WrVunBQsW6JRTTvG6SgA8wBwfAL7wyy+/6I8//tCBAwe0Zs0ar6sDwCP0+ACIe/v27VPDhg2duT02x2f48OHOcFelSpW8rhqACCPwARD3+vTpo3feeUdLlixRyZIl1bRpU5UpU0ZTpkzxumoAIoyhLgBx7YsvvnB6eF599VWVLl1aiYmJzvHXX3+tkSNHel09ABFGjw8AAPANenwAAIBvEPgAAADfIPABAAC+QeADAAB8g8AHAAD4BoEPAADwDQIfAADgGwQ+AADANwh8AACAbxD4AAAA3yDwAQAAvkHgAwAA5Bf/D3ypazaRBxeGAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot\n",
"plot_quadratics([\"x\", \"y\"], [x, y])"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "719a6131-4991-4bb1-b98d-f0e20d904c28",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Discriminant = 1\n",
"Roots = (2.0, 1.0)\n"
]
}
],
"source": [
"# TASK 2\n",
"# part 2 with internal user defined functions\n",
"\n",
"def discriminant(a, b, c):\n",
" return b**2 - 4*a*c\n",
"\n",
"def roots(a, b, c):\n",
" D = discriminant(a, b, c)\n",
" x1 = (-b + D**0.5)/(2*a)\n",
" x2 = (-b - D**0.5)/(2*a)\n",
" return x1, x2\n",
"\n",
"a, b, c = 1, -3, 2\n",
"print(\"Discriminant =\", discriminant(a, b, c))\n",
"print(\"Roots =\", roots(a, b, c))"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "0cd5ca3c-02e7-460a-aa95-a21663833ea0",
"metadata": {},
"outputs": [],
"source": [
"# Roots of quadratics\n",
"def roots_quadratics(coefs):\n",
" # Coefficients\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" # Discrinant\n",
" D = b**2 - 4*a*c\n",
" \n",
" # Roots\n",
" x1 = (-b - D**0.5) / (2*a)\n",
" x2 = (-b + D**0.5) / (2*a)\n",
"\n",
" return x1, x2\n",
"\n",
"# Data of qudartics for plotting\n",
"def data_quadratics(xmin, N, dx, coefs):\n",
" # Coefficient\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" # List for x\n",
" x = [i*dx for i in range (xmin, N+1)]\n",
"\n",
" # list for y\n",
" y = [a*i**2 + b*i + c for i in x]\n",
"\n",
" return x, y\n",
"\n",
"# Info of quadratics\n",
"def info_quadratics(coefs):\n",
" # Coefficient\n",
" c = coefs[0]\n",
" b = coefs[1]\n",
" a = coefs[2]\n",
" \n",
" x1, x2 = roots_quadratics(coefs)\n",
"\n",
" print(\"y = \", end='')\n",
" print(a, \"x^2 + \",sep='', end='')\n",
" print(b, \"x + \", c, sep='')\n",
" print(\"x1 = \", x1, sep='')\n",
" print(\"x2 = \", x2, sep='')\n",
"\n",
"# Plot quadratics\n",
"def plot_quadratics(labels, data):\n",
" import matplotlib.pyplot as plt\n",
" \n",
" plt.xlabel(labels[0])\n",
" plt.ylabel(labels[1])\n",
" plt.grid()\n",
" plt.ylim([-10, 20])\n",
" \n",
" plt.plot(data[0], data[1], '-sr')\n",
" plt.plot([0, 10], [0, 0], '--k')\n",
" \n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "99224400-ce8c-4a1f-acff-7bb249842dc7",
"metadata": {},
"outputs": [],
"source": [
"# Task 3\n",
"# quadratics.py\n",
"\n",
"def discriminant(a, b, c):\n",
" return b**2 - 4*a*c\n",
"\n",
"def roots(a, b, c):\n",
" D = discriminant(a, b, c)\n",
" x1 = (-b + D**0.5)/(2*a)\n",
" x2 = (-b - D**0.5)/(2*a)\n",
" return x1, x2"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "aa60051b-41d4-4d6f-9006-e85438bc4a1b",
"metadata": {},
"outputs": [],
"source": [
"import quadratics as quad"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "afa162e0-eb73-4622-93b2-c06b7faceb46",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'quadratics' has no attribute 'roots_quadratics'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[46]\u001b[39m\u001b[32m, line 8\u001b[39m\n\u001b[32m 5\u001b[39m coefs = [c, b, a]\n\u001b[32m 7\u001b[39m \u001b[38;5;66;03m# Calculate\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m x1, x2 = \u001b[43mquad\u001b[49m\u001b[43m.\u001b[49m\u001b[43mroots_quadratics\u001b[49m(coefs)\n\u001b[32m 10\u001b[39m \u001b[38;5;66;03m# Info\u001b[39;00m\n\u001b[32m 11\u001b[39m quad.info_quadratics(coefs)\n",
"\u001b[31mAttributeError\u001b[39m: module 'quadratics' has no attribute 'roots_quadratics'"
]
}
],
"source": [
"# Coefficient\n",
"a = -1\n",
"b = 10\n",
"c = -9\n",
"coefs = [c, b, a]\n",
"\n",
"# Calculate\n",
"x1, x2 = quad.roots_quadratics(coefs)\n",
"\n",
"# Info\n",
"quad.info_quadratics(coefs)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "0c46e034-9c24-4a00-98b7-5bf7fd3c5fd1",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'quadratics' has no attribute 'data_quadratics'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[47]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# Data\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m x, y =\u001b[43mquad\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdata_quadratics\u001b[49m(\u001b[32m0\u001b[39m, \u001b[32m20\u001b[39m, \u001b[32m0.5\u001b[39m, coefs)\n\u001b[32m 4\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mx =\u001b[39m\u001b[33m\"\u001b[39m, x)\n\u001b[32m 5\u001b[39m \u001b[38;5;28mprint\u001b[39m()\n",
"\u001b[31mAttributeError\u001b[39m: module 'quadratics' has no attribute 'data_quadratics'"
]
}
],
"source": [
"# Data\n",
"x, y =quad.data_quadratics(0, 20, 0.5, coefs)\n",
"\n",
"print(\"x =\", x)\n",
"print()\n",
"print(\"y =\", y)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "99f5390d-f783-41e1-b98d-6ab4bfe93bcc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Discriminant = 1\n",
"Roots = (2.0, 1.0)\n"
]
}
],
"source": [
"# Task 4\n",
"# Part 3 with external user defined functions\n",
"\n",
"import quadratics\n",
"\n",
"a, b, c = 1, -3, 2\n",
"print(\"Discriminant =\", quadratics.discriminant(a, b, c))\n",
"print(\"Roots =\", quadratics.roots(a, b, c))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bc7726cc-4df0-4acd-a58d-6561869a63d2",
"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.13.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment