我正在使用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)
嗯,以这种方式使用它不是问题,但是为什么第一个变体不起作用?这是版本问题吗?
答案 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. x
,y
次,或者y
,x
次。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)