代码之家  ›  专栏  ›  技术社区  ›  flawr

使用索引变量的导数

  •  1
  • flawr  · 技术社区  · 7 年前

    作为一个例子,我想试着找到

    f(x)=\sum\u{i=1}^n x\u i^2
    

    最大值。(预期的输出将是\frac{\partial f}{\partial x\u k}=2x\u k)我尝试了以下操作,但似乎索引变量没有按我预期的方式处理,有人能解释我做错了什么吗

    如果用实际数字替换n和k,但不是以这种形式,则相同的命令也有效:

    f(x):=1/2*和(x[i]^2,i,1,n); 打印(diff(f(x),x[k]);

    在线试用!

    如果替换 n k 使用实际数字,但不是此形式:

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Robert Dodier    7 年前

    默认情况下,Maxima无法处理关于索引变量的导数。我写了几个小软件包来处理这些问题。也许这对你有用。

    请参阅: https://pastebin.com/MmYJRqCq (sum\u kron\u delta,Kronecker 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
    

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