4

everyone,

I'm trying to do some calculations and plot the results, but it seems that these are too heavy for Maxima. When I try to calculate N1 and N2 the program crashes when parameter j is too high or when I try to plot them, the program displays the following error message: "Heap exhausted, game over." What should I do? I've seen some people saying to try to compile Maxima with ccl, but I don't know how to do it or if it will work.

I usually receive error messages like:

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. 

Here goes the code:

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])$;
4

2 回答 2

3

这不是一个完整的答案,因为我不知道这应该如何与wxMaxima一起使用:我建议您询问开发人员。然而,评论太长了,我认为可能对人们有用,它确实回答了在使用 SBCL 时如何解决Maxima本身的堆大小限制的问题,至少在 Linux 或其他具有命令行。

作为说明,我怀疑根本问题不是堆大小,而是计算以某种可怕的方式爆炸:最好的解决方法可能是了解什么是爆炸并修复它。请参阅 Robert Dodier 的答案,这可能会更有帮助。但是,如果堆大小问题,这就是您为 Maxima 处理它的方式。

诀窍是您可以通过将参数传递给 SBCL 来告诉 SBCL 堆限制应该是多少,并且您可以通过包装器传递--dynamic-space-size <MB>参数来执行此操作。maxima

这是在 Linux 上运行的 Maxima 的成绩单,以 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

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

现在我们可以将-X <lisp options> aka --lisp-options=<lisp options>选项传递给maxima包装器,以将适当的选项传递给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 VM 都是无头的。

于 2020-02-24T10:23:48.320 回答
1

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

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

此外,尝试设置j为较小的数字(我尝试j等于 1)以尝试一直解决问题,然后再将其增加到 5。

此外,将所有的sumandintegrate替换为'sumand 'integrate(即名词表达式而不是动词表达式)。查看被加数和被积函数,看看它们是否正确。ev(expr, sum)您可以通过或ev(expr, integrate)或来分别计算总和和/或积分或两者ev(expr, nouns)来计算'sum'integrate或所有名词表达式。

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报告说它包含xyp。唔。我看到βp有一个总和,p1但它包含Ζ0,包含Λ0,包含p。总结p1应该结束了p吗?summand 是否应该包含p1而不是p

N2同样,在求和和积分j等于 1之后,似乎包含p

也许您需要对公式进行一些修改?我不知道正确的形式可能是什么。

于 2020-02-25T07:54:25.287 回答