Каждый раз при вызове пользовательской функции Maxima выполняет её разбор, что не существенно для однократного вызова, но может сказаться при работе в цикле. Однако, есть возможность ускорить (теоретически) вычисления с помощью трансляции или компиляции функций.
Трансляцию выполняет функция
translate(функ1, функ2, функ3, ...)
которая принимает на вход список функций, подлежащих преобразованию в код Lisp. Если необходимо оттранслировать все функции, вызовите один из следующих вариантов:
translate(functions)
translate(all)
При работе с числовыми или логическими типами для большего быстродействия имеет смысл сообщить об этом с помощью функции
mode_declare(переменная1, тип1, переменная2, тип2, ...)
Возможны следующие типы переменных: boolean, fixnum, number, rational, float. Переменные одного типа можно задать в виде списка. Например:
f(x) := block([s], mode_declare([function(f),x,s],float), s:1, for i:1 thru 7 do s:s+x^i, s)$
translate(f);
Здесь результат функции, а также аргумент и переменная объявлены числами с плавающей точкой, затем определён полином 7-й степени и выполнена трансляция.
Компиляция производится с помощью функции
compile(...)
Она принимает такой же список аргументов, что и translate(). Разница заключается в том, что выполняется не только трансляция в Lisp, но затем и компиляция в бинарные коды.
Есть информация, что при использовании трансляции или компиляции Maxima стремится оптимизировать скорость, но правильность выражений может пострадать. Так что при возникновении странностей стоит сравнить результат с выходом "сырой" функции.
Комментариев нет:
Отправить комментарий