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
相关产品推荐
相关产品推荐

