Софтерра: Вычислительный конструктор

Автор: Сергей Гладких sergeyxtr@gmail.com

Человечество штурмует (или точнее будет сказать — осаждает?) неприступную крепость математики вот уже несколько тысячелетий. Раньше в этом бою мы могли полагаться только на свои собственные силы, на силы своего интеллекта. С появлением вычислительной техники ситуация изменилась: теперь наш арсенал постоянно пополняется новыми «осадными орудиями»; математические пакеты, такие как Maple или Matlab, занимают все более важное место в жизни «бойцов математического фронта». Но это «тяжелая артиллерия», с которой не всякий сумеет управиться.

Algebrus — совсем другое дело. Разработка Владислава Апостолюка сочетает простой и удобный интерфейс с впечатляющими возможностями для решения широкого круга математических задач. Едва ли не более важным, однако, является наличие огромного потенциала для расширения этих возможностей: Algebrus представляет собой среду разработки, ориентированную на алгоритмизацию математических вычислений; в ее основе лежит специализированный язык программирования XPascal, являющийся, как нетрудно догадаться из названия, расширенной и снабженной библиотекой математических методов версией Паскаля. Этот язык призван помочь тем, кто не нашел в стандартных библиотеках Algebrus нужных функций и взялся писать их сам. Но прежде чем разбираться, чему можно «научить» Algebrus, выясним, что он уже умеет.

Готовые детали

Использование командной строки на главной панели программы открывает доступ ко всем или почти ко всем функциям, реализованным в Algebrus’е. Для тех же, кого командная строка по каким-либо причинам не устраивает, есть панели Evaluator и Plotter, облекающие функции в простую и удобную интерфейсную оболочку (рис. 1). Впрочем, и в самой командной строке нет ничего мудреного. Скажем, чтобы воспользоваться ею как обыкновенным калькулятором, не требуется никаких предварительных знаний о программе: в качестве команды можно ввести строчку вида «2*2» и мгновенно получить ожидаемый ответ "4". Разумеется, Algebrus знает элементарные (и не только) математические функции, так что наличие синуса (sin), логарифма (ln) или даже гамма-функции (Gamma) в выражении его не смутит. Впрочем, подобной функциональностью сейчас никого не удивишь, а Algebrus’у по зубам и гораздо более сложные задачи. Например, команда LinearSolve позволяет легко решать системы линейных уравнений: в качестве аргументов ей подаются матрицы коэффициентов системы и вектор правых частей. Так, команда LinearSolve({{2,1},{1,2}},{4,5}) выдаст решение системы {2x+y=4, x+2y=5}.

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

Большинство встроенных функций можно найти на панели Evaluator — при этом программа сразу же предложит ввести необходимые аргументы и посчитает результат — так что запоминать синтаксис команд не обязательно (рис. 2).

Отдельного упоминания заслуживают графические возможности Algebrus. Здесь к услугам пользователя инструменты для рисования самых разнообразных двух— и трехмерных графиков и диаграмм: начиная с банальных графиков функций y=f(x) и заканчивая средствами визуализации векторных полей и построения сложных трехмерных поверхностей (рис. 3). Есть и довольно экзотические функции: скажем, процедура Compass_Chart выводит на экран набор векторов по заданным углам и длинам, а Surface_Plot — трехмерную поверхность, заданную набором точек на плоскости и соответствующих им высот.

Модели для сборки

Несмотря на хорошо проработанный интерфейс, Algebrus, по-видимому, проектировался прежде всего как среда разработки со встроенным интерпретатором языка XPascal. Дело в том, что некоторые из ее возможностей не выведены на интерфейсный уровень, и даже доступ к ним из командной строки не реализован в полной мере. Примером может служить численное интегрирование с помощью метода Integrate. В качестве одного из параметров он принимает интегрируемую функцию (переменную типа TMathFunc); однако, не обращаясь к XPascal Editor, вы не сможете объявить «свою» функцию — это означает, что, хотя вы и можете вызвать Integrate из командной строки, ничего, кроме уже объявленных системных функций, проинтегрировать с ее помощью не удастся. Тоже самое касается любого другого метода, принимающего в качестве одного из параметров некоторую функцию.

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

Что можно сказать об этом языке? Во-первых, это «надстройка» над обыкновенным Паскалем, включающая в себя большое количество функций, которые могут быть полезны при математических расчетах. Например, в языке есть такие типы данных, как матрица и кватернион, и реализованы различные методы для работы с ними (скажем, вычисление определителя). Есть и другие приятные «мелочи», которые отличают этот язык от классического Паскаля: так, стандартные арифметические операторы (+, —, *) можно применять к векторам и матрицам, а можно и переопределить для работы с какими-либо другими типами данных. В то же время изменения не затрагивают основ языка, поэтому у человека, уже знакомого с Паскалем, освоение среды Algebrus не займет много времени. С другой стороны, недостатком программы, весьма существенным для потенциальных разработчиков, является отсутствие доступа ко встроенным библиотекам — то есть узнать, как именно реализованы используемые Algebrus’ом функции, не представляется возможным. Кроме того, XPascal — это, по-видимому, расширенная версия Паскаля «обыкновенного», но не Object Pascal, то есть этот язык не является объектно-ориентированным в строгом смысле слова (хотя в нем реализована поддержка пользовательских типов данных и структур), что тоже едва ли можно причислить к достоинствам программы.

Подведем итог. Программа оставляет впечатление перспективной разработки. Хороша, несмотря на очевидную простоту, главная идея: взять стандартный язык программирования, оптимизировать его для работы с математическими задачами и снабдить интерфейсом, дающим, помимо всего прочего, возможность производить относительно простые вычисления даже не прибегая напрямую к самому языку программирования. Мысль не новая, но важно не это: качественная реализация хорошей идеи никогда не бывает лишней. В данном случае качество не вызывает сомнений: хотя в программе и встречаются баги, их очень мало и они несущественны.

Остается рассмотреть последний и, вероятно, самый важный вопрос: на кого рассчитан Algebrus? Для решения специфических прикладных задач, требующих использования сложного математического аппарата, он едва ли подойдет, набор реализованных в нем методов для этого недостаточно широк. Впрочем, Algebrus может оказаться весьма полезен как платформа для разработки более серьезной техники, требуемой для решения той или иной задачи. Кроме того, в роли потенциальных пользователей могут выступать студенты, которым приходится иметь дело с различными расчетами, и даже школьники; а вот профессиональные математики скорее предпочтут «вооружение» помощнее — скажем, тот же Matlab. Впрочем, не стоит забывать, что Algebrus — проект относительно новый, а значит, ситуация еще может измениться.

XPascal в действии

Одним из самых интересных методов, реализованных в Algebrus, является, на мой взгляд, DSolve, предназначенный для численного решения дифференциальных уравнений и их систем.

В качестве параметров DSolve принимает функцию f (она должна быть объявлена заранее), задающую векторное поле, а также вектор начальных условий и отрезок времени, на котором требуется найти решение. Результат возвращается в виде матрицы, по которой с помощью метода DataPlot можно в одну строчку построить фазовый портрет. Вот пример кода, выводящего на экран фазовый портрет модели простого осциллятора:

procedure DFunc ( x : Vector; t : Real; var dx : Vector ); const

F : real = 25; // частота

D : real = 0.25; // параметр системы

// дифференциальное уравнение осциллятора

dx[1] := x[2];

dx[2] := -F*F*x[1]-2*D*F*x[2];

S : Matrix; // матрица решения

// решаем ОДУ

S := DSolve( DFunc, {0, 1}, 0, 1 );

// выводим результат

PlotData( S[2], S[3], FALSE, psLine );








Главная | Контакты | Прислать материал | Добавить в избранное | Сообщить об ошибке