Matlab中的偏微分方程(不正确解)

时间:2016-06-24 11:02:55

标签: matlab symbolic-math

让我们定义函数x(t),它的时间导数xdot(t)和依赖于它们的表达式T

syms t x(t)
xdot(t) = diff(x,t);
T = (xdot + x)^2;

我们都同意Tx的偏导数为∂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() ) )是一种好的方法,还是有更好的方法,如果是的话,它是什么?

1 个答案:

答案 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)