如何从表达式中提取x ^ n中的所有项

时间:2018-08-24 09:16:00

标签: maple

鉴于任意表达式,我想提取出现在表达式中任何位置的所有x^m的列表。

例如expr:=x^7+1/sqrt(x)+sin(y+x^19)+20-3*x^8/sin(x^20)+x+xz;

Mathematica graphics

然后输出应该是

{x^7,x^(-1/2),x^19,x^8,x^20,x}

否则我会很满意x的功能,因为以后可以添加x

{7,-(1/2),19,8,20,1}

主要工具是在表达式的操作数上使用patmatch,但这不适用于所有情况。

restart;
expr:=x^7+1/sqrt(x)+sin(y+x^19)+20-3*x^8/sin(x^20)+x+xz;
T:=op(expr);
for current_item in T do
    n:='n';
    if patmatch(current_item,x^(n::anything),'la') then
       print(la);
    fi;
od:

                        [n = 7]
                        [n = -1/2]
                        [n = 1]

所以错过了几个。而且由于我不知道这些x将显示在哪里,因此很难针对每种可能出现的情况编写模式匹配。

在Maple中有更简单的方法吗?

如果全部丢失,我可以做的一件事就是将其转换为字符串,然后使用字符串匹配,因为这实际上似乎更容易,但是在使用计算机代数系统时,这似乎像作弊。

expr_as_string:=convert(expr,string);

#expr_as_string := "x^7+1/(x^(1/2)+5)+sin(x^19+y)+20-3*x^8/sin(x^20)+x+xz"

res1:='res1';
StringTools:-RegMatch("(x\\^.)", expr_as_string,res1);
res1;

       "x^7"

我不擅长regexpr,因此,如果要使用上述方法,则需要学习如何使其与字符串中的所有x ^ n匹配。除了使用RegMatch之外,还有在Maple中进行字符串匹配的更好方法吗?

1 个答案:

答案 0 :(得分:4)

我建议改用indets()命令:

expr := x^7 + 1 / sqrt(x) + sin( x^19 + y ) + 20 - 3 * x^8 / sin( x^20 ) + x + x * z;
P := indets['flat']( expr, 'Or'(`^`('identical'(x),algebraic),'identical'(x)) );