matlab - 使用符号工具箱简化已知函数的表达式(例如三角函数)
问题描述
我想使用 matlab 为我简化例如三角函数的表达式。例如我试过这个:
syms x;
simplify(sin(x)/cos(x))
我的预期输出是
tan(x)
但相反,我刚得到
sin(x)/cos(x)
再次。所以我做了一些研究,发现rewrite
哪种类型可以满足我的需求。我可以用
syms(x);
simplify(rewrite(sin(x)/cos(x),`tan`))
我会得到
tan(x)
这就是我在这种情况下想要的。问题是我并不总是知道我想要实现什么目标功能。在wolframalpha.com 上,这类事情很容易实现。你只要把你的表达放在那里,它就会给你最好的简化。有没有办法在matlab中实现这一点呢?
解决方案
MATLAB 只是为了安全。
符号工具箱可以做一些令人难以置信的简化,包括那些使用三角函数的。您希望 MATLAB 进行的大多数简化都会在您调用简化时发生,但是您发布的那个有一个小问题。
如果您尝试简化相等性,则可以显示此处的问题。看这个简单的例子:
simplify(x==x) % Returns symbolic "TRUE"
关于这一点,我希望下面的行也能返回TRUE
。
simplify(tan(x) == sin(x) / cos(x))
但相反,它返回~x in Dom::ImageSet(pi*(k + 1/2), k, Z_)
当 x 在上述集合中时{..., -pi/2, pi/2, 3pi/2, ...}
,它意味着cos(x) == 0
,并sin(x)/cos(x)
导致除以零错误,而tan(x)
接近 的值inf
。因此,在这些值下,tan(x) ~= sin(x)/cos(x)
。
实验
出于好奇,我运行了以下脚本:
clc, clear;
% Create the symbolic variable and remove all assumptions placed on it.
syms x;
assume(x,'clear');
% Define the function, and test MATLAB's behavior
y = sin(x)/cos(x);
disp('Before assuming:');
disp(simplify(y));
disp(simplify(tan(x) == y));
% Place restriction on cos(x), and re-test MATLAB's behavior
assume(cos(x) ~= 0);
disp('After assuming:');
disp(simplify(y));
disp(simplify(tan(x) == y));
输出是:
Before assuming:
sin(x)/cos(x)
~x in Dom::ImageSet(pi*(k + 1/2), k, Z_)
After assuming:
sin(x)/cos(x)
TRUE
正如预期的那样,它第一次没有简化函数,因为cos(x)
可能等于零。不过,第二个结果令人惊讶。假设 之后cos(x) ~= 0
,MATLAB 正确地表明这tan(x) == sin(x)/cos(x)
是真的,但它仍然没有简化表达式。这可能是由于简化过程的复杂性,或者它仍然可能是一个安全问题,因为我可以在任何时候清除假设,并且等式将不再成立。
推荐阅读
- javascript - 你如何在胜利原生中使用自定义标签组件?
- vim - 对 Vim 的 sed 语法着色文件的这种更改是好的还是破坏性的?
- javascript - 如何增加按钮上的点击计数器并使按钮执行其原始操作?
- javascript - express-validator 没有收到任何值
- python - 如何检测一个矩形与另一个矩形的先前位置之间的碰撞?游戏
- c - 共享内存和信号量:意外的分段错误
- swift - Swift - 如何将图像平移限制在图像范围内
- apache-spark - 与枢轴 Spark Sql 中的第一个值的差异
- awk - 在 awk 中使用 If-Statement 分配变量
- firefox - AutoHotKey 在私人窗口中打开 Firefox 的 url