让我们定义函数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)
在根据低阶变量(2*x*xdot
)计算导数时,Matlab似乎忽略了产品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() ) )
是一种好的方法,还是有更好的方法,如果是的话,它是什么?
答案 0 :(得分:1)
正如您所注意到的那样,采用像symfun
这样的抽象x(t)
的衍生物与采用x
之类的符号变量的导数不同(假设为x(t)
}尚未在范围内声明) - 有关详细信息,请参阅my answer here。一个人需要非常小心地替换你正在做的事情。问题是因为x(t)
也取代'x'
(diff(x,t)
)内的xdot(t)
,即代码中的第一个替换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)
。