Search code examples
maxima

Simplification of rational expressions


I'm struggling with getting maxima to simplify expressions in the way that I want them.

rhs(solve(a*x-3=b*y,x)[1]);

returns

(b*y+3)/3

However, I'm wanting to display the result to students and so I want the output to be

(b*y/3) + 1

Is there some simplification that I can do to a rational expression in this form to get the output I want?


Solution

  • You can undo the effect of ratsimp in this case by dividing each term in the numerator by the denominator. Here is a simple-minded implementation:

    (%i1) unratsimp (e) := 
              block ([foo, bar],
                     [foo, bar]: [num(e), denom(e)],
                     map (lambda ([foo1], foo1/bar), expand (foo))) $
    (%i2) 1 + a/b + c*d/3 - %pi*x/y;
                            %pi x    c d   a
    (%o2)                (- -----) + --- + - + 1
                              y       3    b
    (%i3) ratsimp(%);
                    (b c d + 3 b + 3 a) y - 3 %pi b x
    (%o3)           ---------------------------------
                                  3 b y
    (%i4) unratsimp(%);
                            %pi x    c d   a
    (%o4)                (- -----) + --- + - + 1
                              y       3    b
    (%i5) unratsimp((b*y + 3)/3);
                                 b y
    (%o5)                        --- + 1
                                  3
    

    I don't know how general that is; it's just the first thing I tried, but maybe it's enough for your purpose. I don't know a built-in function for this.

    The results %o4 and %o5 are maybe not exactly as a human would write them. Convincing Maxima to display the terms in + and * expressions in a different way is not straightforward -- Maxima has strong ideas about how to order terms in an expression which are assumed throughout the code. But I think that others have asked questions, which might have answers, about displaying expressions -- you might search Stackoverflow if you are are interested.