2014 dxdy logo

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

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




 
 Оптимизация программы в Mathematica
Сообщение15.03.2013, 13:20 
Здравствуйте.

Есть программа, написанная на Mathematica, и мне хотелось бы узнать, есть ли способы существенно увеличить скорость её работы.

Программа на самом деле устроена очень просто: я (можно сказать руками) ввёл ряд функций $f_1,f_2,...$, которые "иерархически" выражаются друг через друга - т.е. вторая как-то выражается через первую, например $f_2=f_1^2$, третья - через первую и вторую и т.д. По-существу всё, что требуется от программы - явно вычислять "старшие" функции по младшим посредством уравнений, которые я задал. При этом зависимость "старших" функций от младших всегда устроена довольно просто - это какая-то их алгебраическая комбинация, возможно с производными, например $f_3=f''_2+f'_1f_1^2$ и т.д. "Стартовая" функция $f_1$, тоже, в общем-то, не сложная. Но где-то, скажем, на пятидесятом шаге для $f_{50}$ получается уже весьма и весьма громоздкое выражение. Далее, всё устроено так, что в самом конце есть скажем $f_{100}$ про которую известно, что она должна выглядеть относительно просто. Поэтому после того как мы её вычислили по предыдущим, надо её ещё привести к познаваемому виду, что я делаю с помощью операции Simplify. Думаю что не менее половины всех трудов машины приходится именно на упрощение.

Итак, резюмируя. Я ввожу функцию $f_1$ (которую на самом деле не требуется менять, она всё время одна и та же) и хочу от программы получить $Simplify[f_{100}]$. Экспериментальное наблюдение, сделанное мной, подсказывает что в целях ускорения работы надо команду Simplify применять на каждом шаге, т.е. вместо $f_3=f''_2+f'_1f_1^2$ писать $f_3=Simplify[f''_2+f'_1f_1^2]$. Наверное это не общая ситуация, но в случае моего кода помогает. Да, и ещё одно замечание - на самом деле хочется не увеличить скорость подсчёта этой самой $f_{100}$, а вычислить этой программкой, скажем, $f_{200}$ за разумное время, но думаю что эти задачи более или менее эквивалентны.

Пожалуй, это все ключевые моменты. Я довольно плохо представляю как устроена Mathematica, поэтому вполне мог пропустить что-то важное в своих попытках оптимизации.

 
 
 [ 1 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group