我想使用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中也有什么方法可以实现这一目标吗?
答案 0 :(得分:1)
符号工具箱可以做一些难以置信的简化,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
是正确的,但是它仍然没有简化表达式。这可能是由于简化过程中的复杂性,还是出于安全考虑,因为我随时可以清除假设,而平等不再成立。