Сообщение «Куча исчерпана, игра окончена» в wxMaxima - ccl будет работать для меня? - PullRequest
3 голосов
/ 22 февраля 2020

каждый,

Я пытаюсь сделать некоторые расчеты и построить результаты, но кажется, что они слишком тяжелы для Maxima. Когда я пытаюсь вычислить N1 и N2, происходит сбой программы, когда параметр j слишком велик или когда я пытаюсь построить их, программа выводит следующее сообщение об ошибке: «Куча исчерпана, игра окончена». Что мне делать? Я видел, как некоторые люди говорили, что пытаются скомпилировать Maxima с помощью ccl, но я не знаю, как это сделать или будет ли это работать.

Обычно я получаю сообщения об ошибках типа:

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Также не полный ответ здесь, но еще несколько примечаний и указателей, которые, я надеюсь, помогут.

Чтобы упростить задачу для Maxima, используйте только точные числа (целые и крысиные ios) и избегайте float и numer. (Функции печати будут применяться float и numer автоматически.) Я изменил 0,3 на 3/10 и отключил вызовы на float.

Также попробуйте установить j на меньшее число ( Я попытался j, равный 1), чтобы попытаться пройти всю проблему до того, как снова увеличить ее до 5.

Кроме того, замените все sum и integrate на 'sum и '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 сообщает, что он содержит x, y и p. Хм. Я вижу, что βp имеет суммирование по p1, но оно содержит Ζ0, которое содержит Λ0, которое содержит p. Суммирование за p1 должно быть больше p? Предполагается, что слагаемое должно содержать p1 вместо p?

Аналогичным образом получается, что N2 после вычисления сумм и интегралов с j, равным 1, содержит p.

Может быть, вам нужно несколько переработать формулы? Я не знаю, какой может быть правильная форма.

1 голос
/ 24 февраля 2020

Это не полный ответ, так как я не знаю, как это должно работать с wxMaxima : я бы посоветовал вам обратиться к разработчикам. Однако это слишком длинный комментарий, и я думаю, что он может быть полезен людям, и он отвечает на вопрос о том, как вы решаете ограничение размера кучи для Maxima при использовании SBCL, по крайней мере, при запуске на Linux или на какой-либо другой платформе с командной строкой.

Как примечание, я подозреваю, что основная проблема заключается не в размере кучи, а в том, что вычисление взрывается в какой-то ужасной Кстати, лучшее решение - это, наверное, понять, что взрывается, и исправить это. Посмотрите ответ Роберта Додье, который, вероятно, будет намного более полезным. Однако, если размер кучи равен , проблема заключается в том, как вы справляетесь с этим для Maxima.

Хитрость заключается в том, что вы можете сказать 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

Итак, в этой системе предел кучи дефолта составляет 1 ГБ (это ограничение 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 ВМ безголовы.

...