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

时间:2018-11-06 12:05:02

标签: matlab trigonometry symbolic-math

我想使用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中也有什么方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

MATLAB只是很安全。

符号工具箱可以做一些难以置信的简化,including those that use trigonometric functions。您希望MATLAB进行的大多数简化都会在您调用simple时发生,但是您发布的简化有一个小问题。

如果您尝试简化平等性,则会显示此处的问题。 看这个简单的例子:

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)接近{{ 1}}。因此,在这些值处,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)之后,MATLAB正确地指出cos(x) ~= 0是正确的,但是它仍然没有简化表达式。这可能是由于简化过程中的复杂性,还是出于安全考虑,因为我随时可以清除假设,而平等不再成立。