You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia SymbolicUtils规则使用疑问:三角函数恒等式化简问题

解决SymbolicUtils中三角函数减法规则不匹配的问题

问题原因

SymbolicUtils内部会将减法表达式重写为「加上负数」的形式,比如sin(a) - cos(b)实际被解析为sin(a) + (-1)*cos(b),而非字面意义上的sin(a) - cos(b)。

你之前的规则@rule(sin(~x) + cos(~y) => ":)")只能匹配sin(...) + cos(...)这种纯加法结构,无法匹配带负系数的sin(...) + (-1)*cos(...),所以r(sin(a)-cos(b))返回nothing。

而之前的dummy规则@rule(~x + ~y => ":)")能匹配减法,是因为~y可以捕获-b这个整体(即~y匹配的是-b,而非b),所以a - b被识别为a + (-b),符合~x + ~y的模式。

解决方案

1. 通用匹配:带系数的模式

修改规则,允许匹配cos(~y)前面的系数(1或-1):

using SymbolicUtils
@syms a b

# 匹配sin(x) ± cos(y)的规则
r = @rule sin(~x) + ~k*cos(~y) => begin
    if ~k == 1
        ":)"  # 对应加法情况
    elseif ~k == -1
        ":("  # 对应减法情况
    end
end

r(sin(a) + cos(b))  # 输出 ":)"
r(sin(a) - cos(b))  # 输出 ":("

2. 针对三角函数恒等式的专用规则

对于你需要的sin(a)cos(b) - cos(a)sin(b) = sin(a-b)恒等式,可以直接匹配带负系数的项:

# 同时处理加法和减法的恒等式规则
trig_rule = @rule sin(~x)*cos(~y) + ~k*cos(~x)*sin(~y) => begin
    ~k == 1 ? sin(~x + ~y) : sin(~x - ~y)
end

# 测试加法恒等式
trig_rule(sin(a)*cos(b) + cos(a)*sin(b))  # 输出 sin(a + b)

# 测试减法恒等式
trig_rule(sin(a)*cos(b) - cos(a)*sin(b))  # 输出 sin(a - b)

如果需要更严谨,也可以明确匹配负系数的情况:

sub_rule = @rule sin(~x)*cos(~y) + (-1)*cos(~x)*sin(~y) => sin(~x - ~y)
sub_rule(sin(a)*cos(b) - cos(a)*sin(b))  # 输出 sin(a - b)

内容的提问来源于stack exchange,提问作者fakl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:58:23