首页 > 解决方案 > 使用符号工具箱简化已知函数的表达式(例如三角函数)

问题描述

我想使用 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中实现这一点呢?

标签: matlabtrigonometrysymbolic-math

解决方案


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)是真的,但它仍然没有简化表达式。这可能是由于简化过程的复杂性,或者它仍然可能是一个安全问题,因为我可以在任何时候清除假设,并且等式将不再成立。


推荐阅读