├── .DS_Store
├── dataset pandas and numpy exercise
├── .DS_Store
├── cities.csv
└── tempratures.csv
├── LICENSE
├── .gitignore
├── Condition_Number.ipynb
├── Integration.ipynb
├── ODE_EQ.ipynb
├── numpy_exercise.ipynb
├── README.md
├── Sympy_exercise.ipynb
├── Stablity_and_Root_Finding.ipynb
├── Significant_Figures.ipynb
├── Regression.ipynb
└── newton_approach_root_finder.ipynb
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/khanmhmdi/Numerical-Analysis/HEAD/.DS_Store
--------------------------------------------------------------------------------
/dataset pandas and numpy exercise/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/khanmhmdi/Numerical-Analysis/HEAD/dataset pandas and numpy exercise/.DS_Store
--------------------------------------------------------------------------------
/dataset pandas and numpy exercise/cities.csv:
--------------------------------------------------------------------------------
1 | city,country,latitude,longitude
2 | New York,USA,40.7128,-74.0060
3 | Los Angles,USA,34.0522,-118.2437
4 | Chicago,USA,41.8781,-87.6298
5 | Houston,USA,29.7604,-95.3698
6 | Phoenix,USA,33.4484,-112.0740
7 | Philadelphia,USA,39.9526,-75.1652
8 | San Antonio,USA,29.4241,-98.4936
9 | San Diego,USA,32.7157,-117.1611
10 | Dallas,USA,32.7767,-96.7970
11 | San Jose,USA,37.3382,-121.8863
12 | Miami,USA,25.7617,-80.1918
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Mohamadreza Khanmohamadi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/dataset pandas and numpy exercise/tempratures.csv:
--------------------------------------------------------------------------------
1 | date,city,temperature
2 | 2022-01-01,New York,0.5
3 | 2022-01-01,Los Angeles,20.5
4 | 2022-01-01,Miami,24.7
5 | 2022-01-02,New York,2.3
6 | 2022-01-02,Los Angeles,18.4
7 | 2022-01-02,Miami,22.9
8 | 2022-01-03,New York,4.8
9 | 2022-01-03,Los Angeles,15.9
10 | 2022-01-03,Miami,21.2
11 | 2022-01-04,New York,3.2
12 | 2022-01-04,Los Angeles,16.1
13 | 2022-01-04,Miami,23.5
14 | 2022-01-05,New York,-1.9
15 | 2022-01-05,Los Angeles,22.8
16 | 2022-01-05,Miami,20.1
17 | 2022-01-06,New York,-2.1
18 | 2022-01-06,Los Angeles,23.5
19 | 2022-01-06,Miami,25.3
20 | 2022-01-07,New York,1.3
21 | 2022-01-07,Los Angeles,20.3
22 | 2022-01-07,Miami,21.8
23 | 2022-01-08,New York,4.2
24 | 2022-01-08,Los Angeles,19.7
25 | 2022-01-08,Miami,22.4
26 | 2022-01-09,New York,5.8
27 | 2022-01-09,Los Angeles,18.8
28 | 2022-01-09,Miami,20.5
29 | 2022-01-10,New York,-1.1
30 | 2022-01-10,Los Angeles,22.1
31 | 2022-01-10,Miami,23.1
32 | 2022-01-11,New York,-4.6
33 | 2022-01-11,Los Angeles,21.2
34 | 2022-01-11,Miami,25.8
35 | 2022-01-12,New York,-7.3
36 | 2022-01-12,Los Angeles,24.4
37 | 2022-01-12,Miami,22.6
38 | 2022-01-13,New York,-2.4
39 | 2022-01-13,Los Angeles,20.1
40 | 2022-01-13,Miami,19.7
41 | 2022-01-14,New York,1.5
42 | 2022-01-14,Los Angeles,21.5
43 | 2022-01-14,Miami,20.2
44 | 2022-01-15,New York,2.1
45 | 2022-01-15,Los Angeles,18.6
46 | 2022-01-15,Miami,21.5
47 | 2022-01-16,New York,-0.9
48 | 2022-01-16,Los Angeles,23.8
49 | 2022-01-16,Miami,23.9
50 | 2022-01-17,New York,-2.7
51 | 2022-01-17,Los Angeles,21.3
52 | 2022-01-17,Miami,25.3
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/Condition_Number.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Condition Number\n",
9 | "__Author__ : Mohammad Rouintan , 400222042\n",
10 | "\n",
11 | "__Course__ : Undergraduate Numerical Analysis Course"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 6,
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import numpy as np\n",
21 | "import pandas as pd\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "from sympy import *"
24 | ]
25 | },
26 | {
27 | "attachments": {},
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "## Problem \n",
32 | "Calculate condition numbers for given functions in given points:\n"
33 | ]
34 | },
35 | {
36 | "attachments": {},
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "### Part a)\n",
41 | "$f(x) = ln x, x≈2$"
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": 14,
47 | "metadata": {},
48 | "outputs": [
49 | {
50 | "name": "stdout",
51 | "output_type": "stream",
52 | "text": [
53 | "1/log(2)\n"
54 | ]
55 | }
56 | ],
57 | "source": [
58 | "x = symbols('x')\n",
59 | "f = ln(x)\n",
60 | "diff = f.diff(x)\n",
61 | "print(diff.subs(x, 2) / f.subs(x, 2) * 2)"
62 | ]
63 | },
64 | {
65 | "attachments": {},
66 | "cell_type": "markdown",
67 | "metadata": {},
68 | "source": [
69 | "### Part b)\n",
70 | "$f(x) = 5^{x},x≈10$"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 15,
76 | "metadata": {},
77 | "outputs": [
78 | {
79 | "name": "stdout",
80 | "output_type": "stream",
81 | "text": [
82 | "10*log(5)\n"
83 | ]
84 | }
85 | ],
86 | "source": [
87 | "x = symbols('x')\n",
88 | "f = 5 ** x\n",
89 | "diff = f.diff(x)\n",
90 | "print(diff.subs(x, 10) / f.subs(x, 10) * 10)"
91 | ]
92 | },
93 | {
94 | "attachments": {},
95 | "cell_type": "markdown",
96 | "metadata": {},
97 | "source": [
98 | "### Part c)\n",
99 | "$f(x)= \\sin{x},x≈1$"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 17,
105 | "metadata": {},
106 | "outputs": [
107 | {
108 | "name": "stdout",
109 | "output_type": "stream",
110 | "text": [
111 | "cos(1)/sin(1)\n"
112 | ]
113 | }
114 | ],
115 | "source": [
116 | "x = symbols('x')\n",
117 | "f = sin(x)\n",
118 | "diff = f.diff(x)\n",
119 | "print(diff.subs(x, 1) / f.subs(x, 1) * 1)"
120 | ]
121 | },
122 | {
123 | "attachments": {},
124 | "cell_type": "markdown",
125 | "metadata": {},
126 | "source": [
127 | "### Part d)\n",
128 | "$f(x)= \\sin{10x},x≈1$"
129 | ]
130 | },
131 | {
132 | "cell_type": "code",
133 | "execution_count": 18,
134 | "metadata": {},
135 | "outputs": [
136 | {
137 | "name": "stdout",
138 | "output_type": "stream",
139 | "text": [
140 | "10*cos(10)/sin(10)\n"
141 | ]
142 | }
143 | ],
144 | "source": [
145 | "x = symbols('x')\n",
146 | "f = sin(10 * x)\n",
147 | "diff = f.diff(x)\n",
148 | "print(diff.subs(x, 1) / f.subs(x, 1) * 1)"
149 | ]
150 | },
151 | {
152 | "attachments": {},
153 | "cell_type": "markdown",
154 | "metadata": {},
155 | "source": [
156 | "## Conclusion for this problem\n",
157 | "Write a conclusion and references which you've used in your homework"
158 | ]
159 | },
160 | {
161 | "cell_type": "code",
162 | "execution_count": null,
163 | "metadata": {},
164 | "outputs": [],
165 | "source": []
166 | }
167 | ],
168 | "metadata": {
169 | "kernelspec": {
170 | "display_name": "Python 3 (ipykernel)",
171 | "language": "python",
172 | "name": "python3"
173 | },
174 | "language_info": {
175 | "codemirror_mode": {
176 | "name": "ipython",
177 | "version": 3
178 | },
179 | "file_extension": ".py",
180 | "mimetype": "text/x-python",
181 | "name": "python",
182 | "nbconvert_exporter": "python",
183 | "pygments_lexer": "ipython3",
184 | "version": "3.9.12"
185 | },
186 | "orig_nbformat": 4,
187 | "vscode": {
188 | "interpreter": {
189 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
190 | }
191 | }
192 | },
193 | "nbformat": 4,
194 | "nbformat_minor": 2
195 | }
196 |
--------------------------------------------------------------------------------
/Integration.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Integration\n",
9 | "__Author__ : Mohammad Rouintan , 400222042\n",
10 | "\n",
11 | "__Course__ : Undergraduate Numerical Analysis Course"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 1,
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import numpy as np\n",
21 | "import pandas as pd\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "import sympy as sp"
24 | ]
25 | },
26 | {
27 | "attachments": {},
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "## Problem 1\n",
32 | "In Newton-Raphson methods, $\\int_{a}^{b} f(x)dx = \\sum w_jf(x_j)$. That means we consider integral equals by weighted sum of function $f$ in same distance points $x_j$ which are determined and we only need to determine weights.
\n",
33 | "\n",
34 | "Consider $x_j$ s as variable, for polynomials with degree zero and one calculate formula in template of $\\int_{-1}^{1} f(x)dx = w_1f(x)$ to achive highest precision.
"
35 | ]
36 | },
37 | {
38 | "attachments": {},
39 | "cell_type": "markdown",
40 | "metadata": {},
41 | "source": [
42 | "### Answer\n",
43 | "Because we only want to approximate with one point, we choose the middle point of the interval, that is, $x_1 = 0$\n",
44 | "$$\n",
45 | " \\begin{cases}\n",
46 | " f(x) = 1 \\Rightarrow w_1 \\times 1 = \\int_{-1}^{1} 1dx = 2\\\\\n",
47 | " f(x) = x \\Rightarrow w_1 \\times x_1 = \\int_{-1}^{1} xdx = 0\\\\\n",
48 | " \\end{cases}\n",
49 | "$$\n",
50 | "$$\n",
51 | "\\Rightarrow\n",
52 | " \\begin{cases}\n",
53 | " w_1 \\times 1 = 2\\\\\n",
54 | " w_1 \\times 0 = 0\\\\\n",
55 | " \\end{cases}\n",
56 | "$$\n",
57 | "$$\n",
58 | "\\Rightarrow\n",
59 | " w_1 = 2\n",
60 | "$$"
61 | ]
62 | },
63 | {
64 | "attachments": {},
65 | "cell_type": "markdown",
66 | "metadata": {},
67 | "source": [
68 | "## Problem 2\n",
69 | "Solve previous question for two points. $\\int_{-1}^{1} f(x)dx \\approx w_1f(x_1) + w_2f(x_2)$."
70 | ]
71 | },
72 | {
73 | "attachments": {},
74 | "cell_type": "markdown",
75 | "metadata": {},
76 | "source": [
77 | "### Answer\n",
78 | "Because we only want to approximate with two points, we choose the beginning and end points of the interval, that is $x_1 = -1 , x_2 = 1$\n",
79 | "$$\n",
80 | " \\begin{cases}\n",
81 | " f(x) = 1 \\Rightarrow w_1 \\times 1 + w_2 \\times 1 = \\int_{-1}^{1} 1dx = 2\\\\\n",
82 | " f(x) = x \\Rightarrow w_1 \\times x_1 + w_2 \\times x_2 = \\int_{-1}^{1} xdx = 0\\\\\n",
83 | " \\end{cases}\n",
84 | "$$\n",
85 | "$$\n",
86 | "\\Rightarrow\n",
87 | " \\begin{cases}\n",
88 | " w_1 \\times 1 + w_2 \\times 1 = 2\\\\\n",
89 | " w_1 \\times (-1) + w_2 \\times 1 = 0\\\\\n",
90 | " \\end{cases}\n",
91 | "$$\n",
92 | "$$\n",
93 | "\\Rightarrow\n",
94 | " \\begin{cases}\n",
95 | " w_1 + w_2 = 2\\\\\n",
96 | " -w_1 + w_2 = 0\\\\\n",
97 | " \\end{cases}\n",
98 | "$$\n",
99 | "$$\n",
100 | "\\Rightarrow\n",
101 | " w_1 = w_2 = 1\n",
102 | "$$"
103 | ]
104 | },
105 | {
106 | "attachments": {},
107 | "cell_type": "markdown",
108 | "metadata": {},
109 | "source": [
110 | "## Conclusion for this problem\n",
111 | "Write a conclusion and references which you've used in your homework"
112 | ]
113 | },
114 | {
115 | "cell_type": "code",
116 | "execution_count": null,
117 | "metadata": {},
118 | "outputs": [],
119 | "source": []
120 | }
121 | ],
122 | "metadata": {
123 | "kernelspec": {
124 | "display_name": "Python 3 (ipykernel)",
125 | "language": "python",
126 | "name": "python3"
127 | },
128 | "language_info": {
129 | "codemirror_mode": {
130 | "name": "ipython",
131 | "version": 3
132 | },
133 | "file_extension": ".py",
134 | "mimetype": "text/x-python",
135 | "name": "python",
136 | "nbconvert_exporter": "python",
137 | "pygments_lexer": "ipython3",
138 | "version": "3.9.12"
139 | },
140 | "orig_nbformat": 4,
141 | "vscode": {
142 | "interpreter": {
143 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
144 | }
145 | }
146 | },
147 | "nbformat": 4,
148 | "nbformat_minor": 2
149 | }
150 |
--------------------------------------------------------------------------------
/ODE_EQ.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 15,
6 | "id": "bed5c752",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "import numpy as np \n",
11 | "import pandas as pd \n",
12 | "import matplotlib.pyplot as plt\n",
13 | "from sympy import *\n",
14 | "\n",
15 | "PERCISION = 20"
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": 16,
21 | "id": "6614bac8",
22 | "metadata": {},
23 | "outputs": [],
24 | "source": [
25 | "x = symbols(\"x\")\n",
26 | "y1= symbols(\"y1\") \n",
27 | "y2= symbols(\"y2\")\n",
28 | "y3= symbols(\"y3\")\n",
29 | "y = Function(\"y\")(x) \n",
30 | "\n",
31 | "function = Derivative(Derivative(y,x)) + x*Derivative(y,x) + y - sqrt(1+x)"
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 28,
37 | "id": "3a7b74a1",
38 | "metadata": {},
39 | "outputs": [
40 | {
41 | "data": {
42 | "text/latex": [
43 | "$\\displaystyle x \\frac{d}{d x} y{\\left(x \\right)} - \\sqrt{x + 1} + y{\\left(x \\right)} + \\frac{d^{2}}{d x^{2}} y{\\left(x \\right)}$"
44 | ],
45 | "text/plain": [
46 | "x*Derivative(y(x), x) - sqrt(x + 1) + y(x) + Derivative(y(x), (x, 2))"
47 | ]
48 | },
49 | "execution_count": 28,
50 | "metadata": {},
51 | "output_type": "execute_result"
52 | }
53 | ],
54 | "source": [
55 | "function"
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": 23,
61 | "id": "a42b3d6a",
62 | "metadata": {},
63 | "outputs": [
64 | {
65 | "data": {
66 | "text/plain": [
67 | "array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,\n",
68 | " 0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])"
69 | ]
70 | },
71 | "execution_count": 23,
72 | "metadata": {},
73 | "output_type": "execute_result"
74 | }
75 | ],
76 | "source": [
77 | "n = 10\n",
78 | "period = np.linspace(0, 1,n)\n",
79 | "period"
80 | ]
81 | },
82 | {
83 | "cell_type": "code",
84 | "execution_count": 24,
85 | "id": "cc41e244",
86 | "metadata": {},
87 | "outputs": [
88 | {
89 | "name": "stdout",
90 | "output_type": "stream",
91 | "text": [
92 | "x*Derivative(y(x), x) - sqrt(x + 1) + y(x) + Derivative(y(x), (x, 2))\n"
93 | ]
94 | }
95 | ],
96 | "source": [
97 | "number_eq = 3\n",
98 | "symbols_y = [] * number_eq\n",
99 | "\n",
100 | "equations = [] * number_eq\n",
101 | "\n",
102 | "x = symbols(\"x\")\n",
103 | "\n",
104 | "for i in range(number_eq):\n",
105 | " symbols_y.append(symbols(\"y\"+str(i + 1)))\n",
106 | " \n",
107 | "\n",
108 | "y = Function(\"y\")(x) \n",
109 | "\n",
110 | "function = Derivative(Derivative(y,x)) + x*Derivative(y,x) + y - sqrt(1+x)\n",
111 | "\n",
112 | "symbols_y\n",
113 | "print(function)"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": 25,
119 | "id": "2dba63d8",
120 | "metadata": {},
121 | "outputs": [
122 | {
123 | "data": {
124 | "text/plain": [
125 | "array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,\n",
126 | " 0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])"
127 | ]
128 | },
129 | "execution_count": 25,
130 | "metadata": {},
131 | "output_type": "execute_result"
132 | }
133 | ],
134 | "source": [
135 | "period"
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 26,
141 | "id": "2b1d8cee",
142 | "metadata": {},
143 | "outputs": [],
144 | "source": [
145 | "def solve_eq(x_1 , x_n, symbols_y):\n",
146 | " \n",
147 | " equations.append((symbols_y[1] - 2*symbols_y[0] + x_1 )/((0.25)**2) - (period[1]*(symbols_y[1]-x_1)/(0.5)) + symbols_y[0] - sqrt(1+period[1]))\n",
148 | " \n",
149 | " for i in range(2,number_eq):\n",
150 | " equations.append((symbols_y[i] - 2*symbols_y[i - 1] + symbols_y[i - 2])/((0.25)**2) - period[i]*(symbols_y[i] - symbols_y[i - 2])/(0.5) + symbols_y[i - 1] - sqrt(1+period[i]))\n",
151 | " \n",
152 | " equations.append((x_n - 2*symbols_y[number_eq - 2] + symbols_y[number_eq - 3] )/((0.25)**2) - period[number_eq-2]*(x_n-symbols_y[number_eq - 3])/(0.5) + symbols_y[number_eq - 2] - sqrt(1+period[number_eq - 2]))\n",
153 | "\n",
154 | " symbols_y=tuple(symbols_y)\n",
155 | " result = solve(equations,symbols_y)\n",
156 | " print(result)"
157 | ]
158 | },
159 | {
160 | "cell_type": "code",
161 | "execution_count": 27,
162 | "id": "e1006ab2",
163 | "metadata": {},
164 | "outputs": [
165 | {
166 | "name": "stdout",
167 | "output_type": "stream",
168 | "text": [
169 | "{y1: 23.0223965279589, y2: 24.7375736921201, y3: 25.0315589166760}\n"
170 | ]
171 | }
172 | ],
173 | "source": [
174 | "solve_eq(20,25,symbols_y)"
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": 22,
180 | "id": "c1dd75f4",
181 | "metadata": {},
182 | "outputs": [
183 | {
184 | "data": {
185 | "text/latex": [
186 | "$\\displaystyle - 32.0 y_{1} + 16.0 y_{2} + 320.0$"
187 | ],
188 | "text/plain": [
189 | "-32.0*y1 + 16.0*y2 + 320.0"
190 | ]
191 | },
192 | "execution_count": 22,
193 | "metadata": {},
194 | "output_type": "execute_result"
195 | }
196 | ],
197 | "source": [
198 | "(symbols_y[1] - 2*symbols_y[0] + 20 )/((0.25)**2)"
199 | ]
200 | }
201 | ],
202 | "metadata": {
203 | "kernelspec": {
204 | "display_name": "Python 3 (ipykernel)",
205 | "language": "python",
206 | "name": "python3"
207 | },
208 | "language_info": {
209 | "codemirror_mode": {
210 | "name": "ipython",
211 | "version": 3
212 | },
213 | "file_extension": ".py",
214 | "mimetype": "text/x-python",
215 | "name": "python",
216 | "nbconvert_exporter": "python",
217 | "pygments_lexer": "ipython3",
218 | "version": "3.9.12"
219 | }
220 | },
221 | "nbformat": 4,
222 | "nbformat_minor": 5
223 | }
224 |
--------------------------------------------------------------------------------
/numpy_exercise.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "794cf1ce",
6 | "metadata": {},
7 | "source": [
8 | "Reza Mosavi 400222100"
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 6,
14 | "id": "3578f80d",
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "import numpy as np\n",
19 | "import pandas as pd"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 7,
25 | "id": "c9edad8e",
26 | "metadata": {},
27 | "outputs": [
28 | {
29 | "data": {
30 | "text/plain": [
31 | "array([['2022-01-01', 'New York', 0.5],\n",
32 | " ['2022-01-01', 'Los Angeles', 20.5],\n",
33 | " ['2022-01-01', 'Miami', 24.7],\n",
34 | " ['2022-01-02', 'New York', 2.3],\n",
35 | " ['2022-01-02', 'Los Angeles', 18.4],\n",
36 | " ['2022-01-02', 'Miami', 22.9],\n",
37 | " ['2022-01-03', 'New York', 4.8],\n",
38 | " ['2022-01-03', 'Los Angeles', 15.9],\n",
39 | " ['2022-01-03', 'Miami', 21.2],\n",
40 | " ['2022-01-04', 'New York', 3.2],\n",
41 | " ['2022-01-04', 'Los Angeles', 16.1],\n",
42 | " ['2022-01-04', 'Miami', 23.5],\n",
43 | " ['2022-01-05', 'New York', -1.9],\n",
44 | " ['2022-01-05', 'Los Angeles', 22.8],\n",
45 | " ['2022-01-05', 'Miami', 20.1],\n",
46 | " ['2022-01-06', 'New York', -2.1],\n",
47 | " ['2022-01-06', 'Los Angeles', 23.5],\n",
48 | " ['2022-01-06', 'Miami', 25.3],\n",
49 | " ['2022-01-07', 'New York', 1.3],\n",
50 | " ['2022-01-07', 'Los Angeles', 20.3],\n",
51 | " ['2022-01-07', 'Miami', 21.8],\n",
52 | " ['2022-01-08', 'New York', 4.2],\n",
53 | " ['2022-01-08', 'Los Angeles', 19.7],\n",
54 | " ['2022-01-08', 'Miami', 22.4],\n",
55 | " ['2022-01-09', 'New York', 5.8],\n",
56 | " ['2022-01-09', 'Los Angeles', 18.8],\n",
57 | " ['2022-01-09', 'Miami', 20.5],\n",
58 | " ['2022-01-10', 'New York', -1.1],\n",
59 | " ['2022-01-10', 'Los Angeles', 22.1],\n",
60 | " ['2022-01-10', 'Miami', 23.1],\n",
61 | " ['2022-01-11', 'New York', -4.6],\n",
62 | " ['2022-01-11', 'Los Angeles', 21.2],\n",
63 | " ['2022-01-11', 'Miami', 25.8],\n",
64 | " ['2022-01-12', 'New York', -7.3],\n",
65 | " ['2022-01-12', 'Los Angeles', 24.4],\n",
66 | " ['2022-01-12', 'Miami', 22.6],\n",
67 | " ['2022-01-13', 'New York', -2.4],\n",
68 | " ['2022-01-13', 'Los Angeles', 20.1],\n",
69 | " ['2022-01-13', 'Miami', 19.7],\n",
70 | " ['2022-01-14', 'New York', 1.5],\n",
71 | " ['2022-01-14', 'Los Angeles', 21.5],\n",
72 | " ['2022-01-14', 'Miami', 20.2],\n",
73 | " ['2022-01-15', 'New York', 2.1],\n",
74 | " ['2022-01-15', 'Los Angeles', 18.6],\n",
75 | " ['2022-01-15', 'Miami', 21.5],\n",
76 | " ['2022-01-16', 'New York', -0.9],\n",
77 | " ['2022-01-16', 'Los Angeles', 23.8],\n",
78 | " ['2022-01-16', 'Miami', 23.9],\n",
79 | " ['2022-01-17', 'New York', -2.7],\n",
80 | " ['2022-01-17', 'Los Angeles', 21.3],\n",
81 | " ['2022-01-17', 'Miami', 25.3]], dtype=object)"
82 | ]
83 | },
84 | "execution_count": 7,
85 | "metadata": {},
86 | "output_type": "execute_result"
87 | }
88 | ],
89 | "source": [
90 | "temperaturesDataset = pd.read_csv(\"tempratures.csv\")\n",
91 | "temperaturesDataset = temperaturesDataset.values\n",
92 | "temperaturesDataset"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 8,
98 | "id": "75b98e26",
99 | "metadata": {},
100 | "outputs": [
101 | {
102 | "data": {
103 | "text/plain": [
104 | "(51, 3)"
105 | ]
106 | },
107 | "execution_count": 8,
108 | "metadata": {},
109 | "output_type": "execute_result"
110 | }
111 | ],
112 | "source": [
113 | "temperaturesDataset.shape"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": 24,
119 | "id": "e09fb435",
120 | "metadata": {},
121 | "outputs": [
122 | {
123 | "name": "stdout",
124 | "output_type": "stream",
125 | "text": [
126 | "0.15882352941176472\n",
127 | "22.61764705882353\n",
128 | "20.529411764705884\n"
129 | ]
130 | }
131 | ],
132 | "source": [
133 | "new_york = temperaturesDataset[temperaturesDataset[:,1] == \"New York\"][:,2].mean()\n",
134 | "miami = temperaturesDataset[temperaturesDataset[:,1] == \"Miami\"][:,2].mean()\n",
135 | "los_angeles = temperaturesDataset[temperaturesDataset[:,1] == \"Los Angeles\"][:,2].mean()\n",
136 | "\n",
137 | "print(new_york)\n",
138 | "print(miami)\n",
139 | "print(los_angeles)"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 25,
145 | "id": "586b568b",
146 | "metadata": {},
147 | "outputs": [
148 | {
149 | "name": "stdout",
150 | "output_type": "stream",
151 | "text": [
152 | "5.8\n",
153 | "25.8\n",
154 | "24.4\n"
155 | ]
156 | }
157 | ],
158 | "source": [
159 | "new_york = temperaturesDataset[temperaturesDataset[:,1] == \"New York\"][:,2].max()\n",
160 | "miami = temperaturesDataset[temperaturesDataset[:,1] == \"Miami\"][:,2].max()\n",
161 | "los_angeles = temperaturesDataset[temperaturesDataset[:,1] == \"Los Angeles\"][:,2].max()\n",
162 | "\n",
163 | "print(new_york)\n",
164 | "print(miami)\n",
165 | "print(los_angeles)"
166 | ]
167 | }
168 | ],
169 | "metadata": {
170 | "kernelspec": {
171 | "display_name": "Python 3 (ipykernel)",
172 | "language": "python",
173 | "name": "python3"
174 | },
175 | "language_info": {
176 | "codemirror_mode": {
177 | "name": "ipython",
178 | "version": 3
179 | },
180 | "file_extension": ".py",
181 | "mimetype": "text/x-python",
182 | "name": "python",
183 | "nbconvert_exporter": "python",
184 | "pygments_lexer": "ipython3",
185 | "version": "3.9.12"
186 | }
187 | },
188 | "nbformat": 4,
189 | "nbformat_minor": 5
190 | }
191 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Numerical-Analysis
2 | Newton's Method, also known as the Newton-Raphson method, is a root-finding algorithm that work functions. The method in one variable is used as follows:
3 | The method starts with a function $f$ defined over the real numbers $x$, the function's derivative $f'$, and an initial guess $x_0$ for a root of the function $f$. If the function satisfies the assumptions made in the derivation of the formula and the initial guess is close, then the manner in which Zaytman presents a better approximation for $x_1$ is
4 | ```math
5 | $$x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}$$
6 | ```
7 | \newline
8 | Geometrically, $(x_1, 0)$ is the intersection with the $x$-axis of the tangent to the graph of $f$ at $(x_0, f(x_0))$. The process that Zaytman presented is repeated as
9 | $$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$
10 | until a sufficiently accurate value is reached.
11 | # Numerical Differentiate Algorithms
12 | The backward, forward, and central differentiation algorithms are all numerical methods for approximating the derivative of a function at a given point. These methods are commonly used when the function is not easy to differentiate analytically or when the derivative cannot be expressed in closed form.
13 |
14 | Backward differentiation:
15 | The backward differentiation algorithm calculates the approximate value of the derivative of a function f(x) at a point x by computing the slope of a secant line through two points, (x-h, f(x-h)) and (x, f(x)). The backward differentiation formula is given by:
16 | ```math
17 | $$ f'(x) \approx \frac{f(x) - f(x - h)}{h} $$
18 | ```
19 |
20 |
21 | This formula calculates the slope of the secant line through the two points (x-h, f(x-h)) and (x, f(x)).
22 |
23 | The backward differentiation algorithm is similar to the forward differentiation algorithm, but instead of using the point (x+h, f(x+h)), it uses the point (x-h, f(x-h)).
24 |
25 | Forward differentiation:
26 | The forward differentiation algorithm was explained in the previous answer. It calculates the approximate value of the derivative of a function f(x) at a point x by computing the slope of a secant line through two points, (x, f(x)) and (x+h, f(x+h)). The forward differentiation formula is given by:
27 |
28 | ```math
29 | $$ f'(x) \approx \frac{f(x + h) - f(x)}{h} $$
30 | ```
31 | This formula calculates the slope of the secant line through the two points (x, f(x)) and (x+h, f(x+h)).
32 |
33 | Central differentiation:
34 | The central differentiation algorithm calculates the approximate value of the derivative of a function f(x) at a point x by computing the slope of a secant line through two points, (x-h, f(x-h)) and (x+h, f(x+h)). The central differentiation formula is given by:
35 | ```math
36 | $$ f'(x) \approx \frac{f(x + h) - f(x - h)}{2h} $$
37 | ```
38 |
39 | This formula calculates the slope of the secant line through the two points (x-h, f(x-h)) and (x+h, f(x+h)).
40 |
41 | The central differentiation algorithm is often preferred over the forward and backward differentiation algorithms because it provides a more accurate approximation of the derivative. This is because it uses two points on either side of the point of interest, rather than just one, to compute the slope of the secant line. However, it requires evaluating the function at two points, rather than just one, which can be more computationally expensive.
42 |
43 | # Taylor Series for function approximation
44 | The Taylor series for the sine and cosine functions are:
45 |
46 | Sine Function:
47 |
48 | $$\sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!}x^{2n+1} = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots $$
49 |
50 | Cosine Function:
51 |
52 | $$\cos(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n)!}x^{2n} = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \cdots$$
53 |
54 | Here, the $n$th term in the series is given by $(-1)^n x^{2n+1}/(2n+1)!$ for the sine function, and $(-1)^n x^{2n}/(2n)!$ for the cosine function. The Taylor series represents an infinite sum of terms, where each term depends on the value of $n$ and the value of $x$. The terms get smaller and smaller as $n$ increases, and the series converges to the function for any finite value of $x$.
55 |
56 | Using more terms in the Taylor series for approximating the sine and cosine functions leads to a more accurate approximation of these functions.
57 |
58 | The Taylor series for the sine and cosine functions are infinite series, so using more terms in the series means including higher-order terms with increasingly smaller coefficients. As we add more and more terms to the series, the approximation becomes more accurate, especially for values of $x$ that are closer to zero.
59 |
60 | However, it's important to note that adding more terms to the Taylor series does not necessarily mean that the approximation becomes more accurate for all values of $x$. In fact, for large values of $x$, the approximation may actually become less accurate, as the series terms grow larger and the series becomes less convergent.
61 |
62 | In practice, it's often more efficient to use a finite number of terms in the Taylor series that is appropriate for the range of values of $x$ being considered. This can lead to a good balance between accuracy and computational efficiency.
63 |
64 | # Fourier series
65 | The Fourier formula expresses a periodic function $f(t)$ as a sum of sine and cosine waves with different frequencies, amplitudes, and phases. The formula is given by:
66 |
67 | $$f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left(a_n \cos\left(\frac{2\pi n t}{T}\right) + b_n \sin\left(\frac{2\pi n t}{T}\right)\right)$$
68 |
69 | where $T$ is the period of the function, $a_0$, $a_n$, and $b_n$ are the Fourier coefficients given by the formulas:
70 |
71 | $$a_0 = \frac{1}{T}\int_{-T/2}^{T/2}f(t)dt$$
72 |
73 | $$a_n = \frac{2}{T}\int_{-T/2}^{T/2}f(t)\cos\left(\frac{2\pi n t}{T}\right)dt$$
74 |
75 | $$b_n = \frac{2}{T}\int_{-T/2}^{T/2}f(t)\sin\left(\frac{2\pi n t}{T}\right)dt$$
76 |
77 | The terms $\cos\left(\frac{2\pi n t}{T}\right)$ and $\sin\left(\frac{2\pi n t}{T}\right)$ represent harmonic waves with frequencies $\frac{n}{T},, n \in \mathbb{Z}$, and the coefficients $a_n$ and $b_n$ represent the amplitudes and phases of these waves. The term $\frac{a_0}{2}$ represents the average value of the function over one period.
78 |
79 | The Fourier formula is a powerful tool for analyzing and manipulating periodic functions. It allows us to break down complex functions into simpler components, and to reconstruct functions from their Fourier coefficients. It is widely used in many areas of science and engineering, including signal processing, audio and image compression, and quantum mechanics.
80 |
81 | ## How to approximate the functions with Fourier series?
82 | * Identify the period of the function:
83 | Let $T$ be the period of the function.
84 | * Determine the coefficients of the Fourier series:
85 | * The Fourier series coefficients $a_0$, $a_n$, and $b_n$ can be calculated using the following formulas:
86 | $$a_0 = \frac{1}{T}\int_{-T/2}^{T/2}f(t)dt$$
87 | $$a_n = \frac{2}{T}\int_{-T/2}^{T/2}f(t)\cos\left(\frac{2\pi n t}{T}\right)dt$$
88 | $$b_n = \frac{2}{T}\int_{-T/2}^{T/2}f(t)\sin\left(\frac{2\pi n t}{T}\right)dt$$
89 | * Here, $f(t)$ is the periodic function we want to approximate, and $n$ is a non-negative integer.
90 | * Construct the Fourier series:
91 |
92 | * The Fourier series for $f(t)$ is given by:
93 | $$f(t) \approx \frac{a_0}{2} + \sum_{n=1}^{\infty} \left(a_n \cos\left(\frac{2\pi n t}{T}\right) + b_n \sin\left(\frac{2\pi n t}{T}\right)\right)$$
94 |
95 | * Choose the number of terms:
96 | Let $N$ be the number of terms we include in the Fourier series.
97 | * Evaluate the approximation:
98 | The accuracy of the Fourier series approximation can be evaluated by comparing it with the original function $f(t)$. We can use various measures such as the mean squared error or the maximum error to assess the accuracy of the approximation.
99 |
100 |
101 | # Hermit Interpolation
102 |
103 | Hermit interpolation is a method for constructing a polynomial function that passes through a given set of data points, while also taking into account the first and possibly higher derivatives at those points. The resulting polynomial is typically smoother and more accurate than a polynomial constructed using only the data points themselves.
104 |
105 | The resulting Hermit polynomial is guaranteed to pass through all of the data points and to have the specified derivatives at those points. Moreover, it tends to be smoother and more accurate than a polynomial constructed using only the data points themselves, especially when the data points are noisy or irregularly spaced.
106 | Hermit interpolation has a wide range of applications in numerical analysis, including computer graphics, computer-aided design, and physics simulations. It is also commonly used in data analysis and visualization to interpolate between discrete data points and to smooth out noisy data.
107 |
108 | Let $\{x_i, y_i, y'_i, y''_i, \ldots, y^{(k)}_i\}$ for $i=0,1,\ldots,n$ be a set of $n+1$ distinct data points and their derivatives up to order $k$. The Hermit polynomial of degree at most $2n+1$ that passes through these points is given by:
109 |
110 | $$
111 | p(x) = \sum_{i=0}^n y_i h_i(x) + \sum_{i=0}^n y'_i \hat{h}_i(x)
112 | $$
113 |
114 | where $h_i(x)$ and $\hat{h}_i(x)$ are the blending functions defined as:
115 |
116 | $$
117 | h_i(x) = (1-2L_i(x) L'_i(x))L_i(x)^2
118 | $$
119 |
120 | $$
121 | \hat{h}_i(x) = (x-x_i)L_i(x)^2
122 | $$
123 |
124 | and $L_i(x)$ is the Lagrange basis polynomial that satisfies $L_i(x_j) = \delta_{ij}$, where $\delta_{ij}$ is the Kronecker delta.
125 |
126 | The blending functions $h_i(x)$ and $\hat{h}_i(x)$ are constructed so that they are equal to one at $x=x_i$ and zero at all other data points, and also satisfy the condition that the Hermit polynomial $p(x)$ has the desired derivatives at each data point. Specifically, the coefficients of $p(x)$ are chosen so that $p^{(m)}(x_i) = y^{(m)}_i$ for $m=0,1,\ldots,k$.
127 |
128 | By construction, the resulting Hermit polynomial $p(x)$ passes through all of the given data points and has the specified derivatives at each point. Moreover, it tends to be smoother and more accurate than a polynomial constructed using only the data points themselves.
129 |
130 | # Lagrange Interpolation
131 | Lagrange interpolation is a method of approximating a function using a polynomial that passes through a set of given data points. The goal of interpolation is to estimate the value of a function at a point within a given interval, based on a limited number of data points. In other words, interpolation allows us to estimate values of a function at points where we do not have direct measurements. The Lagrange interpolation method is particularly useful because it is simple and straightforward to implement, and can be used to approximate a wide range of functions.
132 |
133 | Given $n+1$ distinct data points $\{(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)\}$, where $x_i \neq x_j$ for $i \neq j$, the Lagrange interpolation polynomial $P(x)$ of degree at most $n$ that passes through these points is given by:
134 |
135 | $$
136 | P(x) = \sum_{i=0}^n y_i L_i(x),
137 | $$
138 |
139 | where $L_i(x)$ are the Lagrange basis polynomials defined as:
140 |
141 | $$
142 | L_i(x) = \prod_{j=0, j \neq i}^n \frac{x - x_j}{x_i - x_j}.
143 | $$
144 |
145 | The Lagrange basis polynomials are constructed so that $L_i(x_j) = \delta_{ij}$, where $\delta_{ij}$ is the Kronecker delta. That is, $L_i(x)$ is equal to $1$ when $x = x_i$, and is equal to $0$ when $x = x_j$ for all $j \neq i$. Therefore, the Lagrange interpolation polynomial $P(x)$ constructed using these basis polynomials passes through all of the given data points.
146 |
147 | One important property of the Lagrange interpolation polynomial is that it is unique, meaning that there is only one polynomial of degree at most $n$ that passes through a given set of $n+1$ distinct data points. This property makes Lagrange interpolation a useful tool for approximating functions and for numerical integration.
148 |
149 | However, one potential drawback of Lagrange interpolation is that the complexity of the polynomial increases rapidly as the number of data points increases. This can lead to numerical instability and inaccurate results, particularly when the data is noisy or when the degree of the polynomial is very high. Other methods, such as spline interpolation, may be more appropriate in these cases.
150 |
151 | # Refrences
152 | [1] Weisstein, Eric W. "Hermite Polynomial." From MathWorld--A Wolfram Web Resource. https://mathworld.wolfram.com/HermitePolynomial.html
153 |
154 | [2] Press, W. H., et al. "Numerical Recipes in C: The Art of Scientific Computing." 2nd ed., Cambridge University Press, 1992.
155 |
156 | [3] Atkinson, K. E. (1989). An Introduction to Numerical Analysis (2nd ed.). John Wiley & Sons. ISBN 0-471-50023-2.
157 |
158 | [4] Burden, R. L., & Faires, J. D. (2000). Numerical Analysis (7th ed.). Brooks/Cole. ISBN 0-534-38216-9.
159 |
160 | [5] Conte, S. D., & de Boor, C. (1980). Elementary Numerical Analysis: An Algorithmic Approach (3rd ed.). McGraw-Hill. ISBN 0-07-012447-7.
161 |
162 | [6] Davis, P. J. (1963). Interpolation and Approximation. Dover Publications. ISBN 0-486-60172-5.
163 |
164 | [7] Stoer, J., & Bulirsch, R. (2002). Introduction to Numerical Analysis (3rd ed.). Springer-Verlag. ISBN 0-387-95452-X.
165 |
166 |
--------------------------------------------------------------------------------
/Sympy_exercise.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Sympy\n",
8 | "__Author__ : Mohammad Rouintan , 400222042\n",
9 | "\n",
10 | "__Course__ : Undergraduate Numerical Analysis Course"
11 | ]
12 | },
13 | {
14 | "cell_type": "code",
15 | "execution_count": 1,
16 | "metadata": {},
17 | "outputs": [],
18 | "source": [
19 | "import numpy as np\n",
20 | "import pandas as pd\n",
21 | "import matplotlib.pyplot as plt\n",
22 | "import sympy as sp"
23 | ]
24 | },
25 | {
26 | "cell_type": "markdown",
27 | "metadata": {},
28 | "source": [
29 | "## Problem 1\n",
30 | "### Symbolic Differentiation\n",
31 | "Find the derivative of the following functions using Sympy:\n",
32 | "\n",
33 | "(a) $f(x) = x^3 - 2x^2 + 5x - 7$
\n",
34 | "(b) $g(x) = \\frac{1}{x^2 + 1}$
\n",
35 | "(c) $h(x) = e^{2x}\\cos (x)$"
36 | ]
37 | },
38 | {
39 | "cell_type": "markdown",
40 | "metadata": {},
41 | "source": [
42 | "### Part a)\n",
43 | "Find the derivative of $f(x)$"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 8,
49 | "metadata": {},
50 | "outputs": [
51 | {
52 | "data": {
53 | "text/latex": [
54 | "$\\displaystyle 3 x^{2} - 4 x + 5$"
55 | ],
56 | "text/plain": [
57 | "3*x**2 - 4*x + 5"
58 | ]
59 | },
60 | "execution_count": 8,
61 | "metadata": {},
62 | "output_type": "execute_result"
63 | }
64 | ],
65 | "source": [
66 | "x = sp.symbols('x')\n",
67 | "f = x**3 - 2*x**2 + 5*x - 7\n",
68 | "f_derivative = f.diff(x)\n",
69 | "f_derivative"
70 | ]
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "### Part b)\n",
77 | "Find the derivative of $g(x)$"
78 | ]
79 | },
80 | {
81 | "cell_type": "code",
82 | "execution_count": 9,
83 | "metadata": {},
84 | "outputs": [
85 | {
86 | "data": {
87 | "text/latex": [
88 | "$\\displaystyle - \\frac{2 x}{\\left(x^{2} + 1\\right)^{2}}$"
89 | ],
90 | "text/plain": [
91 | "-2*x/(x**2 + 1)**2"
92 | ]
93 | },
94 | "execution_count": 9,
95 | "metadata": {},
96 | "output_type": "execute_result"
97 | }
98 | ],
99 | "source": [
100 | "x = sp.symbols('x')\n",
101 | "g = 1 / (x**2 + 1)\n",
102 | "g_derivative = g.diff(x)\n",
103 | "g_derivative"
104 | ]
105 | },
106 | {
107 | "cell_type": "markdown",
108 | "metadata": {},
109 | "source": [
110 | "### Part c)\n",
111 | "Find the derivative of $h(x)$"
112 | ]
113 | },
114 | {
115 | "cell_type": "code",
116 | "execution_count": 10,
117 | "metadata": {},
118 | "outputs": [
119 | {
120 | "data": {
121 | "text/latex": [
122 | "$\\displaystyle - e^{2 x} \\sin{\\left(x \\right)} + 2 e^{2 x} \\cos{\\left(x \\right)}$"
123 | ],
124 | "text/plain": [
125 | "-exp(2*x)*sin(x) + 2*exp(2*x)*cos(x)"
126 | ]
127 | },
128 | "execution_count": 10,
129 | "metadata": {},
130 | "output_type": "execute_result"
131 | }
132 | ],
133 | "source": [
134 | "x = sp.symbols('x')\n",
135 | "h = sp.exp(2 * x) * sp.cos(x)\n",
136 | "h_derivative = h.diff(x)\n",
137 | "h_derivative"
138 | ]
139 | },
140 | {
141 | "cell_type": "markdown",
142 | "metadata": {},
143 | "source": [
144 | "## Problem 2\n",
145 | "### Symbolic Integration\n",
146 | "Find the indefinite integral of the following functions using Sympy:\n",
147 | "\n",
148 | "(a) $f(x) = 2x + 5$
\n",
149 | "(b) $g(x) = \\frac{1}{x^2 + 1}$
\n",
150 | "(c) $h(x) = \\frac{x^3}{3} - 2x^2 + 5x - 7$"
151 | ]
152 | },
153 | {
154 | "cell_type": "markdown",
155 | "metadata": {},
156 | "source": [
157 | "### Part a)\n",
158 | "Find the indefinite integral of $f(x)$"
159 | ]
160 | },
161 | {
162 | "cell_type": "code",
163 | "execution_count": 7,
164 | "metadata": {},
165 | "outputs": [
166 | {
167 | "data": {
168 | "text/latex": [
169 | "$\\displaystyle x^{2} + 5 x$"
170 | ],
171 | "text/plain": [
172 | "x**2 + 5*x"
173 | ]
174 | },
175 | "execution_count": 7,
176 | "metadata": {},
177 | "output_type": "execute_result"
178 | }
179 | ],
180 | "source": [
181 | "x = sp.symbols('x')\n",
182 | "f = 2*x + 5\n",
183 | "f_integral = sp.integrate(f, x)\n",
184 | "f_integral"
185 | ]
186 | },
187 | {
188 | "cell_type": "markdown",
189 | "metadata": {},
190 | "source": [
191 | "### Part b)\n",
192 | "Find the indefinite integral of $g(x)$"
193 | ]
194 | },
195 | {
196 | "cell_type": "code",
197 | "execution_count": 11,
198 | "metadata": {},
199 | "outputs": [
200 | {
201 | "data": {
202 | "text/latex": [
203 | "$\\displaystyle \\operatorname{atan}{\\left(x \\right)}$"
204 | ],
205 | "text/plain": [
206 | "atan(x)"
207 | ]
208 | },
209 | "execution_count": 11,
210 | "metadata": {},
211 | "output_type": "execute_result"
212 | }
213 | ],
214 | "source": [
215 | "x = sp.symbols('x')\n",
216 | "g = 1 / (x**2 + 1)\n",
217 | "g_integral = sp.integrate(g, x)\n",
218 | "g_integral"
219 | ]
220 | },
221 | {
222 | "cell_type": "markdown",
223 | "metadata": {},
224 | "source": [
225 | "### Part c)\n",
226 | "Find the indefinite integral of $h(x)$"
227 | ]
228 | },
229 | {
230 | "cell_type": "code",
231 | "execution_count": 12,
232 | "metadata": {},
233 | "outputs": [
234 | {
235 | "data": {
236 | "text/latex": [
237 | "$\\displaystyle \\frac{x^{4}}{12} - \\frac{2 x^{3}}{3} + \\frac{5 x^{2}}{2} - 7 x$"
238 | ],
239 | "text/plain": [
240 | "x**4/12 - 2*x**3/3 + 5*x**2/2 - 7*x"
241 | ]
242 | },
243 | "execution_count": 12,
244 | "metadata": {},
245 | "output_type": "execute_result"
246 | }
247 | ],
248 | "source": [
249 | "x = sp.symbols('x')\n",
250 | "h = x**3/3 - 2*x**2 + 5*x - 7\n",
251 | "h_integral = sp.integrate(h, x)\n",
252 | "h_integral"
253 | ]
254 | },
255 | {
256 | "cell_type": "markdown",
257 | "metadata": {},
258 | "source": [
259 | "## Problem 3\n",
260 | "### Solving Equations\n",
261 | "Solve the following equations using Sympy:\n",
262 | "\n",
263 | "(a) $x^2 - 3x + 2 = 0$
\n",
264 | "(b) $e^x + x - 1 = 0$
\n",
265 | "(c) $\\cos (x) = \\frac{1}{2}$"
266 | ]
267 | },
268 | {
269 | "cell_type": "markdown",
270 | "metadata": {},
271 | "source": [
272 | "### Part a)\n",
273 | "Solve the equation (a)"
274 | ]
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": 13,
279 | "metadata": {},
280 | "outputs": [
281 | {
282 | "data": {
283 | "text/plain": [
284 | "[1, 2]"
285 | ]
286 | },
287 | "execution_count": 13,
288 | "metadata": {},
289 | "output_type": "execute_result"
290 | }
291 | ],
292 | "source": [
293 | "x = sp.symbols('x')\n",
294 | "eq = sp.Eq(x**2 - 3*x + 2, 0)\n",
295 | "sol = sp.solve(eq, x)\n",
296 | "sol"
297 | ]
298 | },
299 | {
300 | "cell_type": "markdown",
301 | "metadata": {},
302 | "source": [
303 | "### Part b)\n",
304 | "Solve the equation (b)"
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": 14,
310 | "metadata": {},
311 | "outputs": [
312 | {
313 | "data": {
314 | "text/plain": [
315 | "[0]"
316 | ]
317 | },
318 | "execution_count": 14,
319 | "metadata": {},
320 | "output_type": "execute_result"
321 | }
322 | ],
323 | "source": [
324 | "x = sp.symbols('x')\n",
325 | "eq = sp.Eq(sp.exp(x) + x - 1, 0)\n",
326 | "sol = sp.solve(eq, x)\n",
327 | "sol"
328 | ]
329 | },
330 | {
331 | "cell_type": "markdown",
332 | "metadata": {},
333 | "source": [
334 | "### Part c)\n",
335 | "Solve the equation (c)"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 15,
341 | "metadata": {},
342 | "outputs": [
343 | {
344 | "data": {
345 | "text/plain": [
346 | "[1.04719755119660, 5.23598775598299]"
347 | ]
348 | },
349 | "execution_count": 15,
350 | "metadata": {},
351 | "output_type": "execute_result"
352 | }
353 | ],
354 | "source": [
355 | "x = sp.symbols('x')\n",
356 | "eq = sp.Eq(sp.cos(x), 1 / 2)\n",
357 | "sol = sp.solve(eq, x)\n",
358 | "sol"
359 | ]
360 | },
361 | {
362 | "cell_type": "markdown",
363 | "metadata": {},
364 | "source": [
365 | "## Problem 4\n",
366 | "### Advanced Sympy\n",
367 | "Use Sympy to find the first 10 terms of the Fourier series of the following function over the interval $[-\\pi, \\pi]$:\n",
368 | "\n",
369 | "$\n",
370 | " f(x) = \n",
371 | " \\begin{cases}\n",
372 | " \\text{0,} & -\\pi\\le x<0\\\\\n",
373 | " \\text{1,} & 0\\le x<\\pi\\\\\n",
374 | " \\end{cases}\n",
375 | "$"
376 | ]
377 | },
378 | {
379 | "cell_type": "code",
380 | "execution_count": 30,
381 | "metadata": {},
382 | "outputs": [
383 | {
384 | "data": {
385 | "text/latex": [
386 | "$\\displaystyle \\frac{2 \\sin{\\left(x \\right)}}{\\pi} + \\frac{2 \\sin{\\left(3 x \\right)}}{3 \\pi} + \\frac{2 \\sin{\\left(5 x \\right)}}{5 \\pi} + \\frac{2 \\sin{\\left(7 x \\right)}}{7 \\pi} + \\frac{2 \\sin{\\left(9 x \\right)}}{9 \\pi} + \\frac{2 \\sin{\\left(11 x \\right)}}{11 \\pi} + \\frac{2 \\sin{\\left(13 x \\right)}}{13 \\pi} + \\frac{2 \\sin{\\left(15 x \\right)}}{15 \\pi} + \\frac{2 \\sin{\\left(17 x \\right)}}{17 \\pi} + \\frac{1}{2}$"
387 | ],
388 | "text/plain": [
389 | "2*sin(x)/pi + 2*sin(3*x)/(3*pi) + 2*sin(5*x)/(5*pi) + 2*sin(7*x)/(7*pi) + 2*sin(9*x)/(9*pi) + 2*sin(11*x)/(11*pi) + 2*sin(13*x)/(13*pi) + 2*sin(15*x)/(15*pi) + 2*sin(17*x)/(17*pi) + 1/2"
390 | ]
391 | },
392 | "execution_count": 30,
393 | "metadata": {},
394 | "output_type": "execute_result"
395 | }
396 | ],
397 | "source": [
398 | "x = sp.symbols('x')\n",
399 | "expr = sp.Piecewise((0, sp.Interval(-sp.pi, 0, False, True).contains(x)), (1, sp.Interval(0, sp.pi, False, True).contains(x)))\n",
400 | "fourier_series_expr = sp.fourier_series(expr, (x, -sp.pi, sp.pi))\n",
401 | "fourier_series_expr.truncate(10)"
402 | ]
403 | },
404 | {
405 | "cell_type": "markdown",
406 | "metadata": {},
407 | "source": [
408 | "## Problem 5\n",
409 | "### Application of Sympy (Bonus Question)\n",
410 | "Use Sympy to solve the following problem:\n",
411 | "\n",
412 | "\n",
413 | "A particle moves along the x-axis according to the equation $x = 3 sin(t) − 4 sin(2t)$, where $t$ is time. Find the velocity and acceleration of the particle as functions of time."
414 | ]
415 | },
416 | {
417 | "cell_type": "code",
418 | "execution_count": 37,
419 | "metadata": {},
420 | "outputs": [],
421 | "source": [
422 | "t = sp.symbols('t')\n",
423 | "place = 3*sp.sin(t) - 4*sp.sin(2*t)\n",
424 | "velocity = place.diff(t)\n",
425 | "acceleration = velocity.diff(t)"
426 | ]
427 | },
428 | {
429 | "cell_type": "code",
430 | "execution_count": 38,
431 | "metadata": {},
432 | "outputs": [
433 | {
434 | "data": {
435 | "text/latex": [
436 | "$\\displaystyle 3 \\cos{\\left(t \\right)} - 8 \\cos{\\left(2 t \\right)}$"
437 | ],
438 | "text/plain": [
439 | "3*cos(t) - 8*cos(2*t)"
440 | ]
441 | },
442 | "execution_count": 38,
443 | "metadata": {},
444 | "output_type": "execute_result"
445 | }
446 | ],
447 | "source": [
448 | "velocity"
449 | ]
450 | },
451 | {
452 | "cell_type": "code",
453 | "execution_count": 39,
454 | "metadata": {},
455 | "outputs": [
456 | {
457 | "data": {
458 | "text/latex": [
459 | "$\\displaystyle - 3 \\sin{\\left(t \\right)} + 16 \\sin{\\left(2 t \\right)}$"
460 | ],
461 | "text/plain": [
462 | "-3*sin(t) + 16*sin(2*t)"
463 | ]
464 | },
465 | "execution_count": 39,
466 | "metadata": {},
467 | "output_type": "execute_result"
468 | }
469 | ],
470 | "source": [
471 | "acceleration"
472 | ]
473 | },
474 | {
475 | "cell_type": "markdown",
476 | "metadata": {},
477 | "source": [
478 | "## Conclusion for these problems\n",
479 | "Write a conclusion and references which you've used in your homework"
480 | ]
481 | },
482 | {
483 | "cell_type": "code",
484 | "execution_count": null,
485 | "metadata": {},
486 | "outputs": [],
487 | "source": []
488 | }
489 | ],
490 | "metadata": {
491 | "kernelspec": {
492 | "display_name": "Python 3 (ipykernel)",
493 | "language": "python",
494 | "name": "python3"
495 | },
496 | "language_info": {
497 | "codemirror_mode": {
498 | "name": "ipython",
499 | "version": 3
500 | },
501 | "file_extension": ".py",
502 | "mimetype": "text/x-python",
503 | "name": "python",
504 | "nbconvert_exporter": "python",
505 | "pygments_lexer": "ipython3",
506 | "version": "3.9.12"
507 | },
508 | "vscode": {
509 | "interpreter": {
510 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
511 | }
512 | }
513 | },
514 | "nbformat": 4,
515 | "nbformat_minor": 2
516 | }
517 |
--------------------------------------------------------------------------------
/Stablity_and_Root_Finding.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Stablity and Root Finding\n",
9 | "__Author__ : Mohammad Rouintan , 400222042\n",
10 | "\n",
11 | "__Course__ : Undergraduate Numerical Analysis Course"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 1,
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import numpy as np\n",
21 | "import pandas as pd\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "from sympy import *"
24 | ]
25 | },
26 | {
27 | "attachments": {},
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "## Problem 1\n",
32 | "Prove by induction that first algorithm creates a sequence that second algorithm creates:"
33 | ]
34 | },
35 | {
36 | "attachments": {},
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "First Algorithm:\n",
41 | "$$\n",
42 | " f(n) = \n",
43 | " \\begin{cases}\n",
44 | " x_{0} = 1,\\; x_{1} = \\frac{1}{3}\\\\\n",
45 | " x_{n + 1} = \\frac{13}{3}x_{n} - \\frac{4}{3}x_{n - 1}\\\\\n",
46 | " \\end{cases}\n",
47 | "$$\n",
48 | "\n",
49 | "Second Algorithm:\n",
50 | "$$\n",
51 | "g(n) = x_{n} = (\\frac{1}{3})^{n}\n",
52 | "$$"
53 | ]
54 | },
55 | {
56 | "attachments": {},
57 | "cell_type": "markdown",
58 | "metadata": {},
59 | "source": [
60 | "__Basis__ :\n",
61 | "$$\n",
62 | " \\begin{cases}\n",
63 | " f(0) = x_{0} = 1\\\\\n",
64 | " g(0) = x_{0} = (\\frac{1}{3})^{0} = 1\\\\\n",
65 | " \\end{cases}\n",
66 | " \\xrightarrow{} f(0) = g(0)\n",
67 | "\n",
68 | "$$"
69 | ]
70 | },
71 | {
72 | "attachments": {},
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "__Induction__ : We assume that $f(n) = g(n)$ for $n \\le k$. We must prove this equality for $n = k + 1$\n",
77 | "\n",
78 | "$$\n",
79 | "f(k + 1) = x_{k + 1} = \\frac{13}{3}x_{k} - \\frac{4}{3}x_{k - 1}\n",
80 | "$$\n",
81 | "$$\n",
82 | "= \\frac{13}{3}g(k) - \\frac{4}{3}g(k - 1)\n",
83 | "$$\n",
84 | "$$\n",
85 | "= \\frac{13}{3}(\\frac{1}{3})^{k} - \\frac{4}{3}(\\frac{1}{3})^{k - 1}\n",
86 | "$$\n",
87 | "$$\n",
88 | "= (\\frac{1}{3})^{k - 1}(\\frac{13}{3}(\\frac{1}{3}) - \\frac{4}{3})\n",
89 | "$$\n",
90 | "$$\n",
91 | "= (\\frac{1}{3})^{k - 1}(\\frac{13}{9} - \\frac{12}{9})\n",
92 | "$$\n",
93 | "$$\n",
94 | "= (\\frac{1}{3})^{k - 1}(\\frac{1}{9})\n",
95 | "$$\n",
96 | "$$\n",
97 | "= (\\frac{1}{3})^{k - 1}(\\frac{1}{3})^{2}\n",
98 | "$$\n",
99 | "$$\n",
100 | "= (\\frac{1}{3})^{k + 1} = g(k + 1)\n",
101 | "$$"
102 | ]
103 | },
104 | {
105 | "attachments": {},
106 | "cell_type": "markdown",
107 | "metadata": {},
108 | "source": [
109 | "## Problem 2\n",
110 | "Compute sequences for both algorithm for 15 terms with 7 float point precision."
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 2,
116 | "metadata": {},
117 | "outputs": [],
118 | "source": [
119 | "def first_algorithm(n):\n",
120 | " if n == 0:\n",
121 | " return 1\n",
122 | " elif n == 1:\n",
123 | " return 1 / 3\n",
124 | " \n",
125 | " return (13 / 3) * first_algorithm(n - 1) - (4 / 3) * first_algorithm(n - 2)\n",
126 | "\n",
127 | "def second_algorithm(n):\n",
128 | " return (1 / 3) ** n"
129 | ]
130 | },
131 | {
132 | "cell_type": "code",
133 | "execution_count": 3,
134 | "metadata": {},
135 | "outputs": [
136 | {
137 | "name": "stdout",
138 | "output_type": "stream",
139 | "text": [
140 | "First Algorithm\tSecond Algorithm\n",
141 | "1 1.0\n",
142 | "0.3333333333333333 0.3333333333333333\n",
143 | "0.11111111111111094 0.1111111111111111\n",
144 | "0.03703703703703626 0.03703703703703703\n",
145 | "0.012345679012342514 0.012345679012345677\n",
146 | "0.004115226337435884 0.004115226337448558\n",
147 | "0.0013717421124321456 0.0013717421124828527\n",
148 | "0.00045724737062478524 0.00045724737082761756\n",
149 | "0.00015241578946454185 0.0001524157902758725\n",
150 | "5.0805260179967644e-05 5.0805263425290837e-05\n",
151 | "1.6935074827137338e-05 1.693508780843028e-05\n",
152 | "5.644977344304949e-06 5.645029269476759e-06\n",
153 | "1.8814687224716613e-06 1.8816764231589195e-06\n",
154 | "6.263946716372672e-07 6.272254743863065e-07\n",
155 | "2.0575194713260943e-07 2.090751581287688e-07\n",
156 | "5.63988753916179e-08 6.969171937625627e-08\n"
157 | ]
158 | }
159 | ],
160 | "source": [
161 | "print('First Algorithm', 'Second Algorithm', sep='\\t')\n",
162 | "for i in range(16):\n",
163 | " f_i = first_algorithm(i)\n",
164 | " g_i = second_algorithm(i)\n",
165 | " # print('{:.7f}'.format(f_i), '{:.7f}'.format(g_i), sep='\\t')\n",
166 | " print(f_i, g_i)"
167 | ]
168 | },
169 | {
170 | "attachments": {},
171 | "cell_type": "markdown",
172 | "metadata": {},
173 | "source": [
174 | "## Problem 3\n",
175 | "In this questions we want to compute $I_{n} = \\int_{0}^{1} x^{n}e^{x}\\, dx$. Write a recursive equation for computation with respect to part by part integration method. Compute all these integrals with your suggested recursive equation for $n = 0,1,...,15$"
176 | ]
177 | },
178 | {
179 | "cell_type": "code",
180 | "execution_count": 4,
181 | "metadata": {},
182 | "outputs": [],
183 | "source": [
184 | "def reqursive_equation(n):\n",
185 | " if n == 0:\n",
186 | " return np.exp(1) - 1\n",
187 | " \n",
188 | " return np.exp(1) - n * reqursive_equation(n - 1)"
189 | ]
190 | },
191 | {
192 | "cell_type": "code",
193 | "execution_count": 5,
194 | "metadata": {},
195 | "outputs": [
196 | {
197 | "name": "stdout",
198 | "output_type": "stream",
199 | "text": [
200 | "1.718282\n",
201 | "1.000000\n",
202 | "0.718282\n",
203 | "0.563436\n",
204 | "0.464536\n",
205 | "0.395600\n",
206 | "0.344685\n",
207 | "0.305490\n",
208 | "0.274362\n",
209 | "0.249028\n",
210 | "0.228002\n",
211 | "0.210265\n",
212 | "0.195100\n",
213 | "0.181983\n",
214 | "0.170519\n",
215 | "0.160496\n"
216 | ]
217 | }
218 | ],
219 | "source": [
220 | "for i in range(16):\n",
221 | " ans = reqursive_equation(i)\n",
222 | " print('{:.6f}'.format(ans))"
223 | ]
224 | },
225 | {
226 | "attachments": {},
227 | "cell_type": "markdown",
228 | "metadata": {},
229 | "source": [
230 | "## Problem 4\n",
231 | "Solve following equation by Bisection, False Position, Newton and Improved Newton methods with\n",
232 | "threshold $|f(x_n)| < 10^{-16}$ with 20 precise floating point.(a and b are arbitrary) \n",
233 | "$$\n",
234 | "x + \\cos x = 0\n",
235 | "$$"
236 | ]
237 | },
238 | {
239 | "cell_type": "code",
240 | "execution_count": 23,
241 | "metadata": {},
242 | "outputs": [],
243 | "source": [
244 | "def function(x):\n",
245 | " return x + np.cos(x)\n",
246 | "\n",
247 | "def diffFunction(x):\n",
248 | " return 1 - np.sin(x)"
249 | ]
250 | },
251 | {
252 | "cell_type": "code",
253 | "execution_count": 12,
254 | "metadata": {},
255 | "outputs": [],
256 | "source": [
257 | "a, b = -1.5, 0"
258 | ]
259 | },
260 | {
261 | "attachments": {},
262 | "cell_type": "markdown",
263 | "metadata": {},
264 | "source": [
265 | "### Bisection Method"
266 | ]
267 | },
268 | {
269 | "cell_type": "code",
270 | "execution_count": 20,
271 | "metadata": {},
272 | "outputs": [],
273 | "source": [
274 | "def biSection(a, b):\n",
275 | " if function(a) * function(b) >= 0:\n",
276 | " print('There is not any root between a and b')\n",
277 | " return\n",
278 | "\n",
279 | " root = a\n",
280 | " while np.abs(function(root)) >= 10**(-16):\n",
281 | " root = (a + b) / 2\n",
282 | " if function(root) == 0:\n",
283 | " break\n",
284 | "\n",
285 | " if function(root) * function(a) < 0:\n",
286 | " b = root\n",
287 | " else:\n",
288 | " a = root\n",
289 | "\n",
290 | " return root"
291 | ]
292 | },
293 | {
294 | "cell_type": "code",
295 | "execution_count": 30,
296 | "metadata": {},
297 | "outputs": [
298 | {
299 | "name": "stdout",
300 | "output_type": "stream",
301 | "text": [
302 | "Root = -0.73908513321516067229\n"
303 | ]
304 | }
305 | ],
306 | "source": [
307 | "print('Root =', '{:.20f}'.format(biSection(a, b)))"
308 | ]
309 | },
310 | {
311 | "attachments": {},
312 | "cell_type": "markdown",
313 | "metadata": {},
314 | "source": [
315 | "### False Position Method"
316 | ]
317 | },
318 | {
319 | "cell_type": "code",
320 | "execution_count": 24,
321 | "metadata": {},
322 | "outputs": [],
323 | "source": [
324 | "def falsePosition(a, b):\n",
325 | " if function(a) * function(b) >= 0:\n",
326 | " print('There is not any root between a and b')\n",
327 | " return\n",
328 | "\n",
329 | " root = a\n",
330 | " while np.abs(function(root)) >= 10**(-16):\n",
331 | " root = (a * function(b) - b * function(a)) / (function(b) - function(a))\n",
332 | " \n",
333 | " if function(root) == 0:\n",
334 | " break\n",
335 | "\n",
336 | " if function(root) * function(a) < 0:\n",
337 | " b = root\n",
338 | " else:\n",
339 | " a = root\n",
340 | "\n",
341 | " return root"
342 | ]
343 | },
344 | {
345 | "cell_type": "code",
346 | "execution_count": 31,
347 | "metadata": {},
348 | "outputs": [
349 | {
350 | "name": "stdout",
351 | "output_type": "stream",
352 | "text": [
353 | "Root = -0.73908513321516067229\n"
354 | ]
355 | }
356 | ],
357 | "source": [
358 | "print('Root =', '{:.20f}'.format(falsePosition(a, b)))"
359 | ]
360 | },
361 | {
362 | "attachments": {},
363 | "cell_type": "markdown",
364 | "metadata": {},
365 | "source": [
366 | "### Newton Method"
367 | ]
368 | },
369 | {
370 | "cell_type": "code",
371 | "execution_count": 26,
372 | "metadata": {},
373 | "outputs": [],
374 | "source": [
375 | "def newton(x0):\n",
376 | " root = x0\n",
377 | " while np.abs(function(root)) >= 10**(-16):\n",
378 | " root = x0 - function(x0) / diffFunction(x0)\n",
379 | " x0 = root\n",
380 | "\n",
381 | " return root"
382 | ]
383 | },
384 | {
385 | "cell_type": "code",
386 | "execution_count": 32,
387 | "metadata": {},
388 | "outputs": [
389 | {
390 | "name": "stdout",
391 | "output_type": "stream",
392 | "text": [
393 | "Root = -0.73908513321516067229\n"
394 | ]
395 | }
396 | ],
397 | "source": [
398 | "print('Root =', '{:.20f}'.format(newton(-1)))"
399 | ]
400 | },
401 | {
402 | "attachments": {},
403 | "cell_type": "markdown",
404 | "metadata": {},
405 | "source": [
406 | "### Improved Newton Method (Secant Method)"
407 | ]
408 | },
409 | {
410 | "cell_type": "code",
411 | "execution_count": 28,
412 | "metadata": {},
413 | "outputs": [],
414 | "source": [
415 | "def secant(x0, x1):\n",
416 | " root = x1\n",
417 | " while np.abs(function(root)) >= 10**(-16):\n",
418 | " root = x1 - function(x1) / ((function(x1) - function(x0)) / (x1 - x0))\n",
419 | " x0 = x1\n",
420 | " x1 = root\n",
421 | " \n",
422 | " return root"
423 | ]
424 | },
425 | {
426 | "cell_type": "code",
427 | "execution_count": 33,
428 | "metadata": {},
429 | "outputs": [
430 | {
431 | "name": "stdout",
432 | "output_type": "stream",
433 | "text": [
434 | "Root = -0.73908513321516067229\n"
435 | ]
436 | }
437 | ],
438 | "source": [
439 | "print('Root =', '{:.20f}'.format(secant(-1, -0.9)))"
440 | ]
441 | },
442 | {
443 | "attachments": {},
444 | "cell_type": "markdown",
445 | "metadata": {},
446 | "source": [
447 | "## Problem 5\n",
448 | "Find roots of following equation:\n",
449 | "$$\n",
450 | "xe^{x} - 5 = 0\n",
451 | "$$"
452 | ]
453 | },
454 | {
455 | "attachments": {},
456 | "cell_type": "markdown",
457 | "metadata": {},
458 | "source": [
459 | "We find roots of this equation with fixed point algorithm.\n",
460 | "$$\n",
461 | "x = ln(\\frac{5}{x})\\\\\n",
462 | "x_{0} = 2\n",
463 | "$$"
464 | ]
465 | },
466 | {
467 | "cell_type": "code",
468 | "execution_count": 34,
469 | "metadata": {},
470 | "outputs": [],
471 | "source": [
472 | "def fixed_point(x):\n",
473 | " if x == 0:\n",
474 | " return 2\n",
475 | " \n",
476 | " return np.log(5 / fixed_point(x - 1))"
477 | ]
478 | },
479 | {
480 | "cell_type": "code",
481 | "execution_count": 35,
482 | "metadata": {},
483 | "outputs": [
484 | {
485 | "name": "stdout",
486 | "output_type": "stream",
487 | "text": [
488 | "2\n",
489 | "0.9162907318741551\n",
490 | "1.6968594842248554\n",
491 | "1.0806587320706331\n",
492 | "1.5318671201315661\n",
493 | "1.1829505810840526\n",
494 | "1.441426102541988\n",
495 | "1.243804939930723\n",
496 | "1.391262731110403\n",
497 | "1.2792261380252945\n",
498 | "1.3631825970022953\n",
499 | "1.2996158017062034\n",
500 | "1.3473692287953931\n",
501 | "1.311283940618623\n",
502 | "1.338431147870178\n",
503 | "1.3179397695471649\n",
504 | "1.333368175768879\n",
505 | "1.3217297084970905\n",
506 | "1.3304966484161829\n",
507 | "1.3238856200424909\n",
508 | "1.3288668483470925\n",
509 | "1.3251113270773656\n",
510 | "1.3279414360896864\n",
511 | "1.3258079616823177\n",
512 | "1.3274158564359095\n",
513 | "1.3262038252914221\n",
514 | "1.327117318085523\n",
515 | "1.3264287524872926\n",
516 | "1.3269477301838333\n",
517 | "1.326556547321885\n",
518 | "1.326851389782173\n",
519 | "1.326629152969372\n",
520 | "1.3267966588619082\n",
521 | "1.3266704025392237\n",
522 | "1.326765565825489\n",
523 | "1.326693837479721\n",
524 | "1.326747901503234\n",
525 | "1.326707151391614\n",
526 | "1.326737866147139\n",
527 | "1.3267147152958318\n",
528 | "1.3267321649020314\n",
529 | "1.3267190124953787\n",
530 | "1.326728925929449\n",
531 | "1.3267214538144496\n",
532 | "1.3267270858134925\n",
533 | "1.3267228407724005\n",
534 | "1.326726040411519\n",
535 | "1.326723628728263\n",
536 | "1.3267254465002631\n",
537 | "1.32672407638013\n",
538 | "1.326725109088777\n",
539 | "1.3267243306991603\n",
540 | "1.326724917399329\n",
541 | "1.3267244751823397\n",
542 | "1.3267248084971492\n",
543 | "1.3267245572658093\n",
544 | "1.3267247466278849\n",
545 | "1.3267246038988905\n",
546 | "1.3267247114788556\n",
547 | "1.3267246303919742\n",
548 | "1.3267246915100668\n",
549 | "1.3267246454431665\n",
550 | "1.3267246801654426\n",
551 | "1.326724653994017\n",
552 | "1.3267246737203597\n",
553 | "1.326724658851907\n",
554 | "1.3267246700587936\n",
555 | "1.326724661611761\n",
556 | "1.3267246679785925\n",
557 | "1.3267246631796832\n",
558 | "1.3267246667967934\n",
559 | "1.3267246640704475\n",
560 | "1.3267246661253924\n",
561 | "1.3267246645765065\n",
562 | "1.3267246657439575\n",
563 | "1.3267246648640076\n",
564 | "1.3267246655272575\n",
565 | "1.3267246650273423\n",
566 | "1.3267246654041465\n",
567 | "1.3267246651201356\n",
568 | "1.3267246653342046\n",
569 | "1.3267246651728533\n",
570 | "1.3267246652944695\n",
571 | "1.3267246652028029\n",
572 | "1.3267246652718954\n",
573 | "1.326724665219818\n",
574 | "1.3267246652590705\n",
575 | "1.3267246652294844\n",
576 | "1.3267246652517846\n",
577 | "1.3267246652349762\n",
578 | "1.3267246652476452\n",
579 | "1.3267246652380962\n",
580 | "1.3267246652452935\n",
581 | "1.3267246652398685\n",
582 | "1.3267246652439577\n",
583 | "1.3267246652408755\n",
584 | "1.3267246652431988\n",
585 | "1.3267246652414475\n",
586 | "1.3267246652427676\n",
587 | "1.3267246652417726\n",
588 | "1.3267246652425226\n",
589 | "1.326724665241957\n",
590 | "1.3267246652423834\n",
591 | "1.3267246652420621\n",
592 | "1.3267246652423044\n",
593 | "1.3267246652421216\n",
594 | "1.3267246652422595\n",
595 | "1.3267246652421556\n",
596 | "1.3267246652422338\n",
597 | "1.326724665242175\n",
598 | "1.3267246652422193\n",
599 | "1.3267246652421858\n",
600 | "1.326724665242211\n",
601 | "1.326724665242192\n",
602 | "1.3267246652422064\n",
603 | "1.3267246652421956\n",
604 | "1.3267246652422038\n",
605 | "1.3267246652421976\n",
606 | "1.3267246652422022\n",
607 | "1.3267246652421987\n",
608 | "1.3267246652422013\n",
609 | "1.3267246652421993\n",
610 | "1.326724665242201\n",
611 | "1.3267246652421998\n",
612 | "1.3267246652422005\n",
613 | "1.3267246652422\n",
614 | "1.3267246652422005\n",
615 | "1.3267246652422\n",
616 | "1.3267246652422005\n",
617 | "1.3267246652422\n"
618 | ]
619 | }
620 | ],
621 | "source": [
622 | "for i in range(130):\n",
623 | " print(fixed_point(i))"
624 | ]
625 | },
626 | {
627 | "attachments": {},
628 | "cell_type": "markdown",
629 | "metadata": {},
630 | "source": [
631 | "## Conclusion for this problem\n",
632 | "Write a conclusion and references which you've used in your homework"
633 | ]
634 | },
635 | {
636 | "cell_type": "code",
637 | "execution_count": null,
638 | "metadata": {},
639 | "outputs": [],
640 | "source": []
641 | }
642 | ],
643 | "metadata": {
644 | "kernelspec": {
645 | "display_name": "Python 3 (ipykernel)",
646 | "language": "python",
647 | "name": "python3"
648 | },
649 | "language_info": {
650 | "codemirror_mode": {
651 | "name": "ipython",
652 | "version": 3
653 | },
654 | "file_extension": ".py",
655 | "mimetype": "text/x-python",
656 | "name": "python",
657 | "nbconvert_exporter": "python",
658 | "pygments_lexer": "ipython3",
659 | "version": "3.9.12"
660 | },
661 | "orig_nbformat": 4,
662 | "vscode": {
663 | "interpreter": {
664 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
665 | }
666 | }
667 | },
668 | "nbformat": 4,
669 | "nbformat_minor": 2
670 | }
671 |
--------------------------------------------------------------------------------
/Significant_Figures.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Significant Figures\n",
9 | "__Author__ : Mohammad Rouintan , 400222042\n",
10 | "\n",
11 | "__Course__ : Undergraduate Numerical Analysis Course"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 1,
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import numpy as np \n",
21 | "import pandas as pd\n",
22 | "import matplotlib.pyplot as plt"
23 | ]
24 | },
25 | {
26 | "attachments": {},
27 | "cell_type": "markdown",
28 | "metadata": {},
29 | "source": [
30 | "## Problem 1\n",
31 | "Assume we use $f (x) = x(\\sqrt{x + 1} − \\sqrt{x})$ for computing error of losing significant figures for big $x$ s. Compute errors for six figures.\n"
32 | ]
33 | },
34 | {
35 | "attachments": {},
36 | "cell_type": "markdown",
37 | "metadata": {},
38 | "source": [
39 | "### Part a)\n",
40 | "$f (x) = x(\\sqrt{x + 1} − \\sqrt{x})$
\n",
41 | "Find the rounded values with 6 digits and find its errors."
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": 20,
47 | "metadata": {},
48 | "outputs": [],
49 | "source": [
50 | "def function(x):\n",
51 | " return x * (np.sqrt(x + 1) - np.sqrt(x))\n",
52 | "X = [1, 10, 100, 1000, 10000, 100000]\n",
53 | "exact, approximate, exact_error, relative_error = [], [], [], []\n",
54 | "\n",
55 | "\n",
56 | "for i in X:\n",
57 | " exact.append(function(i))\n",
58 | " approximate.append(round(i * (round(np.sqrt(i + 1), 6) - round(np.sqrt(i), 6)), 6))\n",
59 | " exact_error.append(round(np.abs(exact[-1] - approximate[-1]), 6))\n",
60 | " relative_error.append(round(np.abs(exact[-1] - approximate[-1]) / np.abs(exact[-1]), 6))"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 21,
66 | "metadata": {},
67 | "outputs": [
68 | {
69 | "data": {
70 | "text/html": [
71 | "
\n",
72 | "\n",
85 | "
\n",
86 | " \n",
87 | " \n",
88 | " | \n",
89 | " Exact | \n",
90 | " Approximate | \n",
91 | " ExactError | \n",
92 | " RelativeError | \n",
93 | "
\n",
94 | " \n",
95 | " \n",
96 | " \n",
97 | " | 1 | \n",
98 | " 0.414214 | \n",
99 | " 0.414214 | \n",
100 | " 0.000000 | \n",
101 | " 0.000001 | \n",
102 | "
\n",
103 | " \n",
104 | " | 10 | \n",
105 | " 1.543471 | \n",
106 | " 1.543470 | \n",
107 | " 0.000001 | \n",
108 | " 0.000001 | \n",
109 | "
\n",
110 | " \n",
111 | " | 100 | \n",
112 | " 4.987562 | \n",
113 | " 4.987600 | \n",
114 | " 0.000038 | \n",
115 | " 0.000008 | \n",
116 | "
\n",
117 | " \n",
118 | " | 1000 | \n",
119 | " 15.807437 | \n",
120 | " 15.807000 | \n",
121 | " 0.000437 | \n",
122 | " 0.000028 | \n",
123 | "
\n",
124 | " \n",
125 | " | 10000 | \n",
126 | " 49.998750 | \n",
127 | " 50.000000 | \n",
128 | " 0.001250 | \n",
129 | " 0.000025 | \n",
130 | "
\n",
131 | " \n",
132 | " | 100000 | \n",
133 | " 158.113488 | \n",
134 | " 158.100000 | \n",
135 | " 0.013488 | \n",
136 | " 0.000085 | \n",
137 | "
\n",
138 | " \n",
139 | "
\n",
140 | "
"
141 | ],
142 | "text/plain": [
143 | " Exact Approximate ExactError RelativeError\n",
144 | "1 0.414214 0.414214 0.000000 0.000001\n",
145 | "10 1.543471 1.543470 0.000001 0.000001\n",
146 | "100 4.987562 4.987600 0.000038 0.000008\n",
147 | "1000 15.807437 15.807000 0.000437 0.000028\n",
148 | "10000 49.998750 50.000000 0.001250 0.000025\n",
149 | "100000 158.113488 158.100000 0.013488 0.000085"
150 | ]
151 | },
152 | "execution_count": 21,
153 | "metadata": {},
154 | "output_type": "execute_result"
155 | }
156 | ],
157 | "source": [
158 | "results = pd.DataFrame()\n",
159 | "results.index = X\n",
160 | "results['Exact'] = exact\n",
161 | "results['Approximate'] = approximate\n",
162 | "results['ExactError'] = exact_error\n",
163 | "results['RelativeError'] = relative_error\n",
164 | "results"
165 | ]
166 | },
167 | {
168 | "attachments": {},
169 | "cell_type": "markdown",
170 | "metadata": {},
171 | "source": [
172 | "### Part b)\n",
173 | "$f (x) = x/(\\sqrt{x + 1} + \\sqrt{x})$
\n",
174 | "Find the rounded values with 6 digits and find its errors."
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": 23,
180 | "metadata": {},
181 | "outputs": [],
182 | "source": [
183 | "def SumTransformation(x):\n",
184 | " return x / (np.sqrt(x + 1) + np.sqrt(x))\n",
185 | "X = [1, 10, 100, 1000, 10000, 100000]\n",
186 | "exact1, sumTransformation, exact_error1, relative_error1 = [], [], [], []\n",
187 | "\n",
188 | "\n",
189 | "for i in X:\n",
190 | " exact1.append(SumTransformation(i))\n",
191 | " sumTransformation.append(round(i / (round(np.sqrt(i + 1), 6) + round(np.sqrt(i), 6)), 6))\n",
192 | " exact_error1.append(round(np.abs(exact1[-1] - sumTransformation[-1]), 6))\n",
193 | " relative_error1.append(round(np.abs(exact1[-1] - sumTransformation[-1]) / np.abs(exact1[-1]), 6))"
194 | ]
195 | },
196 | {
197 | "cell_type": "code",
198 | "execution_count": 24,
199 | "metadata": {},
200 | "outputs": [
201 | {
202 | "data": {
203 | "text/html": [
204 | "\n",
205 | "\n",
218 | "
\n",
219 | " \n",
220 | " \n",
221 | " | \n",
222 | " Exact | \n",
223 | " SumTransformation | \n",
224 | " ExactError | \n",
225 | " RelativeError | \n",
226 | "
\n",
227 | " \n",
228 | " \n",
229 | " \n",
230 | " | 1 | \n",
231 | " 0.414214 | \n",
232 | " 0.414213 | \n",
233 | " 0.000001 | \n",
234 | " 0.000001 | \n",
235 | "
\n",
236 | " \n",
237 | " | 10 | \n",
238 | " 1.543471 | \n",
239 | " 1.543471 | \n",
240 | " 0.000000 | \n",
241 | " 0.000000 | \n",
242 | "
\n",
243 | " \n",
244 | " | 100 | \n",
245 | " 4.987562 | \n",
246 | " 4.987562 | \n",
247 | " 0.000000 | \n",
248 | " 0.000000 | \n",
249 | "
\n",
250 | " \n",
251 | " | 1000 | \n",
252 | " 15.807437 | \n",
253 | " 15.807437 | \n",
254 | " 0.000000 | \n",
255 | " 0.000000 | \n",
256 | "
\n",
257 | " \n",
258 | " | 10000 | \n",
259 | " 49.998750 | \n",
260 | " 49.998750 | \n",
261 | " 0.000000 | \n",
262 | " 0.000000 | \n",
263 | "
\n",
264 | " \n",
265 | " | 100000 | \n",
266 | " 158.113488 | \n",
267 | " 158.113488 | \n",
268 | " 0.000000 | \n",
269 | " 0.000000 | \n",
270 | "
\n",
271 | " \n",
272 | "
\n",
273 | "
"
274 | ],
275 | "text/plain": [
276 | " Exact SumTransformation ExactError RelativeError\n",
277 | "1 0.414214 0.414213 0.000001 0.000001\n",
278 | "10 1.543471 1.543471 0.000000 0.000000\n",
279 | "100 4.987562 4.987562 0.000000 0.000000\n",
280 | "1000 15.807437 15.807437 0.000000 0.000000\n",
281 | "10000 49.998750 49.998750 0.000000 0.000000\n",
282 | "100000 158.113488 158.113488 0.000000 0.000000"
283 | ]
284 | },
285 | "execution_count": 24,
286 | "metadata": {},
287 | "output_type": "execute_result"
288 | }
289 | ],
290 | "source": [
291 | "results1 = pd.DataFrame()\n",
292 | "results1.index = X\n",
293 | "results1['Exact'] = exact1\n",
294 | "results1['SumTransformation'] = sumTransformation\n",
295 | "results1['ExactError'] = exact_error1\n",
296 | "results1['RelativeError'] = relative_error1\n",
297 | "results1"
298 | ]
299 | },
300 | {
301 | "cell_type": "code",
302 | "execution_count": 25,
303 | "metadata": {},
304 | "outputs": [
305 | {
306 | "data": {
307 | "text/html": [
308 | "\n",
309 | "\n",
322 | "
\n",
323 | " \n",
324 | " \n",
325 | " | \n",
326 | " Exact | \n",
327 | " Approximate | \n",
328 | " ExactError | \n",
329 | " RelativeError | \n",
330 | " SumTransformaition | \n",
331 | "
\n",
332 | " \n",
333 | " \n",
334 | " \n",
335 | " | 1 | \n",
336 | " 0.414214 | \n",
337 | " 0.414214 | \n",
338 | " 0.000000 | \n",
339 | " 0.000001 | \n",
340 | " 0.414213 | \n",
341 | "
\n",
342 | " \n",
343 | " | 10 | \n",
344 | " 1.543471 | \n",
345 | " 1.543470 | \n",
346 | " 0.000001 | \n",
347 | " 0.000001 | \n",
348 | " 1.543471 | \n",
349 | "
\n",
350 | " \n",
351 | " | 100 | \n",
352 | " 4.987562 | \n",
353 | " 4.987600 | \n",
354 | " 0.000038 | \n",
355 | " 0.000008 | \n",
356 | " 4.987562 | \n",
357 | "
\n",
358 | " \n",
359 | " | 1000 | \n",
360 | " 15.807437 | \n",
361 | " 15.807000 | \n",
362 | " 0.000437 | \n",
363 | " 0.000028 | \n",
364 | " 15.807437 | \n",
365 | "
\n",
366 | " \n",
367 | " | 10000 | \n",
368 | " 49.998750 | \n",
369 | " 50.000000 | \n",
370 | " 0.001250 | \n",
371 | " 0.000025 | \n",
372 | " 49.998750 | \n",
373 | "
\n",
374 | " \n",
375 | " | 100000 | \n",
376 | " 158.113488 | \n",
377 | " 158.100000 | \n",
378 | " 0.013488 | \n",
379 | " 0.000085 | \n",
380 | " 158.113488 | \n",
381 | "
\n",
382 | " \n",
383 | "
\n",
384 | "
"
385 | ],
386 | "text/plain": [
387 | " Exact Approximate ExactError RelativeError SumTransformaition\n",
388 | "1 0.414214 0.414214 0.000000 0.000001 0.414213\n",
389 | "10 1.543471 1.543470 0.000001 0.000001 1.543471\n",
390 | "100 4.987562 4.987600 0.000038 0.000008 4.987562\n",
391 | "1000 15.807437 15.807000 0.000437 0.000028 15.807437\n",
392 | "10000 49.998750 50.000000 0.001250 0.000025 49.998750\n",
393 | "100000 158.113488 158.100000 0.013488 0.000085 158.113488"
394 | ]
395 | },
396 | "execution_count": 25,
397 | "metadata": {},
398 | "output_type": "execute_result"
399 | }
400 | ],
401 | "source": [
402 | "results['SumTransformaition'] = results1['SumTransformation']\n",
403 | "results"
404 | ]
405 | },
406 | {
407 | "attachments": {},
408 | "cell_type": "markdown",
409 | "metadata": {},
410 | "source": [
411 | "## Conclusion\n",
412 | "We have error in part (a). error increases when number increases but in part (b) error is zero with sum transformation method."
413 | ]
414 | },
415 | {
416 | "attachments": {},
417 | "cell_type": "markdown",
418 | "metadata": {},
419 | "source": [
420 | "## Problem 2"
421 | ]
422 | },
423 | {
424 | "attachments": {},
425 | "cell_type": "markdown",
426 | "metadata": {},
427 | "source": [
428 | "### Part a)\n",
429 | "Compute rounding of $\\sqrt{2}, \\sqrt{3}, \\sqrt{23}$ with three precise figures."
430 | ]
431 | },
432 | {
433 | "cell_type": "code",
434 | "execution_count": 27,
435 | "metadata": {},
436 | "outputs": [
437 | {
438 | "name": "stdout",
439 | "output_type": "stream",
440 | "text": [
441 | "Rounding With Three Precise :\n",
442 | "1.414\n",
443 | "1.732\n",
444 | "4.796\n"
445 | ]
446 | }
447 | ],
448 | "source": [
449 | "print('Rounding With Three Precise :')\n",
450 | "print(round(np.sqrt(2), 3))\n",
451 | "print(round(np.sqrt(3), 3))\n",
452 | "print(round(np.sqrt(23), 3))"
453 | ]
454 | },
455 | {
456 | "attachments": {},
457 | "cell_type": "markdown",
458 | "metadata": {},
459 | "source": [
460 | "### Part b)\n",
461 | "Compute rounding of $\\sqrt{2}, \\sqrt{3}, \\sqrt{23}$ with four precise figures."
462 | ]
463 | },
464 | {
465 | "cell_type": "code",
466 | "execution_count": 28,
467 | "metadata": {},
468 | "outputs": [
469 | {
470 | "name": "stdout",
471 | "output_type": "stream",
472 | "text": [
473 | "Rounding With Four Precise :\n",
474 | "1.4142\n",
475 | "1.7321\n",
476 | "4.7958\n"
477 | ]
478 | }
479 | ],
480 | "source": [
481 | "print('Rounding With Four Precise :')\n",
482 | "print(round(np.sqrt(2), 4))\n",
483 | "print(round(np.sqrt(3), 4))\n",
484 | "print(round(np.sqrt(23), 4))"
485 | ]
486 | },
487 | {
488 | "attachments": {},
489 | "cell_type": "markdown",
490 | "metadata": {},
491 | "source": [
492 | "### Part c)\n",
493 | "Compute error for each of them in above sections."
494 | ]
495 | },
496 | {
497 | "cell_type": "code",
498 | "execution_count": 32,
499 | "metadata": {},
500 | "outputs": [
501 | {
502 | "name": "stdout",
503 | "output_type": "stream",
504 | "text": [
505 | "Error For Three Precise :\n",
506 | "0.00021\n",
507 | "5e-05\n",
508 | "0.00017\n"
509 | ]
510 | }
511 | ],
512 | "source": [
513 | "print('Error For Three Precise :')\n",
514 | "print(round(np.abs(np.sqrt(2) - round(np.sqrt(2), 3)), 5))\n",
515 | "print(round(np.abs(np.sqrt(3) - round(np.sqrt(3), 3)), 5))\n",
516 | "print(round(np.abs(np.sqrt(23) - round(np.sqrt(23), 3)), 5))"
517 | ]
518 | },
519 | {
520 | "cell_type": "code",
521 | "execution_count": 33,
522 | "metadata": {},
523 | "outputs": [
524 | {
525 | "name": "stdout",
526 | "output_type": "stream",
527 | "text": [
528 | "Error For Four Precise :\n",
529 | "1e-05\n",
530 | "5e-05\n",
531 | "3e-05\n"
532 | ]
533 | }
534 | ],
535 | "source": [
536 | "print('Error For Four Precise :')\n",
537 | "print(round(np.abs(np.sqrt(2) - round(np.sqrt(2), 4)), 5))\n",
538 | "print(round(np.abs(np.sqrt(3) - round(np.sqrt(3), 4)), 5))\n",
539 | "print(round(np.abs(np.sqrt(23) - round(np.sqrt(23), 4)), 5))"
540 | ]
541 | },
542 | {
543 | "attachments": {},
544 | "cell_type": "markdown",
545 | "metadata": {},
546 | "source": [
547 | "## Conclusion\n",
548 | "The maximum error in rounding is $0.5 * 10^{-n}$"
549 | ]
550 | },
551 | {
552 | "attachments": {},
553 | "cell_type": "markdown",
554 | "metadata": {},
555 | "source": [
556 | "### Part d)\n",
557 | " Consider we use $f(x) = \\frac{1 − cos(x)}{x^{2}}$ for computing error of losing significant figures for small $x$ s."
558 | ]
559 | },
560 | {
561 | "cell_type": "code",
562 | "execution_count": 41,
563 | "metadata": {},
564 | "outputs": [],
565 | "source": [
566 | "def function(x):\n",
567 | " return (1 - np.cos(x)) / (x ** 2)\n",
568 | "\n",
569 | "def SumTransformation(x):\n",
570 | " return (np.sin(x) ** 2) / ((x ** 2) * (1 + np.cos(x)))\n",
571 | "\n",
572 | "X = [1, 0.1, 0.01, 0.001, 0.0001, 0.00001]\n",
573 | "exact, approximate, exact_error, relative_error, sumTransformation = [], [], [], [], []\n",
574 | "\n",
575 | "for i in X:\n",
576 | " exact.append(function(i))\n",
577 | " approximate.append(round(function(i), 4))\n",
578 | " exact_error.append(round(np.abs(exact[-1] - approximate[-1]), 15))\n",
579 | " relative_error.append(round(np.abs(exact[-1] - approximate[-1]) / np.abs(exact[-1]), 15))\n",
580 | " sumTransformation.append(SumTransformation(i))"
581 | ]
582 | },
583 | {
584 | "cell_type": "code",
585 | "execution_count": 40,
586 | "metadata": {},
587 | "outputs": [
588 | {
589 | "data": {
590 | "text/html": [
591 | "\n",
592 | "\n",
605 | "
\n",
606 | " \n",
607 | " \n",
608 | " | \n",
609 | " Exact | \n",
610 | " Approximate | \n",
611 | " ExactError | \n",
612 | " RelativeError | \n",
613 | " SumTransformaition | \n",
614 | "
\n",
615 | " \n",
616 | " \n",
617 | " \n",
618 | " | 1.00000 | \n",
619 | " 0.459698 | \n",
620 | " 0.4597 | \n",
621 | " 2.305868e-06 | \n",
622 | " 5.016053e-06 | \n",
623 | " 0.459698 | \n",
624 | "
\n",
625 | " \n",
626 | " | 0.10000 | \n",
627 | " 0.499583 | \n",
628 | " 0.4996 | \n",
629 | " 1.652780e-05 | \n",
630 | " 3.308317e-05 | \n",
631 | " 0.499583 | \n",
632 | "
\n",
633 | " \n",
634 | " | 0.01000 | \n",
635 | " 0.499996 | \n",
636 | " 0.5000 | \n",
637 | " 4.166653e-06 | \n",
638 | " 8.333375e-06 | \n",
639 | " 0.499996 | \n",
640 | "
\n",
641 | " \n",
642 | " | 0.00100 | \n",
643 | " 0.500000 | \n",
644 | " 0.5000 | \n",
645 | " 4.167450e-08 | \n",
646 | " 8.334900e-08 | \n",
647 | " 0.500000 | \n",
648 | "
\n",
649 | " \n",
650 | " | 0.00010 | \n",
651 | " 0.500000 | \n",
652 | " 0.5000 | \n",
653 | " 3.038736e-09 | \n",
654 | " 6.077471e-09 | \n",
655 | " 0.500000 | \n",
656 | "
\n",
657 | " \n",
658 | " | 0.00001 | \n",
659 | " 0.500000 | \n",
660 | " 0.5000 | \n",
661 | " 4.137019e-08 | \n",
662 | " 8.274036e-08 | \n",
663 | " 0.500000 | \n",
664 | "
\n",
665 | " \n",
666 | "
\n",
667 | "
"
668 | ],
669 | "text/plain": [
670 | " Exact Approximate ExactError RelativeError \\\n",
671 | "1.00000 0.459698 0.4597 2.305868e-06 5.016053e-06 \n",
672 | "0.10000 0.499583 0.4996 1.652780e-05 3.308317e-05 \n",
673 | "0.01000 0.499996 0.5000 4.166653e-06 8.333375e-06 \n",
674 | "0.00100 0.500000 0.5000 4.167450e-08 8.334900e-08 \n",
675 | "0.00010 0.500000 0.5000 3.038736e-09 6.077471e-09 \n",
676 | "0.00001 0.500000 0.5000 4.137019e-08 8.274036e-08 \n",
677 | "\n",
678 | " SumTransformaition \n",
679 | "1.00000 0.459698 \n",
680 | "0.10000 0.499583 \n",
681 | "0.01000 0.499996 \n",
682 | "0.00100 0.500000 \n",
683 | "0.00010 0.500000 \n",
684 | "0.00001 0.500000 "
685 | ]
686 | },
687 | "execution_count": 40,
688 | "metadata": {},
689 | "output_type": "execute_result"
690 | }
691 | ],
692 | "source": [
693 | "results = pd.DataFrame()\n",
694 | "results.index = X\n",
695 | "results['Exact'] = exact\n",
696 | "results['Approximate'] = approximate\n",
697 | "results['ExactError'] = exact_error\n",
698 | "results['RelativeError'] = relative_error\n",
699 | "results['SumTransformaition'] = sumTransformation\n",
700 | "results"
701 | ]
702 | },
703 | {
704 | "attachments": {},
705 | "cell_type": "markdown",
706 | "metadata": {},
707 | "source": [
708 | "## Conclusion\n",
709 | "Error decreases when number dencreases but error is zero with sum transformation method."
710 | ]
711 | }
712 | ],
713 | "metadata": {
714 | "kernelspec": {
715 | "display_name": "Python 3 (ipykernel)",
716 | "language": "python",
717 | "name": "python3"
718 | },
719 | "language_info": {
720 | "codemirror_mode": {
721 | "name": "ipython",
722 | "version": 3
723 | },
724 | "file_extension": ".py",
725 | "mimetype": "text/x-python",
726 | "name": "python",
727 | "nbconvert_exporter": "python",
728 | "pygments_lexer": "ipython3",
729 | "version": "3.9.12"
730 | },
731 | "orig_nbformat": 4,
732 | "vscode": {
733 | "interpreter": {
734 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
735 | }
736 | }
737 | },
738 | "nbformat": 4,
739 | "nbformat_minor": 2
740 | }
741 |
--------------------------------------------------------------------------------
/Regression.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Regression\n",
9 | "__Author__ : Mohammad Rouintan , 400222042\n",
10 | "\n",
11 | "__Course__ : Undergraduate Numerical Analysis Course"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 1,
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import numpy as np \n",
21 | "import pandas as pd\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "import sympy as sp"
24 | ]
25 | },
26 | {
27 | "attachments": {},
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "## Problem 1\n",
32 | "Calculate an exponential mathematical model on these data points:
\n",
33 | "You can use $\\ln{y} = \\ln{a} + bx$ for your calculations.
\n",
34 | "$Y = A + Bx$"
35 | ]
36 | },
37 | {
38 | "cell_type": "code",
39 | "execution_count": 47,
40 | "metadata": {},
41 | "outputs": [],
42 | "source": [
43 | "x_values = np.array([1, 2, 3, 4, 5, 6])\n",
44 | "y_values = np.array([1, 2.3, 4.1, 7.8, 15.9, 33])"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 48,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": [
53 | "a11 = 6\n",
54 | "a12 = np.sum(x_values)\n",
55 | "a21 = np.sum(x_values)\n",
56 | "a22 = np.sum(x_values**2)\n",
57 | "\n",
58 | "b11 = np.sum(np.log(y_values))\n",
59 | "b21 = np.sum(x_values * np.log(y_values))"
60 | ]
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": 49,
65 | "metadata": {},
66 | "outputs": [
67 | {
68 | "data": {
69 | "text/plain": [
70 | "{A: -0.632449369113480, B: 0.683597272176880}"
71 | ]
72 | },
73 | "execution_count": 49,
74 | "metadata": {},
75 | "output_type": "execute_result"
76 | }
77 | ],
78 | "source": [
79 | "A, B = sp.symbols('A B')\n",
80 | "eq1 = sp.Eq(a11*A + a12*B, b11)\n",
81 | "eq2 = sp.Eq(a21*A + a22*B, b21)\n",
82 | "answer = sp.solve((eq1, eq2), (A, B))\n",
83 | "answer"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 50,
89 | "metadata": {},
90 | "outputs": [],
91 | "source": [
92 | "a, b = np.exp(float(answer.get(A))), float(answer.get(B))"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 51,
98 | "metadata": {},
99 | "outputs": [],
100 | "source": [
101 | "x = sp.symbols('x')\n",
102 | "y = a * sp.exp(b * x)"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": 52,
108 | "metadata": {},
109 | "outputs": [
110 | {
111 | "data": {
112 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAGbCAYAAAALJa6vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAz5UlEQVR4nO3debzVc+LH8den0MZYKol08zOWQirXbjBM9l+yZ5oGs1zbhDBjaeYXmsZOzGTJvlyDsUyIsabsutEQkUEbUSK6pVHdz++Pz0Vx013P99xzX8/H4/s4537POfe8b4fuu8/38/18Q4wRSZIkVV+zrANIkiQ1NhYoSZKkGrJASZIk1ZAFSpIkqYYsUJIkSTW0Si7frF27drFLly65fEtJkqRamTBhwicxxvZVPZbTAtWlSxfKyspy+ZaSJEm1EkKYtqLHPIQnSZJUQxYoSZKkGrJASZIk1VBO50BVZfHixcycOZNFixZlHaXgtGzZkk6dOrHqqqtmHUWSpIKSeYGaOXMma6yxBl26dCGEkHWcghFjZO7cucycOZONNtoo6ziSJBWUzA/hLVq0iLZt21qe6lkIgbZt2zqyJ0lSA8i8QAGWpwbin6skSQ0jLwqUJElSY2KB+o5zzjmHSy65ZIWP//Of/+TNN9/MYSJJkpRvGl2BKi0tpUuXLjRr1owuXbpQWlqa0/e3QEmSpEZVoEpLSykpKWHatGnEGJk2bRolJSV1LlHDhg1js80242c/+xlvv/02ANdddx3bbrstW2+9NYcccggLFy7k+eef54EHHuD3v/89PXr04N13363yeZIkqbA1qgI1ePDg7xWUhQsXMnjw4Fp/zwkTJnDnnXfy6quvct999zF+/HgADj74YMaPH8+///1vunbtyg033MBOO+1Enz59uPjii5k4cSIbb7xxlc+TJEmFLfN1oGpi+vTpNdpfHc888wwHHXQQrVu3BqBPnz4ATJo0iT/+8Y/MmzeP8vJy9t577ypfX93nSZKkwtGoRqA6d+5co/3VVdXp/kcffTR/+9vfeP311xkyZMgK11Oq7vMkSVLdZT0X+muNqkANGzbsm5Gir7Vu3Zphw4bV+nvuuuuu3H///Xz55ZfMnz+fBx98EID58+fTsWNHFi9evNyHs8YaazB//vxvvl7R8yRJUv1qqLnQtdGoClT//v0ZOXIkRUVFhBAoKipi5MiR9O/fv9bfs1evXhxxxBH06NGDQw45hJ/85CcADB06lO23357evXuz+eabf/P8fv36cfHFF9OzZ0/efffdFT5PkiTVr4aYC11bIcaYszcrLi6OZWVly+2bPHkyXbt2zVmGpsY/X0lSoWjWrBlV9ZYQAhUVFfX+fiGECTHG4iqz1Pu7SZIkNYCGmgtdGxYoSZLUKDTEXOjaskBJkqRGoSHmQtdWo1oHSpIkNW39+/fPpDB9lyNQkiRJNWSBkiRJqiELVB768MMPOfTQQ7OOIUmSVsAC9R0xxjqtJbFkyZI6Z1h//fW555576vx9JEkqOF99BccdB2+8kWkMCxQwdepUunbtygknnECvXr0YOnQo2267Ld27d2fIkCHfPG/o0KFsvvnm9O7dmyOPPJJLLrkEgN13352zzz6b3XbbjSuuuIIJEyaw2267sc0227D33nsza9YsAK688kq6detG9+7d6devHwBjx46lR48e9OjRg549ezJ//nymTp3KlltuCcCiRYs45phj2GqrrejZsydjxowB4Oabb+bggw9mn332YZNNNuEPf/hDLv/IJEnKxt13w7XXwsyZmcbIr7PwTjkFJk6s3+/ZowcMH77Sp7399tvcdNNN9O3bl3vuuYeXX36ZGCN9+vRh3LhxtG7dmnvvvZdXX32VJUuW0KtXL7bZZptvXj9v3jzGjh3L4sWL2W233Rg1ahTt27fnrrvuYvDgwdx4441ccMEFvP/++7Ro0YJ58+YBcMkllzBixAh23nlnysvLadmy5XK5RowYAcDrr7/OW2+9xV577cWUKVMAmDhxIq+++iotWrRgs802Y+DAgWy44Yb18scmSVLeiRGuuAI23xz22ivTKPlVoDJUVFTEDjvswOmnn85jjz1Gz549ASgvL+edd95h/vz5HHjggbRq1QqA//3f/13u9UcccQSQitikSZPo3bs3AEuXLqVjx44AdO/enf79+9O3b1/69u0LwM4778ypp55K//79Ofjgg+nUqdNy3/fZZ59l4MCBAGy++eYUFRV9U6D23HNP1lxzTQC6devGtGnTLFCSpML1/PNQVgZXXw0hZBolvwpUNUaKGkqbNm2ANAfqrLPO4thjj13u8csvv7zar99iiy144YUXvvec0aNHM27cOB544AGGDh3KG2+8wZlnnsn+++/Pww8/zA477MATTzyx3CjU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",
113 | "text/plain": [
114 | ""
115 | ]
116 | },
117 | "metadata": {
118 | "needs_background": "light"
119 | },
120 | "output_type": "display_data"
121 | }
122 | ],
123 | "source": [
124 | "x_val = np.linspace(1, 6, 100)\n",
125 | "y_val = [float(y.subs(x, i)) for i in x_val]\n",
126 | "plt.figure(figsize=(10, 7))\n",
127 | "plt.plot(x_values, y_values, 'o', color='black', label='data')\n",
128 | "plt.plot(x_val, y_val, color='red', label='regression')\n",
129 | "plt.legend()\n",
130 | "plt.show()"
131 | ]
132 | },
133 | {
134 | "attachments": {},
135 | "cell_type": "markdown",
136 | "metadata": {},
137 | "source": [
138 | "## Problem 2\n",
139 | "Calculate a model with formula $y = \\frac{1}{a+bx}$ on first question data points. You can use $\\frac{1}{y} = a + bx$ and $Y = A + Bx$."
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 53,
145 | "metadata": {},
146 | "outputs": [],
147 | "source": [
148 | "a11 = 6\n",
149 | "a12 = np.sum(x_values)\n",
150 | "a21 = np.sum(x_values)\n",
151 | "a22 = np.sum(x_values**2)\n",
152 | "\n",
153 | "b11 = np.sum(1 / y_values)\n",
154 | "b21 = np.sum(x_values * (1 / y_values))"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 54,
160 | "metadata": {},
161 | "outputs": [
162 | {
163 | "data": {
164 | "text/plain": [
165 | "{a: 0.924666122009009, b: -0.173710021145945}"
166 | ]
167 | },
168 | "execution_count": 54,
169 | "metadata": {},
170 | "output_type": "execute_result"
171 | }
172 | ],
173 | "source": [
174 | "a, b = sp.symbols('a b')\n",
175 | "eq1 = sp.Eq(a11*a + a12*b, b11)\n",
176 | "eq2 = sp.Eq(a21*a + a22*b, b21)\n",
177 | "answer = sp.solve((eq1, eq2), (a, b))\n",
178 | "answer"
179 | ]
180 | },
181 | {
182 | "cell_type": "code",
183 | "execution_count": 55,
184 | "metadata": {},
185 | "outputs": [],
186 | "source": [
187 | "a, b = float(answer.get(a)), float(answer.get(b))"
188 | ]
189 | },
190 | {
191 | "cell_type": "code",
192 | "execution_count": 56,
193 | "metadata": {},
194 | "outputs": [],
195 | "source": [
196 | "x = sp.symbols('x')\n",
197 | "y = 1 / (a + b * x)"
198 | ]
199 | },
200 | {
201 | "cell_type": "code",
202 | "execution_count": 62,
203 | "metadata": {},
204 | "outputs": [
205 | {
206 | "data": {
207 | "image/png": "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",
208 | "text/plain": [
209 | ""
210 | ]
211 | },
212 | "metadata": {
213 | "needs_background": "light"
214 | },
215 | "output_type": "display_data"
216 | }
217 | ],
218 | "source": [
219 | "x_val = np.linspace(1, 6, 100)\n",
220 | "y_val = [float(y.subs(x, i)) for i in x_val]\n",
221 | "plt.figure(figsize=(10, 7))\n",
222 | "plt.plot(x_values, y_values, 'o', color='black', label='data')\n",
223 | "plt.plot(x_val, y_val, color='red', label='regression')\n",
224 | "plt.legend()\n",
225 | "\n",
226 | "plt.show()"
227 | ]
228 | },
229 | {
230 | "attachments": {},
231 | "cell_type": "markdown",
232 | "metadata": {},
233 | "source": [
234 | "## Conclusion for this problem\n",
235 | "Write a conclusion and references which you've used in your homework"
236 | ]
237 | },
238 | {
239 | "cell_type": "code",
240 | "execution_count": null,
241 | "metadata": {},
242 | "outputs": [],
243 | "source": []
244 | }
245 | ],
246 | "metadata": {
247 | "kernelspec": {
248 | "display_name": "Python 3 (ipykernel)",
249 | "language": "python",
250 | "name": "python3"
251 | },
252 | "language_info": {
253 | "codemirror_mode": {
254 | "name": "ipython",
255 | "version": 3
256 | },
257 | "file_extension": ".py",
258 | "mimetype": "text/x-python",
259 | "name": "python",
260 | "nbconvert_exporter": "python",
261 | "pygments_lexer": "ipython3",
262 | "version": "3.9.12"
263 | },
264 | "orig_nbformat": 4,
265 | "vscode": {
266 | "interpreter": {
267 | "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
268 | }
269 | }
270 | },
271 | "nbformat": 4,
272 | "nbformat_minor": 2
273 | }
274 |
--------------------------------------------------------------------------------
/newton_approach_root_finder.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import numpy as np \n",
10 | "import pandas as pd \n",
11 | "import matplotlib.pyplot as plt \n",
12 | "import seaborn as sns\n",
13 | "import sympy as sy\n",
14 | "from sympy import *"
15 | ]
16 | },
17 | {
18 | "cell_type": "code",
19 | "execution_count": 2,
20 | "metadata": {},
21 | "outputs": [],
22 | "source": [
23 | "def calculate_function(function ,derivate_function, x0):\n",
24 | " x1 = x0 - np.divide(function.subs(x,x0).evalf(20) , derivate_function.subs(x,x0).evalf(20))\n",
25 | " return x1"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 3,
31 | "metadata": {},
32 | "outputs": [],
33 | "source": [
34 | "from sympy import *\n",
35 | "x = symbols(\"x\")"
36 | ]
37 | },
38 | {
39 | "cell_type": "code",
40 | "execution_count": 4,
41 | "metadata": {},
42 | "outputs": [
43 | {
44 | "data": {
45 | "text/latex": [
46 | "$\\displaystyle 1 - \\sin{\\left(x \\right)}$"
47 | ],
48 | "text/plain": [
49 | "1 - sin(x)"
50 | ]
51 | },
52 | "execution_count": 4,
53 | "metadata": {},
54 | "output_type": "execute_result"
55 | }
56 | ],
57 | "source": [
58 | "function = x + cos(x)\n",
59 | "derivate_function = diff(function)\n",
60 | "derivate_function"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 5,
66 | "metadata": {},
67 | "outputs": [
68 | {
69 | "name": "stdout",
70 | "output_type": "stream",
71 | "text": [
72 | "The result of iteration 0 is -1.0000000000000000000\n",
73 | "The result of iteration 1 is -0.75036386784024389304\n",
74 | "The result of iteration 2 is -0.73911289091136167036\n",
75 | "The result of iteration 3 is -0.73908513338528396976\n",
76 | "The result of iteration 4 is -0.73908513321516064166\n",
77 | "The result of iteration 5 is -0.73908513321516064166\n",
78 | "The result of iteration 6 is -0.73908513321516064166\n",
79 | "The result of iteration 7 is -0.73908513321516064166\n",
80 | "The result of iteration 8 is -0.73908513321516064166\n",
81 | "The result of iteration 9 is -0.73908513321516064166\n",
82 | "The result of iteration 10 is -0.73908513321516064166\n",
83 | "The result of iteration 11 is -0.73908513321516064166\n",
84 | "The result of iteration 12 is -0.73908513321516064166\n",
85 | "The result of iteration 13 is -0.73908513321516064166\n",
86 | "The result of iteration 14 is -0.73908513321516064166\n",
87 | "The result of iteration 15 is -0.73908513321516064166\n",
88 | "The result of iteration 16 is -0.73908513321516064166\n",
89 | "The result of iteration 17 is -0.73908513321516064166\n",
90 | "The result of iteration 18 is -0.73908513321516064166\n",
91 | "The result of iteration 19 is -0.73908513321516064166\n",
92 | "The result of iteration 20 is -0.73908513321516064166\n",
93 | "The result of iteration 21 is -0.73908513321516064166\n",
94 | "The result of iteration 22 is -0.73908513321516064166\n",
95 | "The result of iteration 23 is -0.73908513321516064166\n",
96 | "The result of iteration 24 is -0.73908513321516064166\n",
97 | "The result of iteration 25 is -0.73908513321516064166\n",
98 | "The result of iteration 26 is -0.73908513321516064166\n",
99 | "The result of iteration 27 is -0.73908513321516064166\n",
100 | "The result of iteration 28 is -0.73908513321516064166\n",
101 | "The result of iteration 29 is -0.73908513321516064166\n"
102 | ]
103 | }
104 | ],
105 | "source": [
106 | "num_list = []\n",
107 | "x0 = 0\n",
108 | "num_list.append(x0)\n",
109 | "iterations = 30\n",
110 | "for i in range(iterations):\n",
111 | " x_n = calculate_function(function=function , derivate_function=derivate_function ,x0=num_list[i])\n",
112 | " num_list.append(x_n)\n",
113 | " print('The result of iteration {} is {}'.format(i,x_n))"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": 7,
119 | "metadata": {},
120 | "outputs": [],
121 | "source": []
122 | },
123 | {
124 | "cell_type": "code",
125 | "execution_count": 10,
126 | "metadata": {},
127 | "outputs": [
128 | {
129 | "data": {
130 | "text/plain": [
131 | "[]"
132 | ]
133 | },
134 | "execution_count": 10,
135 | "metadata": {},
136 | "output_type": "execute_result"
137 | },
138 | {
139 | "data": {
140 | "image/png": "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",
141 | "text/plain": [
142 | ""
143 | ]
144 | },
145 | "metadata": {},
146 | "output_type": "display_data"
147 | }
148 | ],
149 | "source": []
150 | },
151 | {
152 | "cell_type": "code",
153 | "execution_count": 18,
154 | "metadata": {},
155 | "outputs": [
156 | {
157 | "data": {
158 | "image/png": "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J5+s62UAAACT8uqYl9LSUmVmZiotLc3ueFpamketKFJlGMnOzta+ffv017/+VXfffbfL4CJJ06dPV35+vvUrOzu7QdcAAAACW51bXtw5fvy4ysvLFRcXZ3c8Li5OOTk53nwqq8jISEVGRvrk3AAAIPB4NbxUsVgsdrcNw3A45onbb7/dSzUCAADBwqvdRu3atVNoaKhDK0tubq5DawwAAEB9eDW8REREKCUlRRkZGXbHMzIyNHz4cG8+FQAAaKLq3G1UVFSk3bt3W2/v3btXWVlZio2NVVJSkqZNm6aJEydq4MCBGjZsmObPn68DBw5o8uTJXq04AABomuocXjZs2KDU1FTr7WnTpkmSJk2apAULFmjChAnKy8vTzJkzdeTIESUnJ2vx4sXq0qWL92oNAACarDqHl9GjR8swDLdlpkyZoilTptS7UgAAAK4E5N5GAAAArhBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqRBeAACAqQRkeNm7d69SU1PVq1cv9enTR8XFxf6uEgAACBBh/q6AM7fffruefvppjRo1SidOnFBkZKS/qwQAAAJEwIWXbdu2KTw8XKNGjZIkxcbG+rlGAAAgkNS522jVqlUaP368EhISZLFYtGjRIocyc+fOVdeuXRUVFaWUlBStXr3a4/Pv2rVLLVu21HXXXacBAwbo2WefrWsVAQBAEKtzy0txcbH69eunO+64QzfffLPD/QsXLtTUqVM1d+5cjRgxQq+88orS09O1fft2JSUlSZJSUlJUUlLi8Nhly5bp3LlzWr16tbKystShQweNHTtWgwYN0lVXXeW0PiUlJXbnKigo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",
159 | "text/plain": [
160 | ""
161 | ]
162 | },
163 | "metadata": {},
164 | "output_type": "display_data"
165 | }
166 | ],
167 | "source": []
168 | },
169 | {
170 | "cell_type": "code",
171 | "execution_count": null,
172 | "metadata": {},
173 | "outputs": [],
174 | "source": []
175 | }
176 | ],
177 | "metadata": {
178 | "colab": {
179 | "provenance": []
180 | },
181 | "kernelspec": {
182 | "display_name": "base",
183 | "language": "python",
184 | "name": "python3"
185 | },
186 | "language_info": {
187 | "codemirror_mode": {
188 | "name": "ipython",
189 | "version": 3
190 | },
191 | "file_extension": ".py",
192 | "mimetype": "text/x-python",
193 | "name": "python",
194 | "nbconvert_exporter": "python",
195 | "pygments_lexer": "ipython3",
196 | "version": "3.9.13"
197 | },
198 | "vscode": {
199 | "interpreter": {
200 | "hash": "d6b351f3cc0cfd67d72be80e6b4837fe8868a2d6b89e8661c798e2b3fb5dcebc"
201 | }
202 | }
203 | },
204 | "nbformat": 4,
205 | "nbformat_minor": 0
206 | }
207 |
--------------------------------------------------------------------------------