使用符号工具箱简化已知函数的表达式(例如三角函数)
Using symbolic toolbox to simplify expressions of known functions (e.g. trigonometric functions)
我想使用 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 只是为了安全起见。
符号工具箱可以做一些令人难以置信的简化,including those that use trigonometric functions。当您调用 simplify 时,您希望 MATLAB 执行的大部分简化都会发生,但是您发布的那个有一个小问题。
如果您尝试简化相等性,则可以显示此处的问题。
看这个简单的例子:
simplify(x==x) % Returns symbolic "TRUE"
关于这一点,我希望下面的行也 return TRUE
.
simplify(tan(x) == sin(x) / cos(x))
但是,它 returns ~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)
为真,但它仍然没有简化表达式。这可能是由于简化过程的复杂性,或者它仍然可能是一个安全问题,因为我可以在任何时候清除假设,并且等式将不再成立。
我想使用 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 只是为了安全起见。
符号工具箱可以做一些令人难以置信的简化,including those that use trigonometric functions。当您调用 simplify 时,您希望 MATLAB 执行的大部分简化都会发生,但是您发布的那个有一个小问题。
如果您尝试简化相等性,则可以显示此处的问题。 看这个简单的例子:
simplify(x==x) % Returns symbolic "TRUE"
关于这一点,我希望下面的行也 return TRUE
.
simplify(tan(x) == sin(x) / cos(x))
但是,它 returns ~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)
为真,但它仍然没有简化表达式。这可能是由于简化过程的复杂性,或者它仍然可能是一个安全问题,因为我可以在任何时候清除假设,并且等式将不再成立。