首页 > 解决方案 > 如何从复杂的 Expression Maple/Matlab 构造只有两个变量和一个算术运算的子表达式?

问题描述

让符号表达式如下。

y = s + (a/b)*log((a+c)/(b*a)); %# it can be any type of expression

如何获得所有可能的子表达式,其中包含两个变量和一个运算符。

subExpression1 = b*a;
subExpression2 = a/b;

我在基于运算符提取子表达式时遇到了困难。如果我读了一个运算符,我必须研究它的 LHS 和 RHS 并验证它只对一个变量而不是另一个子表达式进行操作。

有没有办法同时研究操作员的 LHS 和 RHS?

任何意见和建议都会非常有帮助

标签: matlabsymbolic-mathmaple

解决方案


首先,您的表达式中没有子a*b表达式。在未解析输入的调用中log,出现一个 subterm c/b*a。但是在 Maple 的语法中,它被解析为数学上等同于(c*a)/band not的东西c/(b*a)

但是您的问题包含其他歧义。让我们考虑几个例子:

restart;

expr1 := y = s + (a/b)*log(a+c/b*a);

                                  c a
                         a ln(a + ---)
                                   b
        expr1 := y = s + -------------
                               b

expr2 := y = s + a*log(a+c/b*a)/b;

                                  c a
                         a ln(a + ---)
                                   b
        expr2 := y = s + -------------
                               b

expr2 - expr1;

                    0 = 0

所以expr1expr2在数学上是等价的。Maple 甚至在内部保持着相同的结构。(您可以同时使用lprintdismantle命令来检查。)

因此,在解析 input 之后,您似乎要求在其中任何一个a/b中被识别,即使该术语在逐字输入中(在解析之前)没有相同地出现。这本身并没有错,但我们需要知道这是您期望的一部分。如果要被识别为该值的候选子压缩,无论是否输入 like或,那么这是一个关键细节。如果这不是您的愿望,那么您真的必须证明在解析后如何区分它们(因为它们可能解析为相同的东西,这取决于 Maple 会话中已经发生的事情!)。a/bexpr1expr2

另外,你打算如何处理数学上等价的东西(a*s)/(b)?您是否想要返回所有可能的算术配对的代码,例如。a*s, a/b, s/b? 或者你想要只是a*s,或者只是a/b,或者只是s/b

现在考虑另一个例子:

expr3 := a+c*a/b;

                            c a
               expr3 := a + ---
                             b

normal(expr3);

                   a (b + c)
                   ---------
                       b

这些在数学上是等效的,尽管存储方式不同。根据您对可接受的“子表达式”的定义,您可能希望也可能不希望希望a/b,或c/b,或b+c,在您的结果中。

我认为您可能需要解决您想要的问题,至少在上面这三个示例的模棱两可的情况下,您的问题才能得到明智的解决。


推荐阅读