Matlab中的偏微分方程(错误解)

Partial differential equation in Matlab (incorrect solution)

让我们定义函数 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)

请注意 returns ∂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 后,我们现在得到正确答案。

评论:

问题

如何可靠地计算 T,尤其是 ∂T/∂x 的偏导数和绝对导数?

subs( diff(subs() ) ) 是一种好方法吗?或者有更好的方法吗?如果是,那是什么?

如您所见,对抽象 symfun 求导,如 x(t) 与对符号变量 x 求导不同(假设 x(t) 尚未在范围内声明)——请参阅 my answer here 了解更多信息。像您所做的那样,需要非常小心地进行替换。出现问题是因为 x(t)diff(x,t) (xdot(t)) 中也被替换为 'x',即代码中的第一个替换 subs(T,x,'x'),已经 returns 相对于您的预期结果不正确。

你可以试试这个:

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)

其中 returns 2*x(t) + 2*diff(x(t), t).