【问题标题】:Partial differential equation in Matlab (incorrect solution)Matlab中的偏微分方程(错误解)
【发布时间】:2016-06-24 11:02:55
【问题描述】:

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

看起来Matlab在计算低阶变量(x)的导数时忽略了产品2*x*xdot,但在计算高阶变量的导数时它不会忽略这个产品(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() ) ) 是一个好方法,还是有更好的方法,如果有,它是什么?

【问题讨论】:

    标签: matlab symbolic-math


    【解决方案1】:

    正如您所注意到的,对抽象 symfun 求导,如 x(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)

    【讨论】:

    • 我会研究替代问题,因为必须如此。另一方面,functionalDerivative 没有返回所需的答案,因为 x 存在二阶导数,而我需要的是 T 对 x 的偏导数,即 ∂T/∂x = 2*(xdot+x)
    • 嗯,刚刚注意到了。我正在调查它。我还通过subs 解决方案的回答进行了更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多