使用 syms 和 diff 在 MATLAB 中计算混合导数

Computing mixed derivatives in MATLAB using syms and diff

我正在使用 MATLAB 2012b。 我想得到一个简单函数的 d²/dxdy:

f(x,y) = (x-1)² + 2y²

文档指出我可以使用 symsdiff,如下例所示:

> syms x y
> diff(x*sin(x*y), x, y)
ans =
    2*x*cos(x*y) - x^2*y*sin(x*y)

但照着做我得到了错误的答案:

> syms x y
> f = (x-1)^2 + 2*y^2;
> diff(f,x,y)
ans = 
    4*y

如果我这样使用 diff,答案是正确的:

diff(diff(f,x),y)

好吧,我这样使用它不是问题,但是为什么第一个变体不起作用?是版本问题吗?

Syms 只创建符号变量。

您执行的第一个代码只是一个单导数。您提供的第二个代码区分了两次。所以我认为你忘记了在你提供的第一段代码中进行第二次区分。

我也想知道你期待什么答案?如果你想要 4*y 作为答案,那么你应该使用

diff(f,y)

而不是

diff(f,x,y)

执行二阶导数是零吗?

diff(diff(f,x),y)

如果您想要 4 作为答案,则必须执行以下操作:

diff(diff(f,y),y)

R2010a 的实际文档:

diff(expr) differentiates a symbolic expression expr with respect to its free variable as determined by symvar.

diff(expr, v) and diff(expr, sym('v')) differentiate expr with respect to v.

diff(expr, n) differentiates expr n times. n is a positive integer.

diff(expr, v, n) and diff(expr, n, v) differentiate expr with respect to v n times.

所以,命令diff(f,x,y)是最后一种情况。等于微分fw.r.t。 xy 次,或 w.r.t、yx 次。

出于某种原因我不太明白,你没有得到警告或错误,但是 syms 变量之一被解释为 n = 1,然后进行微分出去。在这种情况下,diff 似乎所做的基本上是 diff(f, y, 1).

无论如何,似乎每个版本的行为都发生了变化,因为在您 link 到 (R2016b) 的文档中,还有一个额外的案例:

diff(F,var1,...,varN) differentiates F with respect to the variables var1,...,varN

所以我怀疑你 运行 遇到了版本问题。

如果你想区分两次,w.r.t xy,你的第二次尝试确实是正确和最便携的方法:

diff( diff(f,x), y )

或等效

diff( diff(f,y), x )

注意 我检查了 symbolic/symbolic/@sym/diff.m 的 R2010a 代码,实际上,n 默认为 1,并且仅当输入变量之一是 double 时才更改,并且要区分的变量设置为等于参数列表中的最后一个 syms 变量。不支持、检测和捕获多个 syms 变量调用。