【问题标题】:Matlab - product-like simplification of trigonometric functionMatlab - 三角函数的类似产品的简化
【发布时间】:2026-02-02 06:10:01
【问题描述】:

考虑以下几点:

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))

【问题讨论】:

    标签: matlab trigonometry symbolic-math


    【解决方案1】:

    我想我可能已经找到了使用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(收集变量的函数)的这种用法并没有真正记录在案。在阅读了MuPAD's collect 的示例后,我尝试了这一点,collect 可能基于这些示例或与之相关。

    【讨论】:

    • 也许可以调用 children 并单独简化,然后简化重新加入的版本会有所帮助;)
    【解决方案2】:

    在 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,默认情况下(输出变量为0)会尝试一堆各种简化尝试,并告诉你结果。但是,作为@horchler pointed out,此功能已被弃用,并且在 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 好...有帮助吗?:) 你的版本找到这个表达式了吗?
    • 我觉得没问题。我特别喜欢“很难对符号表达式提出具体的简化,尤其是在涉及三角函数的情况下。”没有办法编写一个完美的函数来猜测需要什么重排。解决 OP 请求的唯一方法是编写一堆自定义代码,这些代码可能会对输入格式做出很多假设。
    • @horchler 感谢您的反馈。我将不推荐使用的位移到最后,以便将当前可用的基于 rewrite 的尝试置于顶部。
    • 不幸的是,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 代码的第三行),那么它是一样的。
    • @Andras Deak,我担心我无法获得这种特殊的形式,但正如 horchler 所说:解释 Matlab 我们真正想要获得什么是很棘手的。