如何在Matlab中通过'symfun'实现符号函数的导数?

Sak*_*ing 4 matlab symbolic-math

这是我的Matlab程序:

syms x(t) t;
f = x^2 + 5;
Run Code Online (Sandbox Code Playgroud)

结果如下f:

f(t) = x(t)^2 + 5
Run Code Online (Sandbox Code Playgroud)

这两个fx是类的symfun在Matlab.我想要df/dx的结果,它等于2*x(t).我在Matlab中试过这个:

diff(f, x);
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

Error using mupadmex
Error in MuPAD command: The variable is
invalid. [stdlib::diff]
Error in sym/diff (line 57)
    R = mupadmex('symobj::diff', S.s, x.s,
    int2str(n));
Run Code Online (Sandbox Code Playgroud)

如何在Matlab中获得df/dx?

hor*_*ler 6

在较新版本的Matlab(我正在使用R2014b)中,错误消息更加清晰:

使用sym/diff时出错(第26行)除第一个参数外,所有参数都不能是符号函数.

因此,sym/diff对于文档称为抽象或任意的内容symfun,即没有定义的内容,它看起来似乎无法取得衍生物.文档中未明确提及此限制,但各种输入模式都提到了它.


解决方法1:简单函数,自变量t仅出现在差异化symfun中

我没有找到任何特别优雅的解决方法.如果t仅出现在您感兴趣的变量(此处x(t))中,而不是单独出现或出现在其他抽象符号函数中,则可以区分时间t,然后取消额外的术语.例如:

syms t x(t) y(t) z
f1 = x^2+5;
f2 = x^2+z^2+5;
f3 = x^2+y^2+z^2+5+t;
dxdt = diff(x,t);
df1 = diff(f1,t)/dxdt
df2 = diff(f2,t)/dxdt
df3 = diff(f3,t)/dxdt
Run Code Online (Sandbox Code Playgroud)

2*x(t)由于上述原因,它返回前两种情况的必要条件,但不返回第三种情况.simplify在某些情况下,您可能需要申请完全划分D(x)(t)条款.


解决方法2:更强大但更复杂的方法

使用subs多次,您可以使用标准符号变量替换有问题的符号函数,进行区分并将其交换回来.例如:

syms t x(t) y(t) z
f3 = x^2+y^2+z^2+5+t;
xx = sym('x');
df3 = subs(diff(subs(f3,x,xx),xx),xx,x)
Run Code Online (Sandbox Code Playgroud)

这也返回2*x(t)上面的第三种情况.但我认为这是一种丑陋的黑客行为.

Matlab无法做到这一点有点荒谬--Mathematica没有这样的问题.似乎MuPAD本身具有这种限制.您可以考虑使用The MathWorks 提交功能请求.