1

我是 Maple 的新手,我正在寻找一种简单的方法来自动化某些任务。特别是,我正在寻找一种方法来定义自动执行某些步骤的自定义“动作”。作为一个例子,我想定义一种快速计算多项式 Hessian 行列式的方法。目前我这样做的方式是打开 Maple,创建一个新工作表而不是执行以下命令:

p := (x, y) -> x^2*y + 3*x^3 + y^3

with(VectorCalculus):
h := Hessian(p(x, y), [x, y])
Determinant(h)

我想做的是直接用类似的东西计算粗麻布行列式

HessDet(p)

whereHessDet将是执行上述操作的自定义命令。如何在 Maple 中实现这样的目标?

4

1 回答 1

2

首先要做的事情:分配给您的值p是一个可以返回多项式表达式的过程,但它本身不能返回多项式。重要的是不要混淆表达式和过程。这样做是新用户出现问题的常见原因。

能够到处乱扔p(x,y)可能在视觉上令人赏心悦目,但在这里它几乎没有编程目的。过程的形式参数p碰巧被调用xy事实,以及您p使用参数调用过程的事实xy,实际上只是另一个常见的混淆来源。不要仅仅为了以这种方式调用它们而创建过程。

此外,您的调用p(x,y)使您的代码片段“知道” procedure 需要多少个参数看起来很神奇p。所以让你的候选人HessDet接受p作为一个程序已经很混乱了。

因此,让我们保持直截了当,通过编写HessDet接受多项式而不是过程。我们可以以编程方式确定 的这个表达式的名称type polynom

restart;

HessDet:=proc(p::algebraic)
  local H,vars;
  vars:=indets(p,
               And(name,Non(constant),
                   satisfies(u->type(p,polynom(anything,u)))));
  H:=VectorCalculus:-Hessian(p,[vars[]]);
  LinearAlgebra:-Determinant(H);
end proc:

现在有一些使用它的例子,

P := x^2*y + 3*x^3 + y^3;
HessDet(P);

p := (x, y) -> x^2*y + 3*x^3 + y^3;
HessDet(p(x,y));

HessDet(x^3-x^2+4*x);
HessDet(s^2*t + 3*s^3 + t^3);
HessDet(s[r]^2*t[r] + 3*s[r]^3 + t[r]^3);

您可能还想知道如何在会话之间重复使用此自定义过程,而不必每次都输入它。两种合理的方式是:

  1. 将(上面)定义的明文定义HessDet放在​​个人初始化文件中。
  2. 创建一个 (.mla) Maple Library Archive 文件,然后保存HessDet到该文件,然后在初始化文件中增加Library搜索路径。

它可能看起来像 2) 更加努力,但重复只需要保存步骤,并且您可以将许多自定义过程存储到同一个存档中。你的选择...

[编辑] OP 要求澄清上述程序的第一部分HessDet,我怀疑这意味着对indets.

如果P分配了一个表达式,那么调用indets(P,name)将返回该表达式中存在的所有名称的集合。基本上,它返回表达式的所有不确定子表达式的集合,这些子表达式name在 Maple 的技术意义上属于类型。

例如,

P := x*y + sin(a*Pi)*x;

         x y + sin(a Pi) x

indets( P,
        name );

           {Pi, a, x, y}

也许Pi这里不需要常量的名称。IE,

indets( P,
        And( name,
             Non(constant) ) );

             {a, x, y}

也许我们只想要表达式是多项式的非常数名称?IE,

indets( P,
        And( name,
             Non(constant),
             satisfies(u->type(p,polynom(anything,u))) ) );

              {x, y}

最后一个结果是使用以下测试的高级方法:

type(P, polynom(anything, x));

               true

type(P, polynom(anything, y));

               true

type(P, polynom(anything, a));

               false

这里的一个中心问题是 OP 没有提到自定义过程要处理什么样的多项式。所以我猜测了一些防御性编码,希望以后少一些惊喜。原始问题指出输入可能是“多项式”,但我们没有被告知可能存在什么样的系数。

也许系数将永远是真实的、精确的或数字的。未提供此类时,也许自定义程序应该引发错误。问题中没有提到这些细节。

于 2021-04-17T03:25:00.490 回答