2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 [Mathematica] Увеличение производительности
Сообщение03.06.2013, 15:04 


03/06/13
7
Здравствуйте!
Занимаюсь очень объёмными и долгими вычислениями, на которые уходит по несколько часов, в итоге процесс идёт очень медленно, так как постоянно приходится корректировать уравнения и т.д.
Интересует вопрос, как заставить математику (9 версию) использовать процессор не на 20% один поток, а хотя бы 4 ядра процентов на 50?
И интересует более быстрая альтернатива команде Simplify, ибо при очень громоздких выражениях процесс затягивается ощутимо и постоянно обрывает процесс трансформации или, при использовании TimeConstraint -> Infinity, забивает все 8 гигов оперативки и опять же не приводит к конечному результату.
И последний вопрос. Есть ли ощутимая разница во времени между использованием Simplify и FullSimplify?
Заранее спасибо!

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение03.06.2013, 15:25 
Заслуженный участник


27/04/09
28128
Как говорит справка,
FullSimplify will always yield at least as simple a form as Simplify, but may take substantially longer.

Если вдруг вам нужна какая-то специфическая форма результата, использование Expand, Factor, Cancel, Apart, Together должно быть быстрее Simplify.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение03.06.2013, 15:36 


03/06/13
7
arseniiv
Ну да, ответ на последний вопрос был тривиален.
В общем случае так и приходится добиваться результата, но на это уходит больше сил, времени и кода. Задача в большинстве случаев состоит в том, что бы получить тождественный ноль, но что бы его получить приходится изрядно извращаться над полученными выражениями, что бы их упростить.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение03.06.2013, 22:02 


30/03/12
130
Jedy, mathematica не умеет распараллеливать эти функции, поэтому расчётами занят всего один поток и с этим ничего не поделаешь. Однако, если задач много, то можно решать их параллельно в разных потоках, для этого есть специальные функции. Кроме того, если нужно проверить выражение на равенство нулю и вероятность получить не ноль довольно велика, то можно посчитать численно - это займёт очень мало времени и может исключить необходимость символьных расчётов.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение03.06.2013, 22:18 


03/06/13
7
Euler7
Моя задача ставиться следующим образов: найти интегралы движения и проверить, что они являются таковыми.
Ищутся они легко, но к сожалению при больших размерностях системы оказываются жутко громоздкими, что мешает их общему анализу, поэтому применяется команда Simplify, что бы результат был более удобен. Затем проверяется, что он действительно таковой, но выражение становиться на порядок больше и тут снова приходится применять Simplify, что бы лицезреть этот ноль.
Как оптимизировать работу и ускорить процесс упрощения или, хотя бы, проверки мне не предоставляется возможным. Есть идеи на сей счёт?

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение03.06.2013, 22:25 


30/03/12
130
Jedy в сообщении #732250 писал(а):
Как оптимизировать работу и ускорить процесс упрощения или, хотя бы, проверки мне не предоставляется возможным. Есть идеи на сей счёт?

А можно увидеть пример расчёта(*.nb файл)? Загрузить можно сюда(кнопка upload, справа вверху), если не хотите выкладывать на всеобщее обозрение.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение04.06.2013, 09:07 


03/06/13
7
Euler7
Не хочет пускать на ваш сервер, не доступен пишет.
В целом могу скинуть один пример получившегося выражения, которое тождественно равно нулю, но после упрощений, естественно.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение04.06.2013, 16:41 


30/03/12
130
Jedy в сообщении #732363 писал(а):
Не хочет пускать на ваш сервер, не доступен пишет.

Были проблемы у провайдера, примерно с 10 до 11, наверно в этот момент и попали. Обычно чем полнее данные, тем больше моментов можно оптимизировать.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение04.06.2013, 17:46 


03/06/13
7
Euler7
Отослал вам 2 файла с формулами.
В первом самая маленькая, во втором по-больше.
На первую уходит около минуты, на вторую уже больше.

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение04.06.2013, 21:09 


30/03/12
130
Jedy в сообщении #732507 писал(а):
На первую уходит около минуты, на вторую уже больше.

Это что же за проц у вас??? У меня FullSimplify в 5 минут не укладывается...
Что касается ускорения. Во-первых можно отказаться от самой идеи упрощения и использовать PossibleZeroQ, т.е. просто проверить не тождественно ли выражение нулю. Во-вторых можно отдельно(параллельно) упростить вещественную и мнимую части, на вашем примере это ускоряет расчёты вдвое:
Код:
MySimplify[data_] := Module[{tmp = ComplexExpand[data], ret, f},
  f = {tmp[[-1, 2]], tmp[[;; -2]]};
  SetSharedVariable[f];
  ret = ParallelEvaluate[
    FullSimplify[f[[$KernelID]](*,Element[ToExpression[ToString[Row[
     Variables[tmp],"|"]]],Reals]*)], {1, 2}];
  Return[ret[[1]] + I ret[[2]]]
  ]

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение04.06.2013, 21:37 


03/06/13
7
Euler7
Я использую просто Simplify, так как он даёт желаемый ноль немного быстрее, но вот упрощать эти интегралы муторно.
Хм, мне нравится команда PossibleZeroQ, как то я её мимо себя пропустил. Испробую отпишусь, пока считает медленно, как и Simplify.
По поводу отдельного упрощение вещественной и мнимой части думал, но в другую сторону, попробую разобраться в вашем коде и применить. Сразу спасибо.
Но всё же меня пугает, что это всего лишь малая часть моих вычислений, дальше выражения будут ещё на порядок сложнее и я даже не знаю как оптимизировать эту работу.

P.S. Проц i7

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение08.06.2013, 14:59 


03/06/13
7
Возникло ещё пару идей и вопросов соответственно:
1) Если сказать математике, что все переменные и постоянные вещественные, то увеличится ли скорость вычислений?
Если да, то как объявить переменные и константы вещественными?
2) Если сделать объявления из пункта выше, то можно ли получить явный вид комплексно-сопряжённой функции, являющейся комбинацией исходных вещественных констант и переменных?

 Профиль  
                  
 
 Re: [Mathematica] Увеличение производительности
Сообщение12.06.2013, 12:02 


30/03/12
130
Jedy в сообщении #734372 писал(а):
Возникло ещё пару идей и вопросов соответственно:
1) Если сказать математике, что все переменные и постоянные вещественные, то увеличится ли скорость вычислений?
Если да, то как объявить переменные и константы вещественными?
2) Если сделать объявления из пункта выше, то можно ли получить явный вид комплексно-сопряжённой функции, являющейся комбинацией исходных вещественных констант и переменных?

1. Как повезёт. В примере я это, оставил в комментариях:
Код:
Element[ToExpression[ToString[Row[Variables[tmp],"|"]]],Reals]

Element[x|y|z, Reals] означает, что переменные x, y и z вещественные. Я всегда указываю область значений переменных, правда не знаю как это на скорости сказывается, но часто удавалось получить более простые выражения чем если бы все переменные были вещественными или комплексными.
2. Дык ComplexExpand же!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group