The Rif Project

The current research involves the analysis and development of efficient algorithms to simplify over-determined non-linear systems of PDE to standard/canonical form. These systems commonly arise in the determination of symmetries of PDE and ODE.

This package was motivated by the previous work on Standard Form (last public release was 2.0 in 1993).

The package is currently undergoing alpha testing, and enhancement by the addition of new analysis tools.


Fast & memory efficient handling of large systems.

Polynomially non-linear equation simplification through use of algebraic Groebner Bases.

Case splitting and case tree spanning.

Handling of inequations (i.e. equations of the form expr<>0).

Graphical representation of results.

Example: Full case tree for Kamke's ODE #123

> with(Rif);

[caseplot, checkrank, initialdata, rifread, rifsimp...

Now load the ODEtools/PDEtools packages (our thanks to Dr. Edgardo Cheb-Terrab for these and the typesetting features):

> with(PDEtools): with(ODEtools):

> declare(xi(x,y),eta(x,y),f(x),g(x)); ON:

` xi(x,y) will now be displayed as xi `

` eta(x,y) will now be displayed as eta `

` f(x) will now be displayed as f `

` g(x) will now be displayed as g `

Here is the ODE:

> ODE:=diff(y(x),x,x)*y(x)-diff(y(x),x)^2+(g(x)+y(x)^2*f(x))*diff(y(x),x)

ODE := y[x,x]*y(x)-y[x]^2+(g+y(x)^2*f)*y[x]-y(x)*(g...

We use ODEtools/PDEtools to generate the determining system:

> sys:=gensys(ODE,y(x),[xi,eta](x,y));

sys := -xi[y,y]*y^2-y*xi[y], eta+3*y*xi[y]*(g+y^2*f...
sys := -xi[y,y]*y^2-y*xi[y], eta+3*y*xi[y]*(g+y^2*f...
sys := -xi[y,y]*y^2-y*xi[y], eta+3*y*xi[y]*(g+y^2*f...
sys := -xi[y,y]*y^2-y*xi[y], eta+3*y*xi[y]*(g+y^2*f...

And now we put the system into reduced involutive form:

> ans:=rifsimp({sys},[xi,eta],casesplit):

This system took 87 CPU seconds running on a PII 333, and consumed 4.8M of memory.

Now since the calculation was performed with the casesplit option, the program performs case splitting, when necessary, to put the system into RIF form. The assumptions for a split are of the form expr<>0 or expr=0. Let's take a look at a graphical representation of the tree:

> caseplot(ans);

[Maple Plot]

We can see from the diagram that we have 21 branches of the system, of which 6 are inconsistent (red: 6,9,15,19,20). This means that the assumptions made in the case split resulted in an inconsistent system. Looking at branch 21:

> sys22:=copy(ans[21]);

sys22 := TABLE([Case = [[g+y^2*f = 0, xi[x]]], Solv...
sys22 := TABLE([Case = [[g+y^2*f = 0, xi[x]]], Solv...
sys22 := TABLE([Case = [[g+y^2*f = 0, xi[x]]], Solv...
sys22 := TABLE([Case = [[g+y^2*f = 0, xi[x]]], Solv...

So we have our system in reduced involutive form with the assumption(s) given in the Case entry. Note: in this case, f,g are only functions of x, so the branch implies that f,g=0. Any additional inequation constraints would be present in a `Pivots` entry.