{ "cells": [ { "cell_type": "markdown", "id": "ceb18a16-df8a-4d3f-8edc-badd6125bdc4", "metadata": {}, "source": [ "## Euler's method for ODEs" ] }, { "cell_type": "markdown", "id": "b547d580-13c0-4eaa-a2f0-2119355d5d7e", "metadata": {}, "source": [ "Implement the algorithm:" ] }, { "cell_type": "code", "execution_count": null, "id": "4eca1757-9769-44b3-afb5-6b6c1d0a3f64", "metadata": {}, "outputs": [], "source": [ "\n", "\"\"\"\n", " t, y = myeulers(fun, a, b, n, y1)\n", "\n", "Solve IVP for ode y' = fun(t, y) on the interrval a <= t <= b, y(a) = y1 \n", "\"\"\"\n", "function myeulers(fun, a, b, n, y1)\n", " t = range(a, b, n)\n", " y = zeros(n)\n", " h = t[2] - t[1]\n", " y[1] = y1\n", " for i = 1:(n-1)\n", " y[i+1] = y[i] + h * fun(t[i], y[i])\n", " end\n", " return t, y\n", "end" ] }, { "cell_type": "markdown", "id": "9d916dcf-9466-4060-9819-8a98ace31857", "metadata": {}, "source": [ "Test the code using a differential equation with a known solution:" ] }, { "cell_type": "code", "execution_count": null, "id": "2ef46690-a428-47ba-9d34-8ebf20d13b83", "metadata": {}, "outputs": [], "source": [ "\n", "a = 0.0\n", "b = 5.0\n", "n = 128\n", "y1 = 0.0\n", "fun(t, y) = exp(-sin(t)) - y * cos(t);" ] }, { "cell_type": "code", "execution_count": null, "id": "53ae116b-dc6d-4576-968d-cd27bd1662c8", "metadata": {}, "outputs": [], "source": [ "\n", "exacty(t) = t * exp(-sin(t));" ] }, { "cell_type": "code", "execution_count": null, "id": "efbdc4d1-6956-40ef-b53a-c8873dd1e577", "metadata": {}, "outputs": [], "source": [ "\n", "rest, resy = myeulers(fun, a, b, n, y1);" ] }, { "cell_type": "markdown", "id": "49e5464e-5362-465c-bddd-e1fed396981e", "metadata": {}, "source": [ "Plot the numerical solution and compare it to the exact solution." ] }, { "cell_type": "code", "execution_count": null, "id": "f982a0b4-c88a-4e56-bc65-6977b1f9d8f4", "metadata": {}, "outputs": [], "source": [ "\n", "using PyPlot" ] }, { "cell_type": "code", "execution_count": null, "id": "bb722b0c-ce7c-4661-92c8-c1bf73c7287b", "metadata": {}, "outputs": [], "source": [ "\n", "plot(rest, resy, marker=\".\", label=\"Euler's\")\n", "plot(rest, exacty.(rest), linestyle=\"dashed\", label=\"Exact\")\n", "grid(true)\n", "xlabel(\"t\")\n", "ylabel(\"y(t)\")\n", "legend()\n", "title(\"Euler's method for IVP\");" ] }, { "cell_type": "code", "execution_count": null, "id": "9f577a33-5771-4f9d-a65b-faf2d5edee65", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.10.5", "language": "julia", "name": "julia-1.10" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.10.5" } }, "nbformat": 4, "nbformat_minor": 5 }