首先要做的事情:分配给您的值p是一个可以返回多项式表达式的过程,但它本身不能返回多项式。重要的是不要混淆表达式和过程。这样做是新用户出现问题的常见原因。
能够到处乱扔p(x,y)可能在视觉上令人赏心悦目,但在这里它几乎没有编程目的。过程的形式参数p碰巧被调用x的y事实,以及您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放在个人初始化文件中。
- 创建一个 (.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 没有提到自定义过程要处理什么样的多项式。所以我猜测了一些防御性编码,希望以后少一些惊喜。原始问题指出输入可能是“多项式”,但我们没有被告知可能存在什么样的系数。
也许系数将永远是真实的、精确的或数字的。未提供此类时,也许自定义程序应该引发错误。问题中没有提到这些细节。