Почему конечная сумма рассчитывается так долго? - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь вычислить следующую сумму: enter image description here

Она рассчитывается мгновенно. Поэтому я увеличиваю количество баллов до 24 ^ 3, и оно все еще работает быстро: enter image description here

Но когда количество баллов составляет 25 ^ 3, ожидать результата практически невозможно! Более того, есть предупреждение: enter image description here

Почему вычисление конечной суммы занимает так много времени? Как я могу получить точный ответ?

1 Ответ

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

Попробуйте

max=24;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

, который быстро возвращает

{0.143978,14330.9}

и

max=25;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

, который быстро возвращает

{0.156976,14636.6}

и даже

max=50;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

, который быстро возвращает

{1.36679,16932.5}

Изменение вашего кода таким образом позволяет избежать сотен или тысяч If тестов, которые почти всегда приводят к True. И он потенциально использует алгоритмы Symboli c для поиска этих результатов вместо необходимости суммировать каждое из отдельных значений.

Сравните эти результаты и время, если вы замените Sum на NSum и если вы замените /500 на *.002

Чтобы попытаться угадать, почему времена, которые вы видите, внезапно меняются при увеличении границы, другие люди замечали в прошлом, что кажется, что есть некоторые жестко закодированные границы внутри некоторых из численные алгоритмы и когда диапазон достаточно мал, Mathematica будет использовать один алгоритм, но когда диапазон достаточно велик, чтобы превысить эту границу, он переключится на другой и потенциально более медленный алгоритм. Трудно или невозможно точно знать, почему вы видите это изменение, не имея возможности проверить решения, принимаемые внутри алгоритмов, и никто за пределами Wolfram не увидит эту информацию.

Чтобы получить более точное числовое значение, вы можете измените N[...] на N[...,64] или N[...,256] или полностью исключите N и получите большой сложный точный результат c.

Будьте осторожны с этим, тщательно проверяйте результаты, чтобы убедиться, что Я не сделал никаких ошибок. И отчасти это только догадки с моей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...