Solving recurrence equations

RESequence Object subclass: #RESequence instanceVariableNames: 'context rules variables sequence stepSize indexVariable parameters iterationCode' classVariableNames: '' package: 'RecurrenceEquations' is a tool external to Leibniz that uses Leibniz contexts as its user interface. It is a simple numerical tool that solves recurrence equations. It reads the equations to be solved from a Leibniz context in the form of labelled rules, which it compiles to Pharo code.

More sophisticated numerical tools, such as ODE solvers, could be interfaced with Leibniz in the same way. They could also generate and use code in other (more efficient) languages than Pharo.

The inputs to a recurrence equation solver are:
- a list of recurrence equations
- a list of initial values for each variable
RESequence Object subclass: #RESequence instanceVariableNames: 'context rules variables sequence stepSize indexVariable parameters iterationCode' classVariableNames: '' package: 'RecurrenceEquations' reads the equations from a Leibniz context but takes the initial values as standard Pharo arrays. This is most convenient for this specific use case, because it permits the last-minute choice of floating-point vs. exact arithmetic: just write the initial values as floating-point constants or as integer/fraction constants. However, an external tool can read any data it wants from a Leibniz context, including the initial values.

Example: Fibonacci numbers

Uses:
- fibonacci Functions
- fibonacci Integers

The Fibonacci numbers fibonacci F : ℕ.nz ℕ.nz are defined by the recurrence equation
fibonacci fibonacciRecurrence: F[n:ℕ.nz] ⇒ F[n - 1] + F[n - 2] | n > 2
starting with fibonacci F[1] ⇒ 1 and fibonacci F[2] ⇒ 1.

These rules are sufficient to compute any Fibonacci number in Leibniz, e.g.
fibonacci F[10] ⇒ 55.

Using RESequence Object subclass: #RESequence instanceVariableNames: 'context rules variables sequence stepSize indexVariable parameters iterationCode' classVariableNames: '' package: 'RecurrenceEquations' we find:

sequence := RESequence
	context: (thisSnippet page lzSubcontext: #fibonacci)
	rules: #('fibonacciRecurrence')
	initialValues: (Dictionary with: #F -> #(1 1)).
sequence addSteps: 10.
sequence
  

Example: Lotka-Volterra equations

See Lotka-Volterra equations