使用 syms 和 diff 在 MATLAB 中计算混合导数
Computing mixed derivatives in MATLAB using syms and diff
我正在使用 MATLAB 2012b。
我想得到一个简单函数的 d²/dxdy:
f(x,y) = (x-1)² + 2y²
文档指出我可以使用 syms
和 diff
,如下例所示:
> 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)
是最后一种情况。等于微分f
w.r.t。 x
、y
次,或 w.r.t、y
、x
次。
出于某种原因我不太明白,你没有得到警告或错误,但是 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 x
和 y
,你的第二次尝试确实是正确和最便携的方法:
diff( diff(f,x), y )
或等效
diff( diff(f,y), x )
注意
我检查了 symbolic/symbolic/@sym/diff.m
的 R2010a 代码,实际上,n
默认为 1
,并且仅当输入变量之一是 double
时才更改,并且要区分的变量设置为等于参数列表中的最后一个 syms
变量。不支持、检测和捕获多个 syms
变量调用。
我正在使用 MATLAB 2012b。 我想得到一个简单函数的 d²/dxdy:
f(x,y) = (x-1)² + 2y²
文档指出我可以使用 syms
和 diff
,如下例所示:
> 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)
是最后一种情况。等于微分f
w.r.t。 x
、y
次,或 w.r.t、y
、x
次。
出于某种原因我不太明白,你没有得到警告或错误,但是 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 x
和 y
,你的第二次尝试确实是正确和最便携的方法:
diff( diff(f,x), y )
或等效
diff( diff(f,y), x )
注意
我检查了 symbolic/symbolic/@sym/diff.m
的 R2010a 代码,实际上,n
默认为 1
,并且仅当输入变量之一是 double
时才更改,并且要区分的变量设置为等于参数列表中的最后一个 syms
变量。不支持、检测和捕获多个 syms
变量调用。