从表达式中提取完整的参数和函数名称,(仅限标准数学函数)MAPLE

Extract complete argument and function name(s) from the Expression, (standard mathematical functions only) MAPLE

对于像

这样的表达式
a1 := sin(1+a/b);
a2 := log(1+ a*b);
a3 := abs(a^2+b);

如何获取各个函数的表达式。例如

someCommand(a1)  # should get an output 1+a/b
someCommand(a2)  # should get an output 1+a*b
someCommand(a3)  # should get an output a^2+b

我试图从 maple 文档中获取相关主题,但不幸的是我无法准确获取。

已编辑:还有如何获得(按顺序)使用的函数列表

a :=sin(log(abs(a+b)));# functions can be of more than two
someCommand(a) # have to return [{sin, log, abs}, a+b]

您可以使用 op() 命令,它将表达式分解为它们的操作数。例如:

f := sin(1+a/b);
g := op(0,f); # sin
h := op(1,f); # 1+a/b

构建起来并不复杂。 (更多想法,在下面...)

restart;

W := (ee,nm::name) -> [op(map(`[]`@op,indets(ee,':-specfunc'(nm))))]:

现在进行测试,

a1 := sin(1+a/b):
a2 := log(1+ a*b):
a3 := abs(a^2+b):

W( a1, sin );
                       [[    a]]
                       [[1 + -]]
                       [[    b]]

W( a2, ln );
                      [[a b + 1]]

W( a3, abs );
                       [[ 2    ]]
                       [[a  + b]]

现在稍微长一点的例子,

foo := cos(1+a/b)/abs(a^2+b)
       +log(1+ a*b)*cos(s-v)
       +sin(c+d/r);

              /    a\                                      
           cos|1 + -|                                      
              \    b/                               /    d\
    foo := ---------- + ln(a b + 1) cos(s - v) + sin|c + -|
            | 2    |                                \    r/
            |a  + b|                                       

W( foo, sin );
                       [[    d]]
                       [[c + -]]
                       [[    r]]

W( foo, cos );
                   [[    a]         ]
                   [[1 + -], [s - v]]
                   [[    b]         ]

W( foo, abs );
                       [[ 2    ]]
                       [[a  + b]]

W( foo, ln );
                      [[a b + 1]]

由于没有其他上下文可以判断,我个人更喜欢将上述项目返回到列表中,以便以后更轻松地处理它们。

但如果省略封装列表,它看起来更简单,

Y := (ee,nm::name) -> op(map(op,indets(ee,':-specfunc'(nm)))):

Y( foo, cos );

                          a       
                      1 + -, s - v
                          b       

现在提几点意见。之所以没有专门的命令来 精确 这是因为类似的任务太多了。一种塞满了数百个不同命令来执行过于相似的事情的编程语言使用起来可能会很尴尬(或更糟)。

要有效地使用 Maple,它有助于很好地学习基本构建块。这些至少包括

op, map, map[n], zip, select, remove, selectremove,
table, indices, entries, type, indets, subsindets,
normal, radnormal, simplify, evalc, evala, rationalize

在您对另一个答案的后续评论中,您给出了 sin(log(abs(a+b))) 的进一步示例。我怀疑您希望能够对更复杂的示例进行切片和切块。

你还没有真正告诉 use 你的最终目标是什么。也许您正在尝试构建一个 表达式树 。或者,也许您最终计划使用此分析做一些其他事情。如果您告诉我们最终目标,真的会有帮助。

话虽如此,以下内容可能对您有些用处。

restart;

ee := "sin(log(abs(a+b))) + sin(s+t) + abs(log(v+w))":

P:=InertForm:-Parse(ee):

lprint(P);


 `%+`(%sin(%log(%abs(`%+`(a,b)))),%sin(`%+`(s,t)),
      %abs(%log(`%+`(v,w))))

无论您的目标是什么,您都可以使用上述惰性形式。

indets(P, specfunc(name,`%+`));

            {a %+ b, s %+ t, v %+ w}

indets(P, specfunc(anything,%abs));

       {%abs(a %+ b), %abs(%log(v %+ w))}

indets(P, specfunc(specfunc(name,`%+`),%abs));

                {%abs(a %+ b)}

indets(P, specfunc(specfunc(name,`%+`),%log));

                {%log(v %+ w)}

使用我之前回答中的例行程序,

W := (ee,nm) -> [op(map(`[]`@op,indets(ee,':-specfunc'(nm))))]:

W( indets(P, specfunc(specfunc(name,`%+`),%log)), `%+` );

                   [[v, w]]

W( indets(P, specfunc(specfunc(name,`%+`),%sin)), `%+` );

                   [[s, t]]

W( indets(P, specfunc(specfunc(name,`%+`),%abs)), `%+` );

                   [[a, b]]

还有其他方法可以获得最后的结果(例如,在实际表达式上使用 W 之类的东西,而不是它的惰性形式)。我只是想告诉你如何用它做更多的事情。