Здравствуйте.
Есть программа, написанная на Mathematica, и мне хотелось бы узнать, есть ли способы существенно увеличить скорость её работы.
Программа на самом деле устроена очень просто: я (можно сказать руками) ввёл ряд функций
, которые "иерархически" выражаются друг через друга - т.е. вторая как-то выражается через первую, например
, третья - через первую и вторую и т.д. По-существу всё, что требуется от программы - явно вычислять "старшие" функции по младшим посредством уравнений, которые я задал. При этом зависимость "старших" функций от младших всегда устроена довольно просто - это какая-то их алгебраическая комбинация, возможно с производными, например
и т.д. "Стартовая" функция
, тоже, в общем-то, не сложная. Но где-то, скажем, на пятидесятом шаге для
получается уже весьма и весьма громоздкое выражение. Далее, всё устроено так, что в самом конце есть скажем
про которую известно, что она должна выглядеть относительно просто. Поэтому после того как мы её вычислили по предыдущим, надо её ещё привести к познаваемому виду, что я делаю с помощью операции Simplify. Думаю что не менее половины всех трудов машины приходится именно на упрощение.
Итак, резюмируя. Я ввожу функцию
(которую на самом деле не требуется менять, она всё время одна и та же) и хочу от программы получить
. Экспериментальное наблюдение, сделанное мной, подсказывает что в целях ускорения работы надо команду Simplify применять на каждом шаге, т.е. вместо
писать
. Наверное это не общая ситуация, но в случае моего кода помогает. Да, и ещё одно замечание - на самом деле хочется не увеличить скорость подсчёта этой самой
, а вычислить этой программкой, скажем,
за разумное время, но думаю что эти задачи более или менее эквивалентны.
Пожалуй, это все ключевые моменты. Я довольно плохо представляю как устроена Mathematica, поэтому вполне мог пропустить что-то важное в своих попытках оптимизации.