我试图用任意数量的参数的导数求和。例如。对于一个向量 函数
F(x,y)=[exp(x^3 y) - 1, y^2 - 5xy]
我想计算诸如一阶导数乘以某物的表达式。
我试过了
n := 2;
xvars := seq(x[i], i = 1 .. n);
yvars := seq(y[i], i = 1 .. n);
F := (x, y) -> [exp(x^3 *y) - 1, y^2 - 5*y*x];
seq(sum(diff(F(xvars)[i], xvars[j])*yvars[j], j = 1 .. n), i = 1 .. n);
得到0,0。它找到正确的
diff(F(xvars)[1], xvars[1])
。看起来 Maple 是根据 xvars[j]
来区分的,而不是 xvars[1]
和 xvars[2]
。在 diff
上更改 D
给出了另一个但也是错误的答案。
一般如何做?
我想了解如何处理许多变量和嵌套总和。
您应该使用
add
,而不是 sum
,来添加有限项集合。
sum
命令获取Maple的过程调用的通常规则,并且参数被“预先”评估,即。在 sum
实际收到它们之前。 diff
调用仅查看带有非数字 i
和零结果的项。
相比之下,
add
命令(如seq
)具有所谓的特殊评估规则,这会阻止评估,直到其索引i
达到其数值。
restart;
n := 2:
xvars := seq(x[i], i = 1 .. n):
yvars := seq(y[i], i = 1 .. n):
F := (x, y) -> [exp(x^3 *y) - 1, y^2 - 5*y*x]:
seq(add(diff(F(xvars)[i], xvars[j])*yvars[j],
j = 1 .. n), i = 1 .. n):lprint(%);
3*x[1]^2*x[2]*exp(x[1]^3*x[2])*y[1]
+x[1]^3*exp(x[1]^3*x[2])*y[2],
-5*x[2]*y[1]+(-5*x[1]+2*x[2])*y[2]
通过使用单个右勾(在 Maple 中又称为“不值引号”)来延迟评估是可能的,但深度嵌套可能会变得非常复杂。
restart;
n := 2:
xvars := seq(x[i], i = 1 .. n):
yvars := seq(y[i], i = 1 .. n):
F := (x, y) -> [exp(x^3 *y) - 1, y^2 - 5*y*x]:
eval(seq(sum(''diff''(F(xvars)[i], xvars[j])*yvars[j],
j = 1 .. n), i = 1 .. 2)):lprint(%);
3*x[1]^2*x[2]*exp(x[1]^3*x[2])*y[1]
+x[1]^3*exp(x[1]^3*x[2])*y[2],
-5*x[2]*y[1]+(-5*x[1]+2*x[2])*y[2]