代码之家  ›  专栏  ›  技术社区  ›  Mateus Nogueira

wxMaxima中的“堆累了,游戏结束”消息-ccl对我有效吗?

  •  1
  • Mateus Nogueira  · 技术社区  · 5 年前

    大家,

    我试图做一些计算并绘制结果,但似乎这些对Maxima来说太重了。当我尝试计算N1和N2时,当参数j过高或试图绘制它们时,程序会崩溃,程序会显示以下错误消息:“堆已耗尽,游戏结束。”我该怎么办?我见过一些人说要尝试用ccl编译Maxima,但我不知道该怎么做,也不知道它是否有效。

    我通常会收到以下错误消息:

    Message from maxima's stderr stream: Heap exhausted during garbage collection: 0 bytes available, 16     requested. 
    Gen  Boxed Unboxed   LgBox LgUnbox  Pin       Alloc     Waste        Trig      WP GCs Mem-age 
     0       0       0       0       0    0           0         0    20971520       0   0  0,0000 
     1       0       0       0       0    0           0         0    20971520       0   0  0,0000 
     2       0       0       0       0    0           0         0    20971520       0   0  0,0000 
     3   16417       2       0       0   43  1075328496    707088   293986768   16419   1  0,8032 
     4   13432      21       0    1141   70   955593760    838624     2000000   14594   0  0,2673 
     5       0       0       0       0    0           0         0     2000000       0   0  0,0000 
     6     741     184      34      28    0    63259792   1424240     2000000     987   0  0,0000 
     7       0       0       0       0    0           0         0     2000000       0   0  0,0000 
               Total bytes allocated    =    2094182048 
               Dynamic-space-size bytes =    2097152000 
    GC control variables: 
       *GC-INHIBIT* = true 
       *GC-PENDING* = true 
       *STOP-FOR-GC-PENDING* = false 
    fatal error encountered in SBCL pid 13884(tid 0000000001236360): 
    Heap exhausted, game over. 
    

    代码如下:

    enter code here
    
    a: 80$;
    b: 6*a$;
    h1: 80$;
    t: 2$;
    j: 5$;
    carga: 250$;
    sig: -carga/2$;
    
    n: 2*q*%pi/b$;
    m: i*%pi/a$;
    i: 2*p-1$;
    i1: 2*p1-1$;
    /*i1: p1$;*/
    
    Φ: a/b$;
    τ: cosh(x) - (x/sinh(x))$;
    σ: sinh(x) - (x/cosh(x))$;
    Ψ: sinh(x)/τ$;
    Χ: cosh(x)/σ$;
    
    Λ0: 1/(((i/2)^2+Φ^2*q^2)^2)$;
    Λ1: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ0, p, 1, j)$;
    Λ2: sum(((q1^3*subst([x=(q1*%pi*Φ)],Χ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ1, q1, 1, j)$;
    Λ3: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ2, p, 1, j)$;
    Λ4: sum(((q1^3*subst([x=(q1*%pi*Φ)],Χ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ3, q1, 1, j)$;
    Λ5: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ4, p, 1, j)$;
    
    Ζ0: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ0, q, 1, j)$;
    Ζ2: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ2, q, 1, j)$;
    Ζ4: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ4, q, 1, j)$;
    
    E: 200000$;
    ν: 0.3$;
    λ: (ν*E)/((1+ν)*(1-2*ν))$;
    μ: E/(2*(1+ν))$;
    
    a0: float(1/(b/2)*integrate(0, y, -(b/2), -h1/2)+1/b*integrate(sig, y, -h1/2,     h1/2)+1/(b/2)*integrate(0, y, h1/2, (b/2)))$;
    aq: float(1/(b/2)*integrate(0*cos(q*y*%pi/(b/2)), y, -(b/2), - h1/2)+1/(b/2)*integrate(sig*cos(q*y*%pi/(b/2)), y, -h1/2, h1/2)+1/(b/2)*integrate(0*cos(q*y*%pi/(b/2)),   y, h1/2, (b/2)))$;
    aq1: float(1/(b/2)*integrate(0*cos(q1*y*%pi/(b/2)), y, -(b/2), - h1/2)+1/(b/2)*integrate(sig*cos(q1*y*%pi/(b/2)), y, -h1/2,   h1/2)+1/(b/2)*integrate(0*cos(q1*y*%pi/(b/2)), y, h1/2, (b/2)))$;
    
    Bq:  aq/((λ+μ)*subst([x=q*%pi*Φ],σ))+((16*Φ^4*q^2*(-1)^q)/((λ+μ)*%pi^2*subst([x=q*%pi*Φ],σ)))*sum(q1*aq1*(-1) ^q1*subst([x=q1*%pi*Φ],Χ)*(Λ1+(16*Φ^4/(%pi^2))*Λ3+((16*Φ^4/(%pi^2))^2)*Λ5), q1, 1,  j)+(8*λ*Φ^3*q^2*(-1)^q*a0)/((λ+μ)*(λ+2*μ)*(%pi^3)*subst([x=q*%pi*Φ],σ))*sum(subst([x=i*%pi/(2*Φ)],Ψ)/(i/ 2)*(Λ0+(16*Φ^4/(%pi^2))*Λ2+((16*Φ^4/(%pi^2))^2)*Λ4), p, 1, j)$;
    
    βp: -(2*λ*a0*(-1)^((i-1)/2))/((λ+μ)*(λ+2*μ)*(i/2)^2*%pi^2*subst([x=i*%pi/(2*Φ)],τ))-((32*λ*Φ^4*(i/2)^2*a0*(-1)^((i-1)/2))/((λ+μ)*(λ+2*μ)*%pi^2*subst([x=i*%pi/(2*Φ)],τ)))*sum(((subst([x=i1*%pi/(2*Φ)],Ψ))/(i1/2))*(Ζ0+Ζ2*((16*Φ^4)/%pi^2)+Ζ4*(((16*Φ^4)/%pi^2)^2)),p1,1,j)-((4*Φ*(i/2)^2*(-1)^((i-1)/2))/((λ+μ)*%pi*subst([x=i*%pi/(2*Φ)],τ)))*sum(q*aq*(-1)^q*subst([x=q*%pi*Φ],Χ)*(Λ0+Λ2*(16*Φ^4/%pi^2)+Λ4*(16*Φ^4/%pi^2)^2),q,1,j)$;
    
    N1: (2*a0/a)*x+(λ+μ)*sum(Bq*((1+((n*a*sinh(n*a/2))/(2*cosh(n*a/2))))*sinh(n*x)-n*x*cosh(n*x))*cos(n*y),q,1,j)+(λ+μ)*sum(βp*((1-((m*b*cosh(m*b/2))/(2*sinh(m*b/2))))*cosh(m*y)+m*y*sinh(m*y))*sin(m*x),p,1,j)$;
    
    N2: ((2*λ*a0)/(a*(λ+2*μ)))*x+(λ+μ)*sum(Bq*((1-((n*a*sinh(n*a/2))/(2*cosh(n*a/2))))*sinh(n*x)+n*x*cosh(n*x))*cos(n*y),q,1,j)+(λ+μ)*sum(βp*((1+((m*b*cosh(m*b/2))/(2*sinh(m*b/2))))*cosh(m*y)-m*y*sinh(m*y))*sin(m*x),p,1,j);
    
    wxplot3d(N1, [x,-a/2,a/2], [y,-b/2,b/2])$;
    
    wxplot3d(N2, [x,-a/2,a/2], [y,-b/2,b/2])$;
    
    0 回复  |  直到 5 年前
        1
  •  4
  •   user5920214 user5920214    5 年前

    这不是一个完整的答案,因为我不知道该如何处理 wxMaxima :我建议你问问开发商。然而,评论太长了,我认为这可能对人们有用,而且 回答如何解决堆大小限制的问题 Maxima 在使用SBCL时,至少在Linux或其他具有命令行的平台上运行时。

    需要注意的是,我怀疑根本问题不是堆大小,而是计算以某种可怕的方式爆炸:最好的解决办法可能是了解爆炸的原因并修复它。看看罗伯特·多迪尔的回答,这可能会更有帮助。但是,如果堆大小 问题是,这就是你为马克西玛处理它的方式。

    诀窍在于,您可以通过向SBCL传递以下命令来告诉它堆限制应该是多少 --dynamic-space-size <MB> 论点,你可以通过 maxima 包装器执行此操作。

    以下是Maxima在Linux上运行的记录,其中SBCL作为后端(这是从源代码构建的版本:我假设打包版本是相同的):

    $ maxima
    Maxima 5.43.2 http://maxima.sourceforge.net
    using Lisp SBCL 2.0.0
    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) :lisp (sb-ext:dynamic-space-size)
    
    1073741824
    

    因此,在这个系统上,defaule堆限制为1GB(这是SBCL在平台上的默认限制)。

    现在我们可以通过 -X <lisp options> 又称作 --lisp-options=<lisp options> 选项到 最大值 包装器将适当的选项传递给 sbcl :

    $ maxima -X '--dynamic-space-size 2000'
    Lisp options: (--dynamic-space-size 2000)
    Maxima 5.43.2 http://maxima.sourceforge.net
    using Lisp SBCL 2.0.0
    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) :lisp (sb-ext:dynamic-space-size)
    
    2097152000
    

    如您所见,这使堆大小增加了一倍。


    如果有人知道wxMaxima的答案,那么请对这个答案进行编辑:我无法尝试它,因为我所有的Linux虚拟机都是无头的。

        2
  •  1
  •   Robert Dodier    5 年前

    这里也不是一个完整的答案,但我希望有更多的注释和提示会有所帮助。

    为了使Maxima更容易理解这个问题,只使用精确的数字(整数和比率),并避免 float numer 。(绘图功能将适用 浮动 数字 自动)我将0.3改为3/10,并切断了与 浮动 .

    此外,请尝试设置 j 到一个较小的数字(我试过了 j 等于1)在将问题再次增加到5之前,尝试一路解决问题。

    此外,更换所有 sum integrate 具有 'sum 'integrate (即名词表达而不是动词表达)。看看求和函数和被积函数,看看它们是否正确。您可以通过以下方式计算总和和/或积分或两者 ev(expr, sum) ev(expr, integrate) ev(expr, nouns) 评估 '总和 , '整合 ,或所有名词表达。

    j 等于1,我得到以下表达式 N1 :

    (2500000*((-(13*cosh(%pi/6)
                   *((8503056*cosh(%pi/6)^2*sinh(3*%pi)^2)
                    /(9765625*%pi^4
                             *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2
                             *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2)
                    +(52488*cosh(%pi/6)*sinh(3*%pi))
                     /(15625*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                            *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))
                    +324/25))
             /(120000*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                     *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))))
             +(13*sinh(3*%pi)
                 *((2754990144*cosh(%pi/6)^3*sinh(3*%pi)^2)
                  /(244140625*%pi^4
                             *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^3
                             *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2)
                  +(17006112*cosh(%pi/6)^2*sinh(3*%pi))
                   /(390625*%pi^2
                           *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2
                           *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))
                  +(104976*cosh(%pi/6))
                   /(625*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))))))
              /(22680000*%pi^2*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2)
             +13/(35000*%pi^2*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))))
            *sin((%pi*(2*p-1)*x)/80)
            *((%pi*(2*p-1)*y*sinh((%pi*(2*p-1)*y)/80))/80
             +(1-(3*%pi*(2*p-1)*cosh(3*%pi*(2*p-1)))
                 /sinh(3*%pi*(2*p-1)))
              *cosh((%pi*(2*p-1)*y)/80)))
     /13
     +(2500000*((-(13*cosh(%pi/6)
                     *((344373768*cosh(%pi/6)^2*sinh(3*%pi)^3)
                      /(244140625*%pi^4
                                 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                                  ^2
                                 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))
                                  ^3)
                      +(2125764*cosh(%pi/6)*sinh(3*%pi)^2)
                       /(390625*%pi^2
                               *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                               *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2)
                      +(13122*sinh(3*%pi))
                       /(625*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))))
               /(1620000*%pi^3*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2))
               +(13*sinh(3*%pi)
                   *((8503056*cosh(%pi/6)^2*sinh(3*%pi)^2)
                    /(9765625*%pi^4
                             *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2
                             *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2)
                    +(52488*cosh(%pi/6)*sinh(3*%pi))
                     /(15625*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                            *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))
                    +324/25))
                /(3780000*%pi^3*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))
                         *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))
               -13/(20000*%pi*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))))
              *(((%pi*sinh(%pi/6))/(6*cosh(%pi/6))+1)
               *sinh((%pi*x)/240)
               -(%pi*x*cosh((%pi*x)/240))/240)*cos((%pi*y)/240))
      /13-(25*x)/48$
    

    现在,为了绘制该图,它应该是一个函数 x y 只有。然而 listofvars 它包含的报告 x , y ,以及 p 嗯,我明白了 βp 有一个总结 p1 但它包含 Ζ0 ,其中包含 Λ0 ,其中包含 p .总结结束了吗 p1 应该已经结束了 p ?求和是否应该包含 p1 而不是 p ?

    同样,似乎 N2 ,在用以下公式计算总和和积分后 j 等于1,包含 p .

    也许你需要稍微修改一下公式?我不知道正确的形式是什么。

        3
  •  0
  •   Vickel    1 年前

    除了用户5920214的回答之外:

    wxMaxima手册第3.13节讨论了堆大小限制问题:

    3.13 My sbcl-based maxima runs out of memory

    使用命令行参数提供最大值(以及sbcl)的一种方法是wxMMaximas配置对话框的附加参数字段。

    推荐文章