这是我的Matlab程序:
syms x(t) t;
f = x^2 + 5;
f
的结果:
f(t) = x(t)^2 + 5
Matlab中的f
和x
都属于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?
答案 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。