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