UC Berkeley Math 228B, Spring 2024, Problem Set 7
Per-Olof Persson
persson@berkeley.edu
Due May 3
This content is protected and may not be shared, uploaded, or distributed.
The
dgconvect0function on the course web page has several shortcomings. Write a new version nameddgconvectwhich incorporates the following improvements:Replace the equidistant node positions in an element by the Chebyshev nodes \(s_i = \cos(\pi i/p)\), \(i=0,\ldots,p\), scaled and translated to \([0,h]\) and in increasing order.
Implement support for arbitrary polynomial degrees \(p\), by computing the mass matrix
Meland the stiffness matrixKelusing Gaussian quadrature of degree \(2p\) (see functiongauss_quadon the course web page). Form the nodal basis functions using Legendre polynomials (see functionlegendre_polyon the course web page).The original version plots the solution using straight lines between each nodal value. Improve this by evaluating the function (that is, the polynomials in each elements) at a grid with \(3p\) equidistant nodes, and draw straight lines between those points.
Replace the discrete max-norm in the computation of the error by the continuous \(L_2\)-norm \(\|u\|_2 = \left(\int_0^1 u(x)^2\,dx\right)^{1/2}\).
Write a function with the syntax
errors, slopes = dgconvect_convergence()which runs your functiondgconvectusing \(p=1,2,4,8,16\), \(\Delta t=2\cdot 10^{-4}\), \(T=1\), and number of elements \(n\) chosen such that the total number of nodes \(n\cdot p\) equals \(16, 32, 64, 128, 256\). Return the corresponding errors in the \(5\)-by-\(5\) arrayerrors, and estimate 5 slopes in the arrayslopesmaking sure to exclude points that appear to be affected by rounding errors. Also make a log-log plot of the errors vs. the number of nodes \(n\cdot p\).
Write a function with the syntax
u, error = dgconvdiff(; n=10, p=1, T=1.0, dt=1e-3, k=1e-3)which is a modification of yourdgconvectfunction from the previous problem to solve the convection-diffusion equation \[\begin{aligned} \frac{\partial u}{\partial t} + \frac{\partial u}{\partial x} - k \frac{\partial^2u} {\partial x^2} = 0, \end{aligned}\] on \(x\in [0,1]\) with the same initial condition as before, \(u(x,0) = \mathrm{exp} \left\{ -100(x-0.5)^2 \right\}\), and periodic boundary conditions. Use the LDG method for the second-order derivative with \(C_{11} = 0\) and \(C_{12} = 1/2\) (pure upwinding/downwinding). For the error computation, use the exact solution \[\begin{aligned} u(x,t) = \sum_{i = -N}^N \frac{1}{\sqrt{1+400kt}} \mathrm{exp} \left\{ -100\frac{(x-0.5-t+i)^2}{1+400kt} \right\} \end{aligned}\] where \(N\) should be infinity but \(N=2\) is sufficient here.Write a function with the syntax
errors, slopes = dgconvdiff_convergence()that performs a convergence study for your
dgconvdifffunction exactly as in problem 1, using a diffusion coefficient of \(k=10^{-3}\).
Code Submission: Your Julia file needs to define the four requested functions, with exactly the requested names and input/output arguments, as well as any other supporting functions and variables that are required for your functions to run correctly.