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)
这两个f和x是类的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?
在较新版本的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 提交功能请求.
| 归档时间: |
|
| 查看次数: |
2249 次 |
| 最近记录: |