使用 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
来确保为 fundef
和 lambda
评估参数。为了简洁起见,我现在将省略解释。
这是我从该定义中得到的结果。
(%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]
我想编写一个函数 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
来确保为 fundef
和 lambda
评估参数。为了简洁起见,我现在将省略解释。
这是我从该定义中得到的结果。
(%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]