2016-06-24 156 views
1

让我们定义函数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)的导数时,它不会忽略此产品。如果我们重新定义了表达TT = (100 + x)^2,我们会得到∂T/∂x

>> ans = 2 x(t) + 200 

因此,在已经换xdot以恒定的,我们现在得到正确的答案。

评论:

  • 我在为了使用diff功能,因为 diff(T,x)返回错误利用双取代。我发现这种方法 here
  • 在计算导数之前扩大表达式T不起作用 - 我们仍然得到不正确的答案。
  • 我也尝试了functionalDerivative函数,但它也返回了不正确的 答案。

问题

如何才能可靠地计算的T局部的和绝对的衍生物,尤其是∂T/∂x

subs(diff(subs() ))一个很好的方法,还是有更好的方法,如果是的话,它是什么?

回答

1

正如你已经注意到了,走一个抽象symfunx(t)的导数是不一样的服用衍生物的符号变量像x(假设x(t)尚未在范围内已申报) - 见my answer here为更多。一个人需要非常小心地代替,就像你在做什么一样。由于x(t)取代diff(x,t)xdot(t))中的'x'也被取代,即您的代码中的第一个替换subs(T,x,'x')已经返回相对于您所期望的结果的错误结果。

你可以试试这个:

syms x(t) 
xdot(t) = diff(x,t); 
T = (xdot + x)^2; 
x1 = {x,xdot}; 
x2 = {'x','xdot'}; 
dT_dx = subs(diff(subs(T,x1,x2),'x'),x2,x1) 

返回2*x(t) + 2*diff(x(t), t)

+0

我会研究替代问题,因为这一定是这种情况。另一方面,'functionalDerivative'不会返回所需的答案,因为有x的二阶导数,我需要的是T对x的偏导数,这正好是'∂T/∂x= 2 *(xdot + x)' 。 – Maverick

+0

嗯,只是注意到了。我正在研究它。我还用“subs”解决方案进行了更新。 – horchler