From 94728f19defa37d6dcd34f7d2a529430147326e9 Mon Sep 17 00:00:00 2001 From: utkuyilmaz1903 Date: Sun, 8 Mar 2026 00:45:13 +0300 Subject: [PATCH 1/2] Add tutorial for finite differences on non-uniform grids --- docs/pages.jl | 1 + docs/src/tutorials/nonuniform_grid.md | 31 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 docs/src/tutorials/nonuniform_grid.md diff --git a/docs/pages.jl b/docs/pages.jl index d77151f5b..17d144372 100644 --- a/docs/pages.jl +++ b/docs/pages.jl @@ -9,6 +9,7 @@ pages = [ "tutorials/icbc_sampled.md", "tutorials/PIDE.md", "tutorials/schroedinger.md", + "tutorials/nonuniform_grid.md", ], "MOLFiniteDifference" => "MOLFiniteDifference.md", "Solution Interface - PDESolutions" => "solutions.md", diff --git a/docs/src/tutorials/nonuniform_grid.md b/docs/src/tutorials/nonuniform_grid.md new file mode 100644 index 000000000..22014daae --- /dev/null +++ b/docs/src/tutorials/nonuniform_grid.md @@ -0,0 +1,31 @@ +# Finite Differences on Non-Uniform Grids + +Many finite difference examples assume a **uniform spatial grid**, where the spacing between grid points is constant. However, in practical PDE problems, it is often useful to use **non-uniform grids**, where grid points are clustered in regions requiring higher resolution. + +--- + +## Uniform Grid + +A uniform grid has constant spacing: +$x_i = i \Delta x$ + +For the second derivative, we use the classical centered finite difference stencil: +$$u''(x_i) \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{\Delta x^2}$$ + +Example in Julia: +```julia +function second_derivative_uniform(u, dx, i) + return (u[i+1] - 2u[i] + u[i-1]) / dx^2 +end +Non-Uniform GridIn a non-uniform grid, the spacing varies. Let:$\Delta x_i = x_i - x_{i-1}$$\Delta x_{i+1} = x_{i+1} - x_i$The second derivative approximation becomes:$$u''(x_i) \approx \frac{2}{\Delta x_i (\Delta x_i + \Delta x_{i+1})} u_{i-1} - \frac{2}{\Delta x_i \Delta x_{i+1}} u_i + \frac{2}{\Delta x_{i+1} (\Delta x_i + \Delta x_{i+1})} u_{i+1}$$Example implementation:Juliafunction second_derivative_nonuniform(u, x, i) + dx_i = x[i] - x[i-1] + dx_ip1 = x[i+1] - x[i] + + return ( + 2 / (dx_i * (dx_i + dx_ip1)) * u[i-1] - + 2 / (dx_i * dx_ip1) * u[i] + + 2 / (dx_ip1 * (dx_i + dx_ip1)) * u[i+1] + ) +end +Example GridAn example of a non-uniform grid array:Juliax = [0.0, 0.05, 0.1, 0.2, 0.4, 0.7, 1.0] +This grid places more points near the left boundary. Such grids are particularly useful when dealing with:Boundary layersSingularitiesAdaptive resolution requirementsSummaryUniform grids: Simpler stencils, easier implementation.Non-uniform grids: Flexible resolution, crucial for complex PDE problems, require modified finite difference operators. \ No newline at end of file From a2a600a0b4e1cb2b0d3b8bf3b60a0acf88b138c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Utku=20Y=C4=B1lmaz?= Date: Mon, 9 Mar 2026 17:51:21 +0300 Subject: [PATCH 2/2] Enhance non-uniform grid tutorial with examples Added detailed explanation and example implementation for non-uniform grids, including second derivative approximation and example grid. --- docs/src/tutorials/nonuniform_grid.md | 47 ++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/docs/src/tutorials/nonuniform_grid.md b/docs/src/tutorials/nonuniform_grid.md index 22014daae..26395b346 100644 --- a/docs/src/tutorials/nonuniform_grid.md +++ b/docs/src/tutorials/nonuniform_grid.md @@ -10,14 +10,33 @@ A uniform grid has constant spacing: $x_i = i \Delta x$ For the second derivative, we use the classical centered finite difference stencil: -$$u''(x_i) \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{\Delta x^2}$$ -Example in Julia: +$$ u''(x_i) \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{\Delta x^2} $$ + +### Example in Julia + ```julia function second_derivative_uniform(u, dx, i) return (u[i+1] - 2u[i] + u[i-1]) / dx^2 end -Non-Uniform GridIn a non-uniform grid, the spacing varies. Let:$\Delta x_i = x_i - x_{i-1}$$\Delta x_{i+1} = x_{i+1} - x_i$The second derivative approximation becomes:$$u''(x_i) \approx \frac{2}{\Delta x_i (\Delta x_i + \Delta x_{i+1})} u_{i-1} - \frac{2}{\Delta x_i \Delta x_{i+1}} u_i + \frac{2}{\Delta x_{i+1} (\Delta x_i + \Delta x_{i+1})} u_{i+1}$$Example implementation:Juliafunction second_derivative_nonuniform(u, x, i) +``` + +## Non-Uniform Grid + +In a non-uniform grid, the spacing varies between each point. Let: + +$\Delta x_i = x_i - x_{i-1}$ + +$\Delta x_{i+1} = x_{i+1} - x_i$ + +The second derivative approximation for non-uniform spacing becomes: + +$$u''(x_i) \approx \frac{2}{\Delta x_i (\Delta x_i + \Delta x_{i+1})} u_{i-1} - \frac{2}{\Delta x_i \Delta x_{i+1}} u_i + \frac{2}{\Delta x_{i+1} (\Delta x_i + \Delta x_{i+1})} u_{i+1}$$ + +## Example Implementation + +```julia +function second_derivative_nonuniform(u, x, i) dx_i = x[i] - x[i-1] dx_ip1 = x[i+1] - x[i] @@ -27,5 +46,23 @@ Non-Uniform GridIn a non-uniform grid, the spacing varies. Let:$\Delta x_i = x_i 2 / (dx_ip1 * (dx_i + dx_ip1)) * u[i+1] ) end -Example GridAn example of a non-uniform grid array:Juliax = [0.0, 0.05, 0.1, 0.2, 0.4, 0.7, 1.0] -This grid places more points near the left boundary. Such grids are particularly useful when dealing with:Boundary layersSingularitiesAdaptive resolution requirementsSummaryUniform grids: Simpler stencils, easier implementation.Non-uniform grids: Flexible resolution, crucial for complex PDE problems, require modified finite difference operators. \ No newline at end of file +``` + +## Example Grid + +An example of a non-uniform grid array that places more points near the left boundary: + + x = [0.0, 0.05, 0.1, 0.2, 0.4, 0.7, 1.0] + +Such grids are particularly useful when dealing with: + +1. **Boundary layers:** Where the solution changes rapidly near edges. +2. **Singularities:** To capture sharp gradients. +3. **Adaptive resolution requirements:** To save memory by using fewer points in "quiet" regions. + +--- + +## Summary + +* **Uniform grids:** Simpler stencils, easier implementation, constant $\Delta x$. +* **Non-uniform grids:** Flexible resolution, crucial for complex real-world PDE problems, require modified finite difference operators.