--- /dev/null
+function K = diffusion_matrix_sparse(integerN)
+ ##
+ ## A sparse representation of the matrix K in the advection-diffusion
+ ## equation. See advection_matrix.m for details.
+ ##
+
+ if (integerN < 2)
+ K = NA;
+ return
+ end
+
+ ## The negative ones directly above the diagonal.
+ top = [ [zeros(integerN-1, 1), -speye(integerN-1)]; ...
+ zeros(1, integerN)];
+
+ ## The negative ones directly below the diagonal.
+ bottom = [ [zeros(1, integerN-1); ...
+ -speye(integerN-1) ], zeros(integerN, 1)];
+
+ ## Combine the top and bottom.
+ K = top + bottom + 2*speye(integerN);
+
+ ## Fill in the entries in the corner.
+ K(1, integerN) = -1;
+ K(integerN, 1) = -1;
+end
--- /dev/null
+expected_K = [2, -1, 0, 0, -1;
+ -1, 2, -1, 0, 0;
+ 0, -1, 2, -1, 0;
+ 0, 0, -1, 2, -1;
+ -1, 0, 0, -1, 2];
+
+actual_K = diffusion_matrix_sparse(5);
+
+unit_test_equals("diffusion_matrix_sparse(5) looks right", ...
+ true, ...
+ isequal(actual_K, expected_K));