Я пытаюсь составить сумму с производными произвольного количества параметров. Например. для вектора
функция 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]