{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Convergence of AB4\n", "\n", "We consider the IVP $u'=\\sin[(u+t)^2]$ over $0\\le t \\le 4$, with $u(0)=-1$." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using FundamentalsNumericalComputation" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[36mODEProblem\u001b[0m with uType \u001b[36mFloat64\u001b[0m and tType \u001b[36mFloat64\u001b[0m. In-place: \u001b[36mfalse\u001b[0m\n", "timespan: (0.0, 4.0)\n", "u0: -1.0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ivp = ODEProblem((u,p,t)->sin((t+u)^2),-1.,(0.0,4.0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use a solver from `DifferentialEquations` to construct an accurate approximation to the exact solution." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "u_exact = solve(ivp,Tsit5(),reltol=1e-14,abstol=1e-14);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we perform a convergence study of the AB4 code." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
ninf-norm error
101.421332157914805
200.2998677236341702
400.006278094753455532
800.0005392729579345446
1603.975975730263759e-5
3202.64515824960343e-6
\n", "\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n = @. 10*2^(0:5)\n", "err = zeros(size(n))\n", "for (j,n) = enumerate(n)\n", " t,u = FNC.ab4(ivp,n)\n", " err[j] = norm(u_exact.(t)-u,Inf)\n", "end\n", "\n", "pretty_table((n=n,err=err),[\"n\",\"inf-norm error\"],backend=:html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The method should converge as $O(h^4)$, so a log-log scale is appropriate for the errors." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(n,err,m=:o,label=\"AB4\",\n", " xaxis=(:log10,\"n\"),yaxis=(:log10,\"inf-norm error\"),\n", " title=\"Convergence of AB4\",leg=:bottomleft)\n", "\n", "plot!(n,0.1*(n/n[1]).^(-4),l=:dash,label=\"4th order\")" ] } ], "metadata": { "kernelspec": { "display_name": "Julia (faststart)", "language": "julia", "name": "julia-fast" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.4.1" } }, "nbformat": 4, "nbformat_minor": 4 }