让我们定义函数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忽略了产品2*x*xdot
,在计算导时低阶变量的条款(x
),但在计算高阶变量(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() ))
一个很好的方法,还是有更好的方法,如果是的话,它是什么?
我会研究替代问题,因为这一定是这种情况。另一方面,'functionalDerivative'不会返回所需的答案,因为有x的二阶导数,我需要的是T对x的偏导数,这正好是'∂T/∂x= 2 *(xdot + x)' 。 – Maverick
嗯,只是注意到了。我正在研究它。我还用“subs”解决方案进行了更新。 – horchler