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

时间:2018-09-20 08:42:03

标签: symbolic-math 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]

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

构造起来并不复杂。 (对此有更多的想法,下面...)

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

答案 2 :(得分:2)

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

您还没有真正告诉您最终的目标是什么。也许您正在尝试构建表达式树。或者,也许您正在计划通过此分析进行其他操作。如果您告诉我们最终目标,真的会有所帮助。

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

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之类的东西,而不是其惰性形式)。我只是想向您展示如何用这一切做更多的事情。