Multi-dimensional PDE problems¶
The fundamental ideas in the derivation of \(F_i\) and \(J_{i,j}\) in the 1D model problem are easily generalized to multi-dimensional problems. Nevertheless, the expressions involved are slightly different, with derivatives in \(x\) replaced by \(\nabla\), so we present some examples below in detail.
Finite element discretization¶
As an example, Backward Euler discretization of the PDE
gives the nonlinear time-discrete PDEs
We may alternatively write this equation with \(u\) for \(u^n\) and \(u^{(1)}\) for \(u^{n-1}\):
Understand the meaning of the symbol \(u\) in various formulas
Note that the mathematical meaning of the symbol \(u\) changes in the above equations: \(u(\boldsymbol{x},t)\) is the exact solution of (75), \(u^n(\boldsymbol{x})\) is an approximation to the exact solution at \(t=t_n\), while \(u(\boldsymbol{x})\) in the latter equation is a synonym for \(u^n\). Below, this \(u(\boldsymbol{x})\) will be approximated by a new \(u=\sum_kc_k{\psi}_k(\boldsymbol{x})\) in space, and then the actual \(u\) symbol used in the Picard and Newton iterations is a further approximation of \(\sum_kc_k{\psi}_k\) arising from the nonlinear iteration algorithm.
Much literature reserves \(u\) for the exact solution, uses \(u_h(x, t)\)
for the finite element solution that varies continuously in time,
introduces perhaps \(u_h^n\) as the approximation of \(u_h\) at time \(t_n\),
arising from some time discretization, and then finally applies
\(u_h^{n,k}\) for the approximation to \(u_h^n\) in the \(k\)-th
iteration of a Picard or Newton method. The converged solution at
the previous time step can be called \(u_h^{n-1}\), but then this
quantity is an approximate solution of the nonlinear equations (at the
previous time level), while the counterpart \(u_h^n\) is formally the
exact solution of the nonlinear equations at the current time level.
The various symbols in the
mathematics can in this way be clearly distinguished. However,
we favor to use \(u\) for the quantity that is most naturally called u
in the code, and that is the most recent approximation to the solution,
e.g., named \(u_h^{n,k}\) above. This is also the key quantity of
interest in mathematical derivations of algorithms as well.
Choosing \(u\) this way makes the most important mathematical cleaner
than using more cluttered notation as \(u_h^{n,k}\).
We therefore introduce other symbols for other versions of the unknown
function. It is most appropriate for us to say that \({u_{\small\mbox{e}}}(\boldsymbol{x}, t)\) is the
exact solution, \(u^n\) in the equation above
is the approximation to \({u_{\small\mbox{e}}}(\boldsymbol{x},t_n)\) after
time discretization, and \(u\) is the spatial approximation to
\(u^n\) from the most recent iteration in a nonlinear iteration method.
Let us assume homogeneous Neumann conditions on the entire boundary for simplicity in the boundary term. The variational form becomes: find \(u\in V\) such that
The nonlinear algebraic equations follow from setting \(v={\psi}_i\) and using the representation \(u=\sum_kc_k{\psi}_k\), which we just write as
Picard iteration needs a linearization where we use the most recent approximation \(u^{-}\) to \(u\) in \({\alpha}\) and \(f\):
The equations \(\hat F_i=0\) are now linear and we can easily derive a linear system \(\sum_{j\in{\mathcal{I}_s}}A_{i,j}c_j=b_i\), \(i\in{\mathcal{I}_s}\), for the unknown coefficients \(\left\{ {c}_i \right\}_{i\in{\mathcal{I}_s}}\) by inserting \(u=\sum_jc_j{\psi}_j\). We get
In Newton’s method we need to evaluate \(F_i\) with the known value \(u^{-}\) for \(u\):
The Jacobian is obtained by differentiating (77) and using
The result becomes
The evaluation of \(J_{i,j}\) as the coefficient matrix in the linear system in Newton’s method applies the known approximation \(u^{-}\) for \(u\):
Hopefully, this example also shows how convenient the notation with \(u\) and \(u^{-}\) is: the unknown to be computed is always \(u\) and linearization by inserting known (previously computed) values is a matter of adding an underscore. One can take great advantage of this quick notation in software [Ref2].
Non-homogeneous Neumann conditions¶
A natural physical flux condition for the PDE (75) takes the form of a non-homogeneous Neumann condition
where \(g\) is a prescribed function and \(\partial\Omega_N\) is a part of the boundary of the domain \(\Omega\). From integrating \(\int_\Omega\nabla\cdot({\alpha}\nabla u){\, \mathrm{d}x}\) by parts, we get a boundary term
Inserting the condition (84) into this term results in an integral over prescribed values:
The nonlinearity in the \({\alpha}(u)\) coefficient condition (84) therefore does not contribute with a nonlinearity in the variational form.
Robin conditions¶
Heat conduction problems often apply a kind of Newton’s cooling law, also known as a Robin condition, at the boundary:
where \(h(u)\) is a heat transfer coefficient between the body (\(\Omega\)) and its surroundings, \(T_s\) is the temperature of the surroundings, and \(\partial\Omega_R\) is a part of the boundary where this Robin condition applies. The boundary integral (85) now becomes
In many physical applications, \(h(u)\) can be taken as constant, and then the boundary term is linear in \(u\), otherwise it is nonlinear and contributes to the Jacobian in a Newton method. Linearization in a Picard method will typically use a known value in \(h\), but keep the \(u\) in \(u-T_s\) as unknown: \(h(u^{-})(u-T_s(t))\). Exercise 15: Derive Picard and Newton systems from a variational form asks you to carry out the details.
Finite difference discretization¶
A typical diffusion equation
can be discretized by (e.g.) a Backward Euler scheme, which in 2D can be written
We do not dive into the details of handling boundary conditions now. Dirichlet and Neumann conditions are handled as in a corresponding linear, variable-coefficient diffusion problems.
Writing the scheme out, putting the unknown values on the left-hand side and known values on the right-hand side, and introducing \(\Delta x=\Delta y=h\) to save some writing, one gets
This defines a nonlinear algebraic system on the form \(A(u)u=b(u)\).
Picard iteration¶
The most recently computed values \(u^{-}\) of \(u^n\) can be used in \({\alpha}\) and \(f\) for a Picard iteration, or equivalently, we solve \(A(u^{-})u=b(u^{-})\). The result is a linear system of the same type as arising from \(u_t = \nabla\cdot ({\alpha}(\boldsymbol{x})\nabla u) + f(\boldsymbol{x},t)\).
The Picard iteration scheme can also be expressed in operator notation:
Newton’s method¶
As always, Newton’s method is technically more involved than Picard iteration. We first define the nonlinear algebraic equations to be solved, drop the superscript \(n\) (use \(u\) for \(u^n\)), and introduce \(u^{(1)}\) for \(u^{n-1}\):
It is convenient to work with two indices \(i\) and \(j\) in 2D finite difference discretizations, but it complicates the derivation of the Jacobian, which then gets four indices. (Make sure you really understand the 1D version of this problem as treated in the section Finite difference discretization.) The left-hand expression of an equation \(F_{i,j}=0\) is to be differentiated with respect to each of the unknowns \(u_{r,s}\) (recall that this is short notation for \(u_{r,s}^n\)), \(r\in{\mathcal{I}_x}\), \(s\in{\mathcal{I}_y}\):
The Newton system to be solved in each iteration can be written as
Given \(i\) and \(j\), only a few \(r\) and \(s\) indices give nonzero contribution to the Jacobian since \(F_{i,j}\) contains \(u_{i\pm 1,j}\), \(u_{i,j\pm 1}\), and \(u_{i,j}\). This means that \(J_{i,j,r,s}\) has nonzero contributions only if \(r=i\pm 1\), \(s=j\pm 1\), as well as \(r=i\) and \(s=j\). The corresponding terms in \(J_{i,j,r,s}\) are \(J_{i,j,i-1,j}\), \(J_{i,j,i+1,j}\), \(J_{i,j,i,j-1}\), \(J_{i,j,i,j+1}\), and \(J_{i,j,i,j}\). Therefore, the left-hand side of the Newton system, \(\sum_r\sum_s J_{i,j,r,s}\delta u_{r,s}\) collapses to
The specific derivatives become
The \(J_{i,j,i,j}\) entry has a few more terms and is left as an exercise. Inserting the most recent approximation \(u^{-}\) for \(u\) in the \(J\) and \(F\) formulas and then forming \(J\delta u=-F\) gives the linear system to be solved in each Newton iteration. Boundary conditions will affect the formulas when any of the indices coincide with a boundary value of an index.
Continuation methods¶
Picard iteration or Newton’s method may diverge when solving PDEs with severe nonlinearities. Relaxation with \(\omega <1\) may help, but in highly nonlinear problems it can be necessary to introduce a continuation parameter \(\Lambda\) in the problem: \(\Lambda =0\) gives a version of the problem that is easy to solve, while \(\Lambda =1\) is the target problem. The idea is then to increase \(\Lambda\) in steps, \(\Lambda_0=0 ,\Lambda_1 <\cdots <\Lambda_n=1\), and use the solution from the problem with \(\Lambda_{i-1}\) as initial guess for the iterations in the problem corresponding to \(\Lambda_i\).
The continuation method is easiest to understand through an example. Suppose we intend to solve
which is an equation modeling the flow of a non-Newtonian fluid through a channel or pipe. For \(q=0\) we have the Poisson equation (corresponding to a Newtonian fluid) and the problem is linear. A typical value for pseudo-plastic fluids may be \(q_n=-0.8\). We can introduce the continuation parameter \(\Lambda\in [0,1]\) such that \(q=q_n\Lambda\). Let \(\{\Lambda_\ell\}_{\ell=0}^n\) be the sequence of \(\Lambda\) values in \([0,1]\), with corresponding \(q\) values \(\{q_\ell\}_{\ell=0}^n\). We can then solve a sequence of problems
where the initial guess for iterating on \(u^{\ell}\) is the previously computed solution \(u^{\ell-1}\). If a particular \(\Lambda_\ell\) leads to convergence problems, one may try a smaller increase in \(\Lambda\): \(\Lambda_* = \frac{1}{2} (\Lambda_{\ell-1}+\Lambda_\ell)\), and repeat halving the step in \(\Lambda\) until convergence is reestablished.