使用 Maxima 计算另一个函数的一阶偏导数的函数

Function to calculate the first partial derivative of another function using Maxima

我想编写一个函数 mydiff,它有一个参数,一个 2-arg 函数,并计算偏导数 w.r.t。到第一个参数。类似于:

mydiff(f) := lambda([x, y], diff(f(x, y), x))

但是,当 mydiff 被调用时,diff 需要是 运行,而不是当它被定义时(那时我们没有 f 的定义), 或者当 lambda 正文被执行时 (x 可能在此时被常量或复杂表达式替换).

具体如何填写下面mydiff的定义?

mydiff(f) := ...;

myf(a, b) := a^2*b;

mydiff(myf)(3, 7);

给出答案2*3*7 = 42.

这个怎么样。

mydiff (f) :=
  block ([defn, vars, body], 
         defn: apply (fundef, [f]), 
         vars: args (lhs (defn)), 
         body: rhs (defn), 
         makelist (diff (body, vv), vv, vars), 
         apply (lambda, [vars, %%]));

fundef 检索函数定义,如 f(x) := ...。获取变量列表作为定义左侧的参数(例如 f(x))和主体作为右侧(即 ... 的东西)。通过区分每个变量的主体来制作列表。最后,将结果打包为一个 lambda 表达式,该表达式采用相同的变量作为参数。请注意,%% 是表达式序列中的前一个值(即在 block(...) 中)。

您会注意到使用 apply 来确保为 fundeflambda 评估参数。为了简洁起见,我现在将省略解释。

这是我从该定义中得到的结果。

(%i44) myf(a, b) := a^2*b;
                                      2
(%o44)                  myf(a, b) := a  b
(%i45) mydiff(myf);
                                           2
(%o45)             lambda([a, b], [2 a b, a ])
(%i46) mydiff(myf)(3, 7);
(%o46)                       [42, 9]