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

Maxima的trigrat函数是否存在Bug?实值表达式被转非等价非实式

Maxima的trigrat函数是否存在Bug?

有时trigrat会将实值表达式转换为非等价的非实表达式,测试示例如下:

Maxima 5.45.1 https://maxima.sourceforge.io
using Lisp GNU Common Lisp (GCL) GCL 2.6.12
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) sin(3*%pi/47) / sin(11*%pi/47);
                                      3 %pi
                                  sin(-----)
                                       47
(%o1)                             -----------
                                      11 %pi
                                  sin(------)
                                        47
(%i2) trigrat(%);
                    36 %pi           33 %pi           26 %pi           25 %pi
(%o2) - (%i (47 sin(------) - 47 sin(------) + 64 sin(------) + 30 sin(------)
                      47               47               47               47
          24 %pi           23 %pi           22 %pi           14 %pi
 + 34 sin(------) + 30 sin(------) - 30 sin(------) + 47 sin(------)
            47               47               47               47
          11 %pi            36 %pi           33 %pi           26 %pi
 - 47 sin(------)) + 47 cos(------) - 47 cos(------) + 64 cos(------)
            47                47               47               47
          25 %pi           24 %pi           23 %pi           22 %pi
 + 30 cos(------) + 34 cos(------) + 30 cos(------) - 30 cos(------)
            47               47               47               47
          14 %pi           11 %pi
 + 47 cos(------) - 47 cos(------))/47
            47               47
(%i3) float(expand( [ %o1, %o2 ] ));
(%o3)   [0.2969447218372046, 0.6540613196839474 - 2.703675666682938 %i]

我在计算一个由正弦比值求和定义的函数时发现了这个问题,该函数本应为实值,但trigrat有时会生成非实表达式。

这个问题出现得比较罕见,我只发现过两三次数值变化。我花了不少时间从包含二十余项的求和中定位到触发错误的示例项,才得到上面的小型测试用例。

当调用trigrat( sin(%pi * a/p) / sin(%pi * b/p) )时,传入以下p, b, a值也会出现类似错误(trigrat处理前后数值计算结果不一致):

p = 37, b = 9, 1 <= a <= 36
p = 37, b = 28, 1 <= a <= 36
p = 37, b = 16, a = 36
p = 37, b = 21, a = 36

p = 47, b = 11, 1 <= a <= 46
p = 47, b = 36, 1 <= a <= 46

p = 53, b = 13, a = 8
p = 53, b = 40, a = 8
p = 53, b = 15, a = 41
p = 53, b = 38, a = 41

p = 61, b = 23, a = 33
p = 61, b = 38, a = 33

p = 71, b = 24, a = 70
p = 71, b = 47, a = 70

p = 73, b = 25, 1 <= a <= 72
p = 73, b = 48, 1 <= a <= 72

p = 97, b = 6, a = 1
p = 97, b = 91, a = 1

以下类似化简操作未出现错误:

(%i4) sin(3*%pi/47) / sin(13*%pi/47);
                                      3 %pi
                                  sin(-----)
                                       47
(%o4)                             -----------
                                      13 %pi
                                  sin(------)
                                        47
(%i5) trigrat(%);
                 42 %pi         31 %pi        26 %pi        21 %pi
(%o5) %i ((- sin(------)) + sin(------) - sin(------) + sin(------)
                   47             47            47            47
       16 %pi        5 %pi         42 %pi        31 %pi        26 %pi
 - sin(------) + sin(-----)) - cos(------) + cos(------) - cos(------)
         47           47             47            47            47
       21 %pi        16 %pi        5 %pi
 + cos(------) - cos(------) + cos(-----) - 1
         47            47           47
(%i6) float(expand( [ %o4, %o5 ] ));
(%o6)  [0.26083338200873, 0.2608333820087302 - 2.220446049250313E-16 %i]

测试环境为Ubuntu 22.04上的Maxima 5.45.1。根据反馈,更早及更晚版本的输出与该版本不同且结果正确,因此该问题可能特定于这个版本,难以复现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 21:13:09