Solving Recurrence Equations

If you represent the n(^th) term in a sequence as a[n], you can use a recurrence equation to specify how it is related to other terms in the sequence.

(RefLink[RSolve, paclet:ref/RSolve]) takes recurrence equations and solves them to get explicit formulas for a[n].

This solves a simple recurrence equation:

RSolve[{a[n]==2 a[n-1],a[1]==1},a[n],n]

This takes the solution and makes an explicit table of the first 10 a[n]:

Table[a[n]/.First[%],{n,10}]

Solving a recurrence equation.

This solves a recurrence equation for a geometric series:

RSolve[{a[n]==r a[n-1]+1,a[1]==1},a[n],n]

This gives the same result:

RSolve[{a[n+1]==r a[n]+1,a[1]==1},a[n],n]

This gives an algebraic solution to a recurrence equation:

RSolve[{a[n]==4 a[n-1]+a[n-2]},a[n],n]

This solves the Fibonacci recurrence equation:

RSolve[{a[n]==a[n-1]+a[n-2],a[1]==a[2]==1},a[n],n]

(RefLink[RSolve, paclet:ref/RSolve]) can be thought of as a discrete analog of (RefLink[DSolve, paclet:ref/DSolve]). Many of the same functions generated in solving differential equations also appear in finding symbolic solutions to recurrence equations.

This generates a gamma function, which generalizes the factorial:

RSolve[{a[n]==n a[n-1],a[1]==1},a[n],n]

This second-order recurrence equation comes out in terms of Bessel functions:

RSolve[{a[n+1]==n a[n]+a[n-1],a[1]==0,a[2]==1},a[n],n]

(RefLink[RSolve, paclet:ref/RSolve]) does not require you to specify explicit values for terms such as a[1]. Like (RefLink[DSolve, paclet:ref/DSolve]), it automatically introduces undetermined constants (RefLink[C, paclet:ref/C])[i] to give a general solution.

This gives a general solution with one undetermined constant:

RSolve[a[n]==n a[n-1],a[n],n]

(RefLink[RSolve, paclet:ref/RSolve]) can solve equations that do not depend only linearly on a[n]. For nonlinear equations, however, there are sometimes several distinct solutions that must be given. Just as for differential equations, it is a difficult matter to find symbolic solutions to recurrence equations, and standard mathematical functions only cover a limited set of cases.

Here is the general solution to a nonlinear recurrence equation:

RSolve[{a[n]==a[n+1] a[n-1]},a[n],n]

This gives two distinct solutions:

RSolve[a[n]==(a[n+1] a[n-1])^2,a[n],n]

(RefLink[RSolve, paclet:ref/RSolve]) can solve not only ordinary difference equations in which the arguments of a differ by integers, but also q-difference equations in which the arguments of a are related by multiplicative factors.

This solves the q-difference analog of the factorial equation:

RSolve[a[q n]==n a[n],a[n],n]

Here is a second-order q-difference equation:

RSolve[a[n]==a[q n]+a[n/q],a[n],n]

Solving systems of recurrence equations.

This solves a system of two coupled recurrence equations:

RSolve[{a[n]==b[n-1]+n,b[n]==a[n-1]-n,a[1]==b[1]==1},{a[n],b[n]},n]

Solving partial recurrence equations.

Just as one can set up partial differential equations that involve functions of several variables, so one can also set up partial recurrence equations that involve multidimensional sequences. Just as in the differential equations case, general solutions to partial recurrence equations can involve undetermined functions.

This gives the general solution to a simple partial recurrence equation:

RSolve[a[i+1,j+1]==i j a[i,j],a[i,j],{i,j}]