.. include:: ./reference.txt ################### Third-order methods ################### Third-order explicit Runge-Kutta methods are given by .. math:: & q^0 = p^n & q^1 = p^n + a_{1,0} f \left( q^0 \right) \Delta t & q^2 = p^n + a_{2,0} f \left( q^0 \right) \Delta t + a_{2,1} f \left( q^1 \right) \Delta t & q^3 = p^n + a_{3,0} f \left( q^0 \right) \Delta t + a_{3,1} f \left( q^2 \right) \Delta t + a_{3,2} f \left( q^3 \right) \Delta t & p^{n + 1} = q^3 The Butcher tableau is .. math:: \begin{array}{c|ccc} b_0 & a_{0,0} & a_{0,1} & a_{0,2} \\ b_1 & a_{1,0} & a_{1,1} & a_{1,2} \\ b_2 & a_{2,0} & a_{2,1} & a_{2,2} \\ \hline & a_{3,0} & a_{3,1} & a_{3,2} \\ \end{array} = \begin{array}{c|ccc} 0 & 0 & 0 & 0 \\ \alpha & \alpha & 0 & 0 \\ \beta & \frac{\beta}{\alpha} \frac{3 \alpha^2 - 3 \alpha + \beta}{3 \alpha - 2} & - \frac{\beta}{\alpha} \frac{\beta - \alpha}{3 \alpha - 2} & 0 \\ \hline & 1 - \frac{3 \alpha + 3 \beta - 2}{6 \alpha \beta} & \frac{3 \beta - 2}{6 \alpha \left( \beta - \alpha \right)} & \frac{- 3 \alpha + 2}{6 \beta \left( \beta - \alpha \right)} \\ \end{array} where the elements are constrained by two free parameters :math:`\left( \alpha, \beta \right)`. The low-storage schemes can be derived in the same manner as the second-order schemes; namely by substituting :math:`q^0` with the previous-step value: .. math:: & q^0 = p^n & r^0 = f \left( q^0 \right) & q^1 = q^0 + a_{1,0} r^0 \Delta t & r^1 = \frac{a_{2,0} - a_{1,0}}{a_{2,1}} f \left( q^0 \right) + f \left( q^1 \right) & q^2 = q^1 + a_{2,1} r^1 \Delta t & r^2 = \frac{a_{3,1} - a_{2,1}}{a_{3,2}} \left\{ \frac{a_{3,0} - a_{2,0}}{a_{3,1} - a_{2,1}} f \left( q^0 \right) + f \left( q^1 \right) \right\} + f \left( q^2 \right), & q^3 = q^2 + a_{3,2} r^2 \Delta t & p^{n + 1} = q^3 To be a low-storage scheme, the coefficients need to satisfy .. math:: \frac{a_{2,0} - a_{1,0}}{a_{2,1}} = \frac{a_{3,0} - a_{2,0}}{a_{3,1} - a_{2,1}}, so that :math:`r^2` can be directly computed using :math:`r^1`. Assigning the Butcher tableau to this relation yields .. math:: 6 \alpha^2 \beta - 6 \alpha \beta^2 + 3 \alpha \beta - 3 \alpha + 6 \beta^2 - 6 \beta + 2 = 0. .. literalinclude:: ./derive_third_order_methods.py :language: python :pyobject: find_constraint .. image:: ./third_order_methods_constraint.jpg The following method is popular among others (|WILLIAMSON1980|). .. math:: \left( \alpha, \beta \right) = \left( \frac{1}{3}, \frac{3}{4} \right) .. math:: \begin{array}{c|ccc} 0 & 0 & 0 & 0 \\ \frac{1}{3} & \frac{1}{3} & 0 & 0 \\ \frac{3}{4} & \frac{-3}{16} & \frac{15}{16} & 0 \\ \hline & \frac{1}{6} & \frac{3}{10} & \frac{8}{15} \\ \end{array} .. math:: \begin{array}{c|ccc} k & 0 & 1 & 2 \\ \hline \beta^k & 0 & \frac{-5}{9} & \frac{-153}{128} \\ \gamma^k & \frac{1}{3} & \frac{15}{16} & \frac{8}{15} \\ \end{array}