Last active
December 12, 2020 01:52
-
-
Save victor-cali/34f14e23bfcf321155dd67b3058cf73b to your computer and use it in GitHub Desktop.
Numerical_Merhods_ODEs.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Numerical_Merhods_ODEs.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"authorship_tag": "ABX9TyPmtr8tVy2URZFihW/z0CnS", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/VictorCanLima/34f14e23bfcf321155dd67b3058cf73b/numerical_merhods_odes.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "JI5diYcTZx8O" | |
}, | |
"source": [ | |
"w0 = 0.5\r\n", | |
"a = 0\r\n", | |
"b = 2\r\n", | |
"N = 100\r\n", | |
"h = (b-a)/N\r\n", | |
"imax = (b-a)/h\r\n", | |
"\r\n", | |
"def f(t,y):\r\n", | |
" return y-(t**2)+1;" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ED5USUtPZ2mN" | |
}, | |
"source": [ | |
"def euler():\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" w_i = w_i+h*f(t_i,w_i)\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def taylor_2nd_order():\r\n", | |
" def first_derivative(t,w):\r\n", | |
" return 0\r\n", | |
" def T(t,w):\r\n", | |
" return f(t,w)+(h/2)*first_derivative(t,w)\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" w_i = w_i+T(t_i,w_i)\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def taylor_4th_order():\r\n", | |
" from math import factorial as fact\r\n", | |
" def first_derivative(t,w):\r\n", | |
" return 0\r\n", | |
" def second_derivative(t,w):\r\n", | |
" return 0\r\n", | |
" def third_derivative(t,w):\r\n", | |
" return 0\r\n", | |
" def T(t,w):\r\n", | |
" temp1 = f(t,w)+(h/2)*first_derivative(t,w)\r\n", | |
" temp2 = (pow(h,2)/fact(3))*second_derivative(t,w)\r\n", | |
" return temp1+temp2+(pow(h,3)/fact(4))*third_derivative(t,w)\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" w_i = w_i+T(t_i,w_i)\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def euler_modified():\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" w_i = w_i+(h/2)*(f(t_i,w_i)+f(t_i+h,w_i+f(t_i,w_i)))\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def runge_kutta_midpoint():\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" w_i = w_i+h*f(t_i+(h/2),w_i+(h/2)*f(t_i,w_i))\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def runge_kutta_order4():\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" for i in range(N):\r\n", | |
" t_i = t_i + h\r\n", | |
" k_1 = h*f(t_i,w_i)\r\n", | |
" k_2 = h*f(t_i+(h/2),w_i+(0.5*k_1))\r\n", | |
" k_3 = h*f(t_i+(h/2),w_i+(0.5*k_2))\r\n", | |
" k_4 = h*f(t_i+h,w_i+k_3)\r\n", | |
" w_i = w_i+(1/6)*(k_1+2*k_2+2*k_3+k_4)\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" return ws, ts\r\n", | |
"\r\n", | |
"def runge_kutta_fehldberg(hmin,hmax,tol):\r\n", | |
" h_fehldberg = hmax\r\n", | |
" ts = [a]\r\n", | |
" ws = [w0]\r\n", | |
" hs = [h_fehldberg]\r\n", | |
" t_i = a\r\n", | |
" w_i = w0\r\n", | |
" flag = True\r\n", | |
" while flag:\r\n", | |
" k_1 = h_fehldberg * f(t_i, w_i)\r\n", | |
" k_2 = h_fehldberg * f(t_i + 0.25*h_fehldberg, w_i + 0.25*k_1)\r\n", | |
" k_3 = h_fehldberg * f(t_i + 0.375*h_fehldberg, w_i + 0.09375*k_1 + 0.28125*k_2)\r\n", | |
" k_4 = h_fehldberg * f(t_i + 0.92307692*h_fehldberg, w_i + 0.87938097*k_1 - 3.2771961766*k_2 + 3.32089215*k_3)\r\n", | |
" k_5 = h_fehldberg * f(t_i + h_fehldberg, w_i + 2.032407407*k_1 - 8*k_2 + 7.17348927*k_3 - 0.205896686*k_4)\r\n", | |
" k_6 = h_fehldberg * f(t_i + 0.5*h_fehldberg, w_i - 0.29629629*k_1 + 2*k_2 - 1.3816764*k_3 + 0.4533040*k_4 - 0.275*k_5)\r\n", | |
" R = (1.0/h_fehldberg) * abs(0.0027778*k_1 - 0.0299415 * k_3 - 0.0291998936*k_4 +0.02*k_5 + 0.036363636*k_6)\r\n", | |
" if R <= tol:\r\n", | |
" t_i = t_i + h_fehldberg\r\n", | |
" w_i = w_i + 25.0/216.0*k_1+1408.0/2565.0*k_3+2197.0/4104.0*k_4-0.2*k_5\r\n", | |
" ts.append(t_i)\r\n", | |
" ws.append(w_i)\r\n", | |
" hs.append(h_fehldberg)\r\n", | |
"\r\n", | |
" delta = 0.84*pow(float(tol/R),0.25)\r\n", | |
" if delta <= 0.1:\r\n", | |
" h_fehldberg = 0.1*h_fehldberg\r\n", | |
" elif delta >= 4:\r\n", | |
" h_fehldberg = 4*h_fehldberg\r\n", | |
" else:\r\n", | |
" h_fehldberg = delta*h_fehldberg\r\n", | |
"\r\n", | |
" if h_fehldberg>hmax:\r\n", | |
" h_fehldberg = hmax\r\n", | |
" if t_i >= b:\r\n", | |
" flag = False\r\n", | |
" elif t_i+h_fehldberg > b:\r\n", | |
" h_fehldberg = b-t_i\r\n", | |
" elif h_fehldberg < hmin:\r\n", | |
" flag = False\r\n", | |
" return ws, ts, hs" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "9UzmtDLEaC6e" | |
}, | |
"source": [ | |
"#Colors: 'r', 'b', 'g', 'c', 'm', 'y', 'k', 'w'\r\n", | |
"def plot():\r\n", | |
" import matplotlib.pyplot as plt\r\n", | |
" import matplotlib.colors as mcolors\r\n", | |
" import matplotlib.patches as mpatches\r\n", | |
" f, ax = plt.subplots()\r\n", | |
" myhandles = []\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" y1,x1 = runge_kutta_order4()\r\n", | |
" #ax.plot(x1,y1,'r.')\r\n", | |
" patch1 = mpatches.Patch(color='r', label='RK4')\r\n", | |
" myhandles.append(patch1)\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" y2,x2 = euler()\r\n", | |
" #ax.plot(x2,y2,'b.')\r\n", | |
" patch2 = mpatches.Patch(color='b', label='Euler')\r\n", | |
" myhandles.append(patch2)\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" y3,x3 = euler_modified()\r\n", | |
" ax.plot(x2,y2,'g.')\r\n", | |
" patch3 = mpatches.Patch(color='g', label='Euler modified')\r\n", | |
" myhandles.append(patch3)\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" y4,x4 = runge_kutta_midpoint()\r\n", | |
" #ax.plot(x4,y4,'c.')\r\n", | |
" patch4 = mpatches.Patch(color='c', label='RK midpoint')\r\n", | |
" myhandles.append(patch4)\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" y5,x5,steps = runge_kutta_fehldberg(0.01,0.25,1.0E-5)\r\n", | |
" ax.plot(x5,y5,'m.')\r\n", | |
" patch5 = mpatches.Patch(color='m', label='RKF')\r\n", | |
" myhandles.append(patch5)\r\n", | |
" #_____________________________________________________________________________\r\n", | |
" plt.legend(handles=myhandles)\r\n", | |
" plt.title(\"Solution of the ODE\") \r\n", | |
" ax.set_xlabel(\"t\")\r\n", | |
" ax.set_ylabel('w')\r\n", | |
" plt.show" | |
], | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment