Xcas积分能力测试

最近有人向我推荐了 Xcas 这个软件,它是 HP Prime 计算器使用的计算机代数系统的一个开源实现,对其进行了一些微小的测试。

测试环境

在 6.10.5-zen1-1-zen 内核下测试,Xcas 版本 1.9.0,FriCAS 版本 1.3.11 (Built with SBCL 2.4.5)

具体测试

01

先来个比较基础的:

integrate((tan(x)^3+(x+1)*tan(x)^2+tan(x)+x+2)*exp(tan(x)), x)

FriCAS 能给出正确结果:

(1) -> integrate((tan(x)^3+(x+1)*tan(x)^2+tan(x)+x+2)*exp(tan(x)), x)

                      tan(x)
   (1)  (tan(x) + x)%e
                                         Type: Union(Expression(Integer),...)

Xcas 积分能力比较弱,给出了非常复杂的答案:

x*exp(tan(x))-15*tan(x)**3*exp(tan(x))+15*tan(x)**5*exp(tan(x))-tan(x)**7*exp(tan(x))...(Omitted)

这是 Risch 算法中最简单的 pure transcendental case 中的 tangent case。

02

integrate((x^2+2*x+1)/((x+1)^6+1),x)

FriCAS 和 Xcas 都可以给出正确的计算结果:

Xcas:
  atan(3*(x**3/3+x**2+x)+1)/3

FriCAS:
(2) -> integrate((x^2+2*x+1)/((x+1)^6+1),x)

              3      2
        atan(x  + 3 x  + 3 x + 1)
   (2)  -------------------------
                    3
                                         Type: Union(Expression(Integer),...)

Axiom Book §1.12 Integration 中是这么说的:一般的分步积分法算不出来这个积分,需要使用 factorization-free 算法。

03

接下来是一个比较困难的积分

integrate(x^-3 * (a * x + b)^(-1/3), x)

FriCAS 能给出正确结果:

(3) -> integrate(x^-3 * (a * x + b)^(-1/3), x)

   (3)
            2 2 +-+    3+-+3+-------+2   3+-+2 3+-------+
       - 2 a x \|3 log(\|b \|a x + b   + \|b   \|a x + b  + b)
     + 
          2 2 +-+    3+-+2 3+-------+
       4 a x \|3 log(\|b   \|a x + b  - b)
     + 
                      +-+3+-+2 3+-------+     +-+
           2 2     2 \|3 \|b   \|a x + b  + b\|3
       12 a x atan(------------------------------)
                                 3 b
     + 
                      +-+3+-+3+-------+2
       (12 a x - 9 b)\|3 \|b \|a x + b
  /
         2 2 +-+3+-+
     18 b x \|3 \|b
                                         Type: Union(Expression(Integer),...)

Xcas 会给出一个未化简的结果:

3*((4*a**3*((a*x+b)**(1/3))**2*(a*x+b)-7*a**3*b*((a*x+b)**(1/3))**2)/(18*b**2*(a*x)**2)-a**3*1/(b**2*b**(1/3))*ln((b**(1/3))**2+((a*x+b)**(1/3))**2+b**(1/3)*(a*x+b)**(1/3))/27+2*a**3*1/(b**2*b**(1/3))*atan(2*(b**(1/3)/2+(a*x+b)**(1/3))/(sqrt(3)*b**(1/3)))/(9*sqrt(3))+2*1/27*a**3*1/(b**2*b**(1/3))*ln(abs(-b**(1/3)+(a*x+b)**(1/3))))/a

Axiom Book §1.12 Integration 中提到:使用试探法和查表法的程序会失败。AXIOM 使用一个决定性过程算法 (decision procedure,如果解存在,则给出解,否则说明解不存在),这就是 Risch algorithm,它将积分问题变换成代数问题进行求解。

以及只有 Axiom 会直接给出正确结果,Maxima 会问你 a 是正是负,回答负会得到带虚数的奇怪结果,回答正会得到似乎正确的结果。WolframAlpha 得到包含 Hypergeometric2F1 函数的结果,而 Hypergeometric2F1 函数是个极复杂的级数。

04

integrate(log(1+sqrt(a*x+b))/x,x)

这是一个不可能有初等函数表示的不定积分。

FriCAS 会直接返回原表达式:

(4) -> integrate(log(1+sqrt(a*x+b))/x,x)

           x      +--------+
         ++  log(\|b + %A a  + 1)
   (4)   |   -------------------- d%A
        ++            %A
                                         Type: Union(Expression(Integer),...)

Xcas 会进行一些计算:

integrate(2*a*1/a*sqrt(a*x+b)*ln(sqrt(a*x+b)+1)*1/(a*x+b-b)*1/2*a*(sqrt(a*x+b))**-1,x)

Mathematica 给出了带无穷级数的解:

                                1 + Sqrt[b + a x]            1 + Sqrt[b + a x]                  1 + Sqrt[b + a x]                1 + Sqrt[b + a x]
Log[1 + Sqrt[b + a x]] (Log[1 + -----------------] + Log[1 - -----------------]) + PolyLog[2, -(-----------------)] + PolyLog[2, -----------------]
                                  -1 + Sqrt[b]                  1 + Sqrt[b]                       -1 + Sqrt[b]                      1 + Sqrt[b]

Axiom Book §1.12 Integration 这么评价:如果一个积分可以被 证明不存在 初等函数表示,Axiom 会原样打印 (Axiom 能证明该积分不存在初等函数表示)

05

integrate(diff(x*sin(x**asin(x)),x),x)
(5) -> integrate(D(x*sin(x^asin x),x),x)

                     (asin(x) - 1)log(x)
                 x %e
         2 x tan(-----------------------)
                            2
   (5)  ---------------------------------
                (asin(x) - 1)log(x) 2
            x %e
        tan(-----------------------)  + 1
                       2
                                         Type: Union(Expression(Integer),...)

FriCAS 能成功计算出来 (虽然不是最简结果,但可能是最正确的,因为奇点啊之类的问题) 但没正确化简;Xcas 算到爆内存了也没算出来。

src/input/rich*.input.pamphlet 里有 167 个 Axiom "implementation incomplete"的积分。

FriCAS 似乎做了一些 implementation,但没有 merge 到 Axiom 中。此外,这些不完整的部分大多和三角函数有关,在三角函数的积分上 Axiom 可能稍差一点。

05.5

D(integrate(1/(x^3 + 2) ,x),x)

FriCAS:

(6) -> D(integrate(1/(x^3 + 2) ,x),x)

           1
   (6)  ------
         3
        x  + 2
                                                    Type: Expression(Integer)

Xcas/Sympy:

                                       1/3
          1                     2 x - 2                       1
--------------------- - --------------------------- + -----------------
           1/3 2           5/3   2    1/3      2/3       2/3       1/3
   (2 x - 2   )         3 2    (x  - 2    x + 2   )   3 2    (x + 2   )
3 (------------- + 1)
         2/3
      3 2

Axiom 能化到 1/(x^3 + 2) ,Sympy 还是和以前一样没长进…

06

继续对 Risch 算法进行测试:

integrate(x/sqrt(x^4 + 10*x^2 - 96*x - 71),x)
(7) -> integrate(x/sqrt(x^4 + 10*x^2 - 96*x - 71),x)

   (7)
     log
                                                     +----------------------+
            6       4       3       2                | 4       2
          (x  + 15 x  - 80 x  + 27 x  - 528 x + 781)\|x  + 10 x  - 96 x - 71
        + 
           8       6        5       4         3         2
          x  + 20 x  - 128 x  + 54 x  - 1408 x  + 3124 x  + 10001
  /
     8
                                         Type: Union(Expression(Integer),...)

Xcas 直接返回了原表达式,至此我认为 Xcas 可能并没有 Risch 算法的相关实现,这也导致了其计算能力偏弱。

后记:八卦一下为什么 Axiom/FriCAS 的符号积分能力这么强

(以下内容主要来源于 Manuel Bronstein 所著的 Symbolic Integration I: Transcendental Functions 一书中,B.F. Caviness 所写的序和作者写的前言)

对于有限项的积分问题,Ritt 在 20 世纪 40 年代取得理论上的突破,这些思想被他的 3 个 PhD:Risch, Singer, Bronstein(此书的作者)进一步发展。

在实现这些算法的程序方面,(80 年代)没有一个系统实现完整的 Risch 算法,最主要的原因是,Risch 发表的内容还存在一些不完整的方面。以 Manuel Bronstein 的 PhD 论文(Integration of Elementary Functions, UCB, 1987)为开端,他开始完善 Risch 算法中缺失的部分。于此同时,他在当时 Axiom 的研发地——IBM Watson 研究中心——工作,实现了几乎完整的初等函数的积分算法(这就是现在 Axiom 中 Risch 积分算法的来源),而且这是所有 Risch 算法的实现中最完善的一个。

在 Bronstein 自己写的前言中提到,Risch 提出了一系列文章,但并不是所有的都发表了,这些松散的成果一般称作 Risch 算法。作者本人对 Risch 算法的扩展也有贡献,比如对非初等函数积分的处理等。

在 Axiom 中, grep 'Manuel Bronstein' src/algebra/* ,可以发现,他是 206 个 Package/Domain/Category 的作者,在 1987-1995 年间进行活跃的开发,除了 Risch 算法之外对 Axiom 作出重要的贡献。遗憾的是他写的 Risch 算法的核心部分几乎没有注释,而且也留下了四种情况( grep 'implementation incomplete' intalg.spad.pamphlet )没有实现完全,除了他之外,这些代码几乎没有被改动过,还是 20 年前的样子,但仍然是最完善的 Risch 算法。

[Return to the main page]​

Created: 2025-03-12 Wed 13:21

This webpage is generated by GNU Emacs