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
后,我们现在得到正确答案。
评论:
- 我使用双重替换来使用
diff
函数,
因为 diff(T,x)
returns 出错了。我发现了这种方法
here。
- 在计算导数之前展开表达式
T
不起作用 –
我们仍然得到错误的答案。
- 我也试过
functionalDerivative
函数,但是returns不正确
也回答一下。
问题
如何可靠地计算 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)
.
让我们定义函数 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
后,我们现在得到正确答案。
评论:
- 我使用双重替换来使用
diff
函数, 因为diff(T,x)
returns 出错了。我发现了这种方法 here。 - 在计算导数之前展开表达式
T
不起作用 – 我们仍然得到错误的答案。 - 我也试过
functionalDerivative
函数,但是returns不正确 也回答一下。
问题
如何可靠地计算 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)
.