rifsimp[cases] - case splitting and related options

Description

mindim=n Minimum of n free 0-dimensional parameters in
the dependent variables in vars.
mindim=[v,n] Minimum of n free 0-dimensional parameters in
the dependent variables v (v is either a
dependent variable name or set of more than one).
mindim=[v,n,d] Minimum of n free d-dimensional parameters in
the dependent variables v, where v is as above.
mindim=[c1,c2,...] Here c1,c2,... are conditions of the [v,n,d] type.

"smalleq" Choose the pivot belonging to the smallest
equation (based on the Maple
length function).
This is the default.
"smallpiv" Similar to "smalleq", but the length of the
pivots are compared instead.
"lowrank" Choose the pivot for the equation with
leading derivative of lowest rank. Ties
are broken by equation length.
"mindim" Choose the pivot for the equation with
leading derivative that will reduce the size
of the initial data by the greatest amount.
This option can only be used in combination
with the
mindim option described above.
["smalleq",vars] Same as "smalleq" above, but it only looks at
equations with leading derivatives in the
vars sequence.
["lowrank",vars] Same as "lowrank" above, but it only looks at
equations with leading derivatives in the
vars sequence.

nolead This is the default. Only split on a factor
if it does not contain the leading derivative
of the equation.
all Split on any factors, even if they contain the
leading derivative.
none Do not perform factored splitting.

Examples

> with(Rif):

Suppose we have the ODE shown below. We want to determine conditions on g(y(x)) and f(x) that allow the equation to be mapped to y'' = 0 by an invertible change of variables of the form Y=Y(x,y), X=X(x,y) . It is known that the equation can be mapped to y''=0 if the Lie group of the equation is 8-dimensional. This is the perfect opportunity to use the mindim option in combination with cases, to tell rifsimp that we are only interested in cases with 8 dimensions or more:

> ODE1:=diff(y(x),x,x)+g(y(x))*diff(y(x),x)+f(x)*y(x);

ODE1 := diff(y(x),`$`(x,2))+g(y(x))*diff(y(x),x)+f(...

We can use the DEtools[odepde] command to generate the determining system for this ODE, and we obtain the following:

> sys1:=[coeffs(expand(DEtools[odepde](ODE1,[xi(x,y),eta(x,y)], y(x))),_y1)];

sys1 := [g(y)*diff(eta(x,y),x)+eta(x,y)*f(x)-diff(e...
sys1 := [g(y)*diff(eta(x,y),x)+eta(x,y)*f(x)-diff(e...
sys1 := [g(y)*diff(eta(x,y),x)+eta(x,y)*f(x)-diff(e...
sys1 := [g(y)*diff(eta(x,y),x)+eta(x,y)*f(x)-diff(e...
sys1 := [g(y)*diff(eta(x,y),x)+eta(x,y)*f(x)-diff(e...

Applying rifsimp :

> ans1:=rifsimp(sys1,[xi,eta],casesplit,mindim=8):

> caseplot(ans1);

Issuing the caseplot command above would show that there is one case for which this occurs. This case is given by:

> copy(ans1[3]);

TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...
TABLE([Case = [[diff(g(y),`$`(y,2)) = 0, diff(xi(x,...

So the original ODE is equivalent to y''=0 when g'(y) is zero, regardless of the form of f(x) .

As a demonstration of the faclimit option, consider the following system:

> sys2:=[eta(x,y)*(3*f(x)+2*g(x)-h(x)),
eta(x,y)*(f(x)-2*g(x)-5*h(x)+2),
eta(x,y)*(-f(x)-3*g(x)+h(x)-3),
eta(x,y)*(3*f(x)-3*g(x)-5*h(x)-1)];

sys2 := [eta(x,y)*(3*f(x)+2*g(x)-h(x)), eta(x,y)*(f...
sys2 := [eta(x,y)*(3*f(x)+2*g(x)-h(x)), eta(x,y)*(f...
sys2 := [eta(x,y)*(3*f(x)+2*g(x)-h(x)), eta(x,y)*(f...
sys2 := [eta(x,y)*(3*f(x)+2*g(x)-h(x)), eta(x,y)*(f...

The regular case-splitting strategy produces an undesirable result for this system, namely more cases than required to describe the system:

> ans2_1:=rifsimp(sys2,[eta],casesplit);

ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...
ans2_1 := TABLE([1 = TABLE([Case = [[3*f(x)+2*g(x)-...

So we get 4 cases. Now set faclimit set to 2:

> ans2_2:=rifsimp(sys2,[eta],casesplit,faclimit=2);

ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...
ans2_2 := TABLE([1 = TABLE([Case = [[eta(x,y) <> 0,...

So although both ans2_1 and ans2_2 equally valid, it is clear that ans2_2 would be preferred.

As an example of the factoring option, consider the following purely algebraic system:

> sys := [x^3-7*x+6];

sys := [x^3-7*x+6]

With default options, we obtain

> rifsimp(sys,casesplit);

TABLE([Constraint = [x^3-7*x+6 = 0]])

With full factoring enabled, we obtain

> rifsimp(sys,casesplit,factoring=all);

TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,
TABLE([1 = TABLE([Case = [[x-1 <> 0,

So we see that the system has been split into three disjoint cases. Also note that the Case entries describe the path the computation took, and there are no Pivots entries. This is because the pivots resulting from the case splits are identically satisfied for each case.

See Also

caseplot , rifsimp , rifsimp[nonlinear] , rifsimp[output]