有理式的简化

Simplification of rational expressions

我正在努力获取最大值以按照我想要的方式简化表达式。

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

returns

(b*y+3)/3

但是,我想向学生显示结果,所以我希望输出为

(b*y/3) + 1

我可以对这种形式的有理表达式进行一些简化以获得我想要的输出吗?

在这种情况下,您可以通过将分子中的每一项除以分母来取消 ratsimp 的影响。这是一个简单的实现:

(%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

我不知道这有多普遍;这只是我尝试的第一件事,但也许足以满足您的目的。我不知道这个的内置函数。

结果 %o4 和 %o5 可能与人类编写的结果不完全一样。说服 Maxima 以不同的方式显示 +* 表达式中的项并不简单——Maxima 对如何在整个代码中假设的表达式中的项排序有很强的想法。但我认为其他人已经提出了关于显示表达式的问题,这些问题可能有答案——如果你有兴趣,你可以搜索 Whosebug。

你可以在这里使用的命令是multthru:

(%i1) e1:(b*y+3)/3;
(%o1) (b*y+3)/3
(%i2) multthru(e1);
(%o2) (b*y)/3+1

在这种情况下,以下内容也将起作用

(%i3) distrib(e1);
(%o3) (b*y)/3+1
(%i4) expand(e1);
(%o4) (b*y)/3+1