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

