如何从表达式中提取 x^n 中的所有项
How to extract all terms in x^n from an expression
给定任意表达式,我想提取出现在表达式中任何位置的所有 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}
主要工具是对表达式的操作数使用 is 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 中进行此字符串匹配?
我建议改用 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)) );
给定任意表达式,我想提取出现在表达式中任何位置的所有 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}
主要工具是对表达式的操作数使用 is 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 中进行此字符串匹配?
我建议改用 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)) );