gpt4 book ai didi

maple - 如何知道哪个 Maple 命令自动映射到列表条目上?

转载 作者:行者123 更新时间:2023-12-03 16:40:31 24 4
gpt4 key购买 nike

在 Mathematica 中,几乎所有命令都会自动串接(或映射)一个列表。

在 Maple 中,如何确定哪个命令自 Action 用于列表或集合的条目?

例如:

y+p*x=2*sqrt(x*y);
r:=[solve(%,y)];

这给出了两个条目的列表(解决方案)
#r := [-p*x+(2*(1+sqrt(1-p)))*x, -p*x+(2*(1-sqrt(1-p)))*x]

现在我发现 collect自动映射到每个列表条目
collect(r,x);
# [(-p+2+2*sqrt(1-p))*x, (-p+2-2*sqrt(1-p))*x]

但是另一个命令没有(我只是选择了这个)
 MmaTranslator[Mma][LeafCount](r);
#37

对于上述需要显式迭代列表或集合的条目。
 map(MmaTranslator[Mma][LeafCount],r)
#[17, 19]

在 Maple 中有没有办法找到哪个命令自动遍历列表或集合的条目而不是反复试验?

枫叶 2018.1

最佳答案

我不知道文档中的任何地方确切说明哪些命令将自动映射到列表上。

但此类命令的集合并不大。绝大多数命令不会自动映射列表。大多数在列表上自动映射的内容与表达式的简化或相关操作有关。自动映射列表的命令集合至少包含以下命令:

collect, combine, expand,
evala, evalc, evalf,
factor, normal, radnormal, rationalize, simplify

这些命令的列表上的自动映射主要是为了提供比使用 map 显式包装更短的语法更方便。命令。

还有一些命令可以保留结构(除非明确
告诉,通过选项,外部列表结构是要改变的东西),因此通常为列表完成与映射到列表相同的事情:
convert, eval, evalindets, subs, subsindets

现代 Maple 有另一种更短的语法,它可以将命令映射到列表(或集合或向量等)上。它被称为“逐元素”操作,其语法包括附加 ~ (波浪号)到命令。

例如,
discont~( [ csc(x), sec(x) ], x );

[{Pi _Z1~}, {Pi _Z2~ + 1/2 Pi}]

就您的其他示例而言,请注意 LeafCount计算被视为单个表达式的第一个参数的值(度量)。但是项目列表仍然是单个表达式。因此(没有 ~ )它作为一个整体作用于列表,而不是自动映射它,这当然不足为奇。它将封闭列表视为附加的“叶子”。
MmaTranslator:-Mma:-LeafCount( L0 );

8

L0 := [ sin(x), 1/2*x*cos(x) ]:

MmaTranslator:-Mma:-LeafCount~( L0 );

[2, 5]

map( MmaTranslator:-Mma:-LeafCount, L0 );

[2, 5]

对于与您的原始示例类似的示例,应用 collect 没有区别。 (自动映射)并使用 collect~ 逐元素应用它.这里,前两个结果相同,因为附加参数 x ,恰好是一个标量。例如,
r := [p*x+(2*(x^2+p^2))*x, p*x+(2*(x^2-p^2))*x]:

collect(r, x);

3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]

collect~(r, x);

3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]

map(collect, r, x);

3 2 3 2
[2 x + (2 p + p) x, 2 x + (-2 p + p) x]

我应该提到,如果第二个参数是一个列表,例如 [x,p],上面的例子会有不同的表现。而不是标量,例如 x .
s := [a*b+(2*(a^2*b+b^2))*a, a*b+(2*(a^2*b-b^2))*a]:

collect(s, [a,b]);

3 2 3 2
[2 b a + (2 b + b) a, 2 b a + (-2 b + b) a]

map(collect, s, [a,b]);

3 2 3 2
[2 b a + (2 b + b) a, 2 b a + (-2 b + b) a]

collect~(s, [a,b]);

3 2 2 3
[2 b a + (2 b + b) a, -2 a b + (2 a + a) b]

zip(collect, s, [a,b]);

3 2 2 3
[2 b a + (2 b + b) a, -2 a b + (2 a + a) b]

在上面,元素 collect~示例行为类似于 zip当第二个参数也是一个列表时。也就是说,第一个参数中的第一项与第二个参数中的第一项一起收集,第一个参数中的第二项收集到第二个参数中的第二项。

元素运算符语法的另一个特点是它不会将命令映射到标量表达式的操作数(即不是列表、集合、向量等)。这与 map形成鲜明对比。 ,可用于将运算映射到表达式的操作数上。

这里有两个例子,其中 map将命令应用于标量表达式的操作数,同时使用元素 ~获取仅应用于标量表达式本身的命令。在第一个示例中,操作数是项总和的被加数。在第二个示例中,操作数是未计算的函数调用的参数。
T := x^2 * sin(x) + y^2 * cos(x):

F( T );

2 2
F(x sin(x) + y cos(x))

F~( T );

2 2
F(x sin(x) + y cos(x))

map( F, T );

2 2
F(x sin(x)) + F(y cos(x))

G( arctan(a, b) );

G(arctan(a, b))

G~( arctan(a, b) );

G(arctan(a, b))

map( G, arctan(a, b) );

arctan(G(a), G(b))

因此,如果您不想无意中将命令映射到标量表达式的操作数(加数、被乘数等),那么您可以使用逐元素 ~语法而不必首先测试第一个表达式是标量还是列表(等)。

同样,如果有一个额外的参数,那么它是否是列表的标量会有所不同。
F( T, a );

F(sin(x) + cos(x), a)

F~( T, a );

F(sin(x) + cos(x), a)

map( F, T, a );

F(sin(x), a) + F(cos(x), a)

F( T, [a,b] );

F(sin(x) + cos(x), [a, b])

map( F, T, [a,b] );

F(sin(x), [a, b]) + F(cos(x), [a, b])

F~( T, [a,b] );

[F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]

zip( F, T, [a,b] );

[F(sin(x) + cos(x), a), F(sin(x) + cos(x), b)]

关于maple - 如何知道哪个 Maple 命令自动映射到列表条目上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com