【问题标题】:How to extract all terms in x^n from an expression如何从表达式中提取 x^n 中的所有项
【发布时间】:2019-01-30 17:47:47
【问题描述】:

给定任意表达式,我想提取所有出现在表达式中的x^m 的列表。

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

那么输出应该是

{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"

我不擅长正则表达式,所以如果使用上述方法,需要学习如何使它匹配字符串中的所有x^n。除了使用 RegMatch 之外,还有没有更好的方法在 Maple 中进行此字符串匹配?

【问题讨论】:

    标签: maple


    【解决方案1】:

    我建议改用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)) );
    

    【讨论】:

    • 仅供参考,发现小错误。 expr:=x^(1/2) 给出{x,x^(1/2)},它应该只是{x^(1/2)}。使用 Maple 2018.1。这是一个问题,因为现在它为x+sqrt(x) 和sqrt(x) 提供了相同的答案。我正在尝试看看我现在是否可以找到解决方案...
    • 仅供参考,我认为 [flat] 似乎已经修复了它。如 indets[flat].
    • 谢谢。毫无疑问,“flat”选项使其更加健壮。
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2017-08-22
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多