【发布时间】:2016-06-24 11:02:55
【问题描述】:
让我们定义函数x(t),它的时间导数xdot(t),以及依赖于它们的表达式T:
syms t x(t)
xdot(t) = diff(x,t);
T = (xdot + x)^2;
我们都同意T 对x 的偏导数是∂T/∂x = 2*(xdot+x)。但是,如果我在 Matlab 中这样做,我会得到错误的答案:
dT_dx = subs( diff( subs(T,x,'x'), 'x' ), 'x', x);
>> dT_dx = 2 x(t)
请注意,它会返回∂T/∂xdot 的正确答案:
dT_dxdot = subs( diff( subs(T,xdot,'x1'), 'x1' ), 'x1', xdot);
>> dT_dxdot = 2*x(t) + 2*diff(x(t), t)
看起来Matlab在计算低阶变量(x)的导数时忽略了产品2*x*xdot,但在计算高阶变量的导数时它不会忽略这个产品(xdot )。如果我们将表达式T 重新定义为T = (100 + x)^2,我们将得到∂T/∂x:
>> ans = 2 x(t) + 200
因此,在将xdot 替换为常数后,我们现在得到了正确答案。
评论:
- 为了使用
diff函数,我使用了双重替换, 因为diff(T,x)返回错误。我发现了这种方法 here。 - 在计算导数之前扩展表达式
T不起作用 – 我们仍然得到错误的答案。 - 我也试过
functionalDerivative函数,但是返回不正确 也回答。
问题
如何可靠地计算T,尤其是∂T/∂x 的偏导数和绝对导数?
subs( diff(subs() ) ) 是一个好方法,还是有更好的方法,如果有,它是什么?
【问题讨论】:
标签: matlab symbolic-math