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

时间:2016-11-18 09:22:46

标签: matlab symbolic-math derivative

我正在使用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)

嗯,以这种方式使用它不是问题,但是为什么第一个变体不起作用?这是版本问题吗?

2 个答案:

答案 0 :(得分:1)

R2010a的实际文件:

  

diff(expr)将符号表达式expr与symvar确定的自由变量区分开来。

     

diff(expr,v)和diff(expr,sym(' v'))将expr与v区分开来。

     

diff(expr,n)区分expr n次。 n是正整数。

     

diff(expr,v,n)和diff(expr,n,v)相对于v n次区分expr。

因此,命令diff(f,x,y)是最后一种情况。它等于区分f w.r.t. xy次,或者yx次。syms次。

出于某种原因,我不太明白,你没有收到警告或错误,但其中一个n = 1变量被解释为diff,然后分化完成了。在这种情况下,diff(f, y, 1)似乎基本上是x

在任何情况下,似乎行为从版本更改为版本,因为在链接到(R2016b)的文档中,还有一个案例:

  

diff(F,var1,...,varN)根据变量var1,...,varN

区分F

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

如果你想要区分两次,无论是w.r.t y还是diff( diff(f,x), y ) ,你的第二次尝试确实是正确且最便携的方式:

diff( diff(f,y), x )

或等效

symbolic/symbolic/@sym/diff.m

<强> NB 我检查了n的R2010a代码,实际上,1默认为double,只有在其中一个输入变量是syms时才会更改,并且变量要区分被设置为等于参数列表中的最后一个syms变量。不支持多个grep变量调用,也不检测和错误捕获。

答案 1 :(得分:0)

Syms只创建符号变量。

您执行的第一个代码只是一个派生词。您提供的第二个代码区分两次。所以我想你忘了在你提供的第一段代码中再次区分。

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

diff(f,y)

而不是

diff(f,x,y)

执行二阶导数给我零?

diff(diff(f,x),y)

如果您想要4作为答案而不是以下操作:

diff(diff(f,y),y)