Matlab - 三角函数的类乘简化

3
请参考以下内容:

请考虑以下事项:

syms T fi t real
fun = symfun(sin(T+fi)+cos(T+fi),[T fi]);
fun = expand(fun);

这将产生:

cos(T)*cos(fi) - sin(T)*sin(fi) + cos(T)*sin(fi) + sin(T)*cos(fi)

现在我使用 simplifycombine,结果如下:
2^(1/2)*sin(pi/4 + T + fi)

请问有哪个函数可以让我获取产品表单,例如:

cos(fi)*(cos(T)+sin(T)) + sin(fi)*(cos(T)-sin(T))
2个回答

2

我认为我可能已经找到了一种使用collect的方法 - 它适用于R2016a:

syms T fi t real
fun = symfun(sin(T+fi)+cos(T+fi),[T fi]);
fun = expand(fun);

fun2 = collect(fun,[cos(fi) sin(fi)])

这段代码返回值为(cos(T) + sin(T))*cos(fi) + (cos(T) - sin(T))*sin(fi)。此处使用collect(收集变量函数)并未得到详细记录,我在阅读了可能与collect相关或基于其的MuPAD的collect示例后尝试使用它。

也许在该对象上调用 children 方法,然后分别简化,最后再合并简化后的版本会有所帮助;) - Andras Deak -- Слава Україні

0
在R2012b中,simplify会给我返回结果。
cos(T + fi) + sin(T + fi)

你可能已经有了更新版本。但是:如果涉及三角函数,很难提出一个具体的符号表达式简化。

如果你特别想要一个用正弦表示的表达式,可以尝试使用rewrite

>> rewrite(fun,'sin')

ans(T, fi) =

sin(T + fi) - 2*sin(T/2 + fi/2)^2 + 1

上面的输出是来自R2012b,你的新版本很可能会做得更好。


我最初建议你尝试simple。默认情况下(没有输出变量),它会尝试各种简化尝试,并告诉您结果。然而,正如@horchler所指出的那样,此函数已于2015a之后停用并不再可用。不管怎样,以下是来自R2012b中这个现在不存在的函数的输出,这可能会为您提供有关更低级别的函数的提示:

>> syms T fi t real
>> fun = symfun(sin(T+fi)+cos(T+fi),[T fi]);
>> simple(fun)

simplify:

cos(T + fi) + sin(T + fi)


radsimp:

cos(T + fi) + sin(T + fi)


simplify(100):

cos(T + fi) + sin(T + fi)


combine(sincos):

cos(T + fi) + sin(T + fi)


combine(sinhcosh):

cos(T + fi) + sin(T + fi)


combine(ln):

cos(T + fi) + sin(T + fi)


factor:

cos(T + fi) + sin(T + fi)


expand:

cos(T)*cos(fi) - sin(T)*sin(fi) + cos(T)*sin(fi) + sin(T)*cos(fi)


combine:

cos(T + fi) + sin(T + fi)


rewrite(exp):

exp(- T*i - fi*i)*(1/2 + i/2) + exp(T*i + fi*i)*(1/2 - i/2)


rewrite(sincos):

cos(T + fi) + sin(T + fi)


rewrite(sinhcosh):

cosh(T*i + fi*i) - sinh(T*i + fi*i)*i


rewrite(tan):

(2*tan(T/2 + fi/2))/(tan(T/2 + fi/2)^2 + 1) - (tan(T/2 + fi/2)^2 - 1)/(tan(T/2 + fi/2)^2 + 1)


mwcos2sin:

sin(T + fi) - 2*sin(T/2 + fi/2)^2 + 1


collect(T):

cos(T + fi) + sin(T + fi)


ans(T, fi) =

cos(T + fi) + sin(T + fi)

最后一行是从先前列表中找到的最短表示,那将是您的单个返回值。您可以从列表中选择。您的版本可能会产生更多样化的输出。


@Maverick 嗯...有帮助吗?:) 你的版本能找到这个表达式吗? - Andras Deak -- Слава Україні
1
我认为这很好。我特别喜欢“如果涉及三角函数,很难想出一个具体的符号表达式简化。”没有办法编写完美的函数来猜测所需的重新排列方式。解决OP的请求的唯一方法是编写大量自定义代码,这可能会假设输入格式的很多内容。 - horchler
1
@horchler谢谢您的反馈。我将已过时的部分移到了末尾,以便将当前可用的基于rewrite的尝试放在前面。 - Andras Deak -- Слава Україні
1
不幸的是,在R2016a中,rewrite(fun,'sin')的输出不太好看:(2*sin(T/2)^2 - 1)*(2*sin(fi/2)^2 - 1) - sin(T)*(2*sin(fi/2)^2 - 1) - sin(fi)*(2*sin(T/2)^2 - 1) - sin(T)*sin(fi)。如果你不先调用expand(OP代码的第三行),那么结果是一样的。 - horchler
1
@Andras Deak,恐怕我无法获得这个特定的表格,但正如horchler所说:向Matlab解释我们真正想要获取的内容是很棘手的。 - Maverick
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接