使用索引变量的导数
Derivatives using indexed variables
例如,我想尝试找到
的偏导数
f(x) = \sum_{i=1}^n x_i^2
在千里马。 (预期的输出将是 \frac{\partial f}{\partial x_k} = 2x_k
)我试过以下,但似乎索引变量没有按我预期的那样处理,谁能解释我做错了什么?
如果将 n
和 k
替换为实际数字,则相同的命令有效,但不是这种形式:
f(x) := 1/2 * sum( x[i]^2, i, 1, n);
print(diff(f(x),x[k]));
默认情况下,Maxima 无法处理关于索引变量的导数。我写了几个小包来处理这些问题。也许这对你有用。
参见:https://pastebin.com/MmYJRqCq(sum_kron_delta,克罗内克三角洲求和)
和:https://pastebin.com/UGCPgvAn(diff_sum,对索引变量求和的导数)
这是一个适用于您的问题的示例。我假设您已经将上面的代码下载到您的计算机上。
(%i1) load ("sum_kron_delta.mac");
(%o1) sum_kron_delta.mac
(%i2) load ("diff_sum.mac");
(%o2) diff_sum.mac
(%i3) 'diff ('sum (x[i]^2, i, 1, n), x[j]);
n
====
\
(%o3) 2 > x kron_delta(i, j)
/ i
====
i = 1
注意要写成'diff('sum(...
即带引号'
表示diff
和sum
是名词(形式化表达)而不是动词(被调用的函数)。这在 diff_sum
和 sum_kron_delta
的实现中是必要的,因为它们使用简化规则。 (说来话长,有兴趣的我再解释一下。)
我看到我们得到了 kron_delta 总和,但我们需要应用简化规则。我们也可以在这里写 expand(%, 0, 0)
而不是 ''%
.
(%i4) ''%;
(%o4) 2 (if (1 <= j) and (j <= n) and %elementp(j, integers) then x else 0)
j
至此我们有了最终结果,我们可以使用其他数据进一步简化。
(%i5) assume (j >= 1, j <= n);
(%o5) [j >= 1, n >= j]
(%i6) ''%o4;
(%o6) 2 (if %elementp(j, integers) then x else 0)
j
(%i7) declare (j, integer);
(%o7) done
(%i8) ''%o6;
(%o8) 2 x
j
如果您觉得这很有成效,我很乐意详细介绍。
例如,我想尝试找到
的偏导数f(x) = \sum_{i=1}^n x_i^2
在千里马。 (预期的输出将是 \frac{\partial f}{\partial x_k} = 2x_k
)我试过以下,但似乎索引变量没有按我预期的那样处理,谁能解释我做错了什么?
如果将 n
和 k
替换为实际数字,则相同的命令有效,但不是这种形式:
f(x) := 1/2 * sum( x[i]^2, i, 1, n);
print(diff(f(x),x[k]));
默认情况下,Maxima 无法处理关于索引变量的导数。我写了几个小包来处理这些问题。也许这对你有用。
参见:https://pastebin.com/MmYJRqCq(sum_kron_delta,克罗内克三角洲求和) 和:https://pastebin.com/UGCPgvAn(diff_sum,对索引变量求和的导数)
这是一个适用于您的问题的示例。我假设您已经将上面的代码下载到您的计算机上。
(%i1) load ("sum_kron_delta.mac");
(%o1) sum_kron_delta.mac
(%i2) load ("diff_sum.mac");
(%o2) diff_sum.mac
(%i3) 'diff ('sum (x[i]^2, i, 1, n), x[j]);
n
====
\
(%o3) 2 > x kron_delta(i, j)
/ i
====
i = 1
注意要写成'diff('sum(...
即带引号'
表示diff
和sum
是名词(形式化表达)而不是动词(被调用的函数)。这在 diff_sum
和 sum_kron_delta
的实现中是必要的,因为它们使用简化规则。 (说来话长,有兴趣的我再解释一下。)
我看到我们得到了 kron_delta 总和,但我们需要应用简化规则。我们也可以在这里写 expand(%, 0, 0)
而不是 ''%
.
(%i4) ''%;
(%o4) 2 (if (1 <= j) and (j <= n) and %elementp(j, integers) then x else 0)
j
至此我们有了最终结果,我们可以使用其他数据进一步简化。
(%i5) assume (j >= 1, j <= n);
(%o5) [j >= 1, n >= j]
(%i6) ''%o4;
(%o6) 2 (if %elementp(j, integers) then x else 0)
j
(%i7) declare (j, integer);
(%o7) done
(%i8) ''%o6;
(%o8) 2 x
j
如果您觉得这很有成效,我很乐意详细介绍。