使用符号工具箱来简化已知函数(如三角函数)的表达式



我想用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是安全的

符号工具箱可以进行一些令人难以置信的简化,包括使用三角函数的简化。当你调用simple时,你希望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)为真,但仍然没有简化表达式。这可能是由于简化过程的复杂性,也可能仍然是一个安全问题,因为我可以在任何时候澄清这一假设,平等将不再存在。

最新更新