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

时间:2014-11-23 03:42:28

标签: matlab symbolic-math

这是我的Matlab程序:

syms x(t) t;
f = x^2 + 5;

f的结果:

f(t) = x(t)^2 + 5

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

diff(f, x);

并出现以下错误:

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));

如何在Matlab中获得df / dx?

1 个答案:

答案 0 :(得分: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
由于上述原因,

返回前两种情况的必要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)

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

Matlab无法做到这一点有点荒谬--Mathematica没有这样的问题。似乎MuPAD本身具有这种限制。您可以考虑使用The MathWorks filing a feature request