使用索引变量的导数

Derivatives using indexed variables

例如,我想尝试找到

的偏导数
f(x) = \sum_{i=1}^n x_i^2

在千里马。 (预期的输出将是 \frac{\partial f}{\partial x_k} = 2x_k)我试过以下,但似乎索引变量没有按我预期的那样处理,谁能解释我做错了什么?

如果将 nk 替换为实际数字,则相同的命令有效,但不是这种形式:

f(x) := 1/2 * sum( x[i]^2, i, 1, n);
print(diff(f(x),x[k]));

Try it online!

默认情况下,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(...即带引号'表示diffsum是名词(形式化表达)而不是动词(被调用的函数)。这在 diff_sumsum_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

如果您觉得这很有成效,我很乐意详细介绍。