我是 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)
HessDet
执行上述操作的自定义命令在哪里。如何在 Maple 中实现这样的目标?
首先第一件事情:分配给你的价值p
是一个过程,可以返回一个多项式表达,而不是本身的多项式。重要的是不要混淆表达式和过程。这样做是新用户出现问题的常见原因。
能够四处p(x,y)
乱飞可能在视觉上让您赏心悦目,但在这里它几乎没有什么编程目的。过程的形参p
恰好被称为x
andy
的事实,以及您p
用参数x
和调用过程的事实,y
实际上只是另一个常见的混淆来源。不要仅仅为了以这种方式调用它们而创建过程。
此外,您的调用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);
您可能还想知道如何跨会话重复使用这个自定义过程,而不必每次都输入它。两种合理的方式是:
HessDet
放在个人初始化文件中。HessDet
到该文件,然后在您的初始化文件中增加库搜索路径。看起来 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
这里不需要常量的名称。即,
indets( P,
And( name,
Non(constant) ) );
{a, x, y}
也许我们只想要表达式是多项式的非常量名称?即,
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 没有提到自定义程序要处理什么样的多项式。所以我猜测了一些防御性编码,希望以后能少一些惊喜。最初的问题指出输入可能是一个“多项式”,但我们没有被告知可能存在什么样的系数。
也许系数将始终是真实的、精确的或数字的。也许当没有提供时,custon 程序应该抛出一个错误。这些细节在问题中没有提到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句