- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF106:SciLab
Материал из Linuxformat.
Содержание |
SciLab: Основы
SciLab |
---|
|
- Компьютеры, как известно, придумывали для работы с числами, и для решения этой задачи были созданы самые различные программы. Александр Бикмеев покажет вам одну из них – свободный аналог Matlab.
В научной и инженерной среде хорошо известны так называемые CAS – Computer Algebra System; в русскоязычной литературе их часто называют СКМ – системами компьютерной математики. Одним из ярких представителей данного класса продуктов является Matlab, который с успехом применяется во многих областях науки и техники, более того, существует в виде Linux-версии. Но даже на Западе Matlab по карману не каждому вузу. И вот тут-то на сцене появляется супермен из мира свободного ПО – SciLab (http://www.scilab.org).
SciLab – это система компьютерной математики с открытым кодом. На момент написания статьи стабильной была версия 4.1.2. В установочный комплект включена подробнейшая справка, доступная на английском и французском языках: желающие могут загрузить ее с официального сайта в PDF-формате.
Задачей данной серии статей является обратить ваше внимание на данный продукт, показать некоторые его возможности и, если получится, избавить вас от Matlab-зависимости. Очень бы хотелось, чтобы статьи попали в руки тех преподавателей вузов, которые все еще ведут занятия на пиратском Matlab – быть может, SciLab станет для них более законным решением.
Подготовка к работе и запуск
Установить SciLab можно из RPM/Deb-пакета (http://rpmfind.net поможет в поиске первых), архива с исходными текстами или в виде бинарной сборки. Процедура во всех случаях будет стандартной. Для старта системы необходимо набрать в консоли команду scilab или, что значительно удобнее, создать на рабочем столе или в меню ссылку на приложение.
Для возврата на предыдущий уровень коллекции демонстрационных примеров следует нажать кнопку Cancel [Отмена] у нижней кромки окна.
После запуска вы увидите главное окно, в котором вводятся команды и выводятся результаты вычислений. В его верхней находится текстовое меню. Пункт меню Control содержит команды управления процессом вычислений: Resume [продолжить], Abort [отменить] и Stop [приостановить]. Пункт Help вызывает справку, а Editor открывает окно редактора файлов-сценариев. Пункт меню Graphic Windows # позволяет открывать и создавать графически окна, а также переключаться между ними. Самым интересным пунктом является Demos, выбор которого приводит к появлению окна со списком коллекции демонстрационных примеров. Погуляйте по ней – здесь есть очень много красивых проектов, особенно в разделе Simulation (рекомендую Demos > Simulation > Bike Simulation). Для знающих английский язык будет очень полезен первый пункт коллекции – Introduction to SCILAB, представляющий собой небольшой учебник.
Система SciLab является кросс-платформенной, но интерфейс ветки 4.х зависит от типа ОС. Так, в Windows он более приятный, имеет панель инструментов, а также поддерживает двунаправленную работу с буфером обмена. Linux-версия SciLab лишена этих возможностей. Как и при работе с графической консолью, вы можете вставить текст из буфера при помощи Shift+Ins, но скопировать что-то из окна SciLab не получится. Впрочем, скоро все изменится (см. Смена версий).
В настоящее время официальной является ветка 4.х, но уже при первом запуске появляется окно с предупреждением, что она будет последней, использующей старый графический интерфейс. Впрочем, кардинальной смены GUI в SciLab 5.0 не произойдет. Все также будет основное окно для ввода команды и текстовое меню, обеспечивающее доступ к инструментам. Однако, судя по справке, пятая версия будет включать в себя многие пакеты расширений (Toolbox), которые в настоящий момент необходимо загружать и устанавливать вручную. На момент написания этой статьи на официальном сайте была доступна весьма неустойчивая в работе версия 5.0.beta1, но стабильный релиз планируется уже в мае.
Продукт поставляется с большим руководством, описывающим все имеющиеся функции. Для того, чтобы вызвать окно справки, необходимо выбрать пункт меню Help > Help browser либо выполнить команду help. При этом, если вы ничего не меняли, откроется внутренний обозреватель справки. Однако, поскольку документация представляет собой набор html-файлов, вы можете изменить настройки и читать ее в любом удобном вам web-браузере. Для выбора приложения просмотра справки следует воспользоваться пунктами меню Help > Configure. Обычно вам предлагаются Firefox, Nautilus, Netscape, Opera и два варианта SciLab Browser – старый (old) и обычный. Наиболее удобен, на мой взгляд, обычный SciLab Browser, потому что только он предоставляет возможность поиска по всем файлам справки.
Вы можете также искать по части слова в описании или названии функции. Для этого следует выбрать пункт Help > Apropos, ввести в появившемся диалоге искомую подстроку и нажать кнопку OK. Откроется окно выбранного вами обозревателя справки с перечнем пунктов, удовлетворяющих условию поиска. Например, если вам необходимо узнать, как считаются интегралы, то для поиска можно ввести слово integral. После нажатия кнопки OK, мы увидим около десяти пунктов справки, содержащих данное слово.
Стандартное справочное описание содержит четыре раздела:
- Calling Sequence [описание вызова] – шаблон вызова данной функции или процедуры
- Parameters [Параметры] – описание всех возможных параметров текущей функции или процедуры
- Description [Описание] – описание смысла самой функции или процедуры с примером использования.
- See Also [Смотри также] – перечень схожих функций или процедур. Каждый предлагаемый вариант представляет собой гиперссылку, позволяющую перейти к его описанию.
Дополнительные пакеты расширений могут иметь свои собственные разделы, так что их полное перечисление здесь не имеет смысла. И пусть справка практически абсолютно не пригодна для изучения пакета – это именно справка – но постоянно обращение к ней поможет быстрее освоить систему.
Простые вычисления
Теперь, я надеюсь, вы сможете ориентироваться в небогатом интерфейсе SciLab, и мы можем перейти непосредственно к работе.
Итак, SciLab – это, преимущественно, система численных вычислений. Средства аналитического счета есть, но, во-первых, их немного, а, во-вторых, их использование неочевидно.
Как и в Matlab, команды набираются пользователем и выполняются системой последовательно. Ввод происходит в строке после системного приглашения, которое имеет вид -->. После набора команды ее уже нельзя исправить, как в текстовом редакторе: необходимо вернуться к ней при помощи клавиш-стрелок (как в терминале), потом внести изменения и нажать Enter, то есть вновь выполнить уже исправленную команду. Благодаря сходству с консолью, строку с приглашением называют «командной строкой SciLab».
После каждой команды в рабочем окне появляется результат. Если это не требуется (например, вы просто определяете значение переменной или функцию), то в конце команды следует поставить символ ; (точка с запятой). Если переменная-приемник не указана, то результат заносится в ans.
Длинные команды можно разбить на несколько строк, добавляя в конце каждой из них две или более точек подряд (..). Возможен также ввод поясняющего текста (комментария). Любой комментарий в SciLab, как и в языке C/C++, начинается с двойного символа //. Однако, следует отметить, что версия 4.1.2 не поддерживает кириллицу.
Самым простым случаем является использование SciLab в качестве калькулятора. Вы вводите какое-то математическое выражение с конкретными числами, нажимаете Enter и получаете результат. Например:
--> 2.3*14 – sin(2.1) + tanh(0.2) ans = 31.534166
Математические выражения строятся при помощи стандартных арифметических операций: «+» – сложение, «-» – вычитание, «*» – умножить, «/» – разделить, «^» – возведение в степень. Кроме того, вы можете использовать элементарные математические функции, только следует помнить, что SciLab разрабатывался за рубежом и использует западную нотацию, то есть, tan вместо tg, log вместо ln и так далее.
По умолчанию результат имеет семь цифр после запятой, но вы можете изменить это при помощи функции форматирования printf, синтаксис которой полностью схож с языком С. Например, для того, чтобы вывести результат предыдущего выражения с 10 знаками после запятой, введите:
--> printf("%1.10f",2.3*14 – sin(2.1) + tanh(0.2)) ans = 31.5341659536
Конечно, использование такой мощной системы в качестве простого калькулятора бессмысленно. А при организации сложных вычислений мы неизбежно приходим к переменным, то есть специальным именованным ячейками памяти для хранения исходных и промежуточных данных, а также результата. Например, пусть нам необходимо найти длину и площадь окружности, а также объем и площадь поверхности шара по известному радиусу. В этом случае мы можем ввести переменную R для хранения значения радиуса:
-->R=2; // Значение радиуса -->l = 2*%pi*R l = 12.566371 -->s = %pi*R^2 s = 12.566371 -->S3D = 4*%pi*R^2 S3D = 50.265482 -->V = 4/3*%pi*R^3 V = 33.510322
Вы могли заметить, что в качестве числа π используется конструкция, начинающаяся с символа процента. Так записываются системные переменные. Рассмотрим наиболее важные из них:
- %i – мнимая единица ( q1);
- %e – число e=2.7182818;
- %inf – машинный символ бесконечности (∞);
- %NaN – неопределенный результат (0/0, ∞/∞, 1∞ и т. п.);
- %eps – условный ноль %eps=2.220Е-16.
Переменные пользователя сохраняют свое значение до конца сеанса, либо до тех пор, пока не будут уничтожены командой clear. Просмотреть список всех активных переменных можно при помощи команды who. Команда whos() выводит более подробный перечень с указанием типа переменных (детали см. в справке).
Во время работы часто бывает необходимо сохранить выполненные действия и результаты в файл для дальнейшего использования. Это особенно актуально в связи с тем, что, как мы знаем, SciLab 4.x не поддерживает буфер обмена и прокрутку. Для записи рабочей сессии существует команда diary. Она принимает путь к файлу, например, diary('/home/username/session1.txt'). В конце, следует подать команду diary(0), которая останавливает запись. Тогда все команды и результаты будут сохранены в /home/username/session1.txt в обычном текстовом формате.
Кроме того, SciLab ведет историю введенных команд (но не результатов). Ее тоже можно записать в файл командой savehistory('путь и имя файла'). Записанная история загружается командой loadhistory('путь и имя файла'), стереть ее можно командой resethistory, ну а вывести на экран – командой gethistory. Запись истории команд в файл полезна в том случае, когда вы пытаетесь создать свою собственную функцию или файл-демонстрацию, но об этом поговорим в другой раз.
Начало разработке предка SciLab положил сотрудник INRIA Франсуа Делебескью [Francois Delebecque]. Проект назывался Blaise (позднее Basile) и распространялся на коммерческой основе. Он содержал не только среду интерпретации команд и базовые операции с матрицами, но также пакеты имитационного моделирования и оптимизации. Basile успешно продавался во Франции до конца 80-х. В 1990 группа Meta2 в INRIA инициировала создание свободной версии Basile – так родился SciLab. В ходе развития свободной версии были переработаны многие компоненты, дабы избавиться от проблем с лицензиями, а сама команда разработчиков была преобразована в SciLab team, которая и выпустила первую версию SciLab в 1994 году. SciLab team отвечала за разработку и информационное обеспечение SciLab до 2003 года. Были выпущены две книги (на английском и французском языках), организована группа новостей. В течение этого периода система была портирована в Windows (1999, J. Ph. Chancelier), были разработаны TCL/TK интерфейс (Bertrand Guiheneuf) и многие пакеты расширений, интегрирован редактор файлов-функций.
В 2003 году «шефство» над SciLab приняла команда разработки SciLab [Scilab development team] под покровительством консорциума SciLab [Scilab Consortium]. С тех пор усилия были направлены на разработку новых пакетов расширений, нового графического интерфейса, Java-интерфейса приложений и ядра обработки графики. На официальном сайте вы можете найти план развития SciLab до 2010 года, то есть до версии 6.1.
Если у вас появилось желание поучаствовать в этом процессе, то посмотрите на странице http://wiki.scilab.org/How_to_contribute_to_Scilab, чем вы можете быть полезны проекту.
Векторы и матрицы
В Linux существует много продвинутых научных калькуляторов. Так чем же SciLab лучше? А тем, что он прекрасно работает с матрицами, векторами и вообще массивами чисел. Для того, чтобы создать строку (математически – вектор-строку) чисел, вам достаточно ввести их, разделяя пробелом или запятой и заключив в квадратные скобки, а чтобы ввести столбец (вектор-столбец), необходимо разделять числа символом точка с запятой (;):
-->Vec_x=[1 2 3 4] Vec_x = 1. 2. 3. 4. -->Vec_y=[1;2;3;4] Vec_y = 1. 2. 3. 4.
Ввод матрицы происходит по строкам (они разделяются точкой с запятой), между элементами строк ставятся запятые или пробелы.
-->matr=[1 2 3; 4 5 6; 7 8 9] matr = 1. 2. 3. 4. 5. 6. 7. 8. 9.
К любому элементу вектора или матрицы можно обратиться посредством индекса, заключенного в круглые скобки; если это элемент матрицы, то индексы разделяются запятой. Например, изменим главную диагональ введенной матрицы:
-->matr(1,1) = 0;matr(2,2)=0;matr(3,3)=0; -->matr matr = 0. 2. 3. 4. 0. 6. 7. 8. 0.
Вы можете обратиться не только к элементу, но и к строке или столбцу, при этом вы должны указать его номер, а на месте второго индекса поставить : (двоеточие). Давайте поменяем местами первую строку с третьим столбцом. При этом нам придется столкнуться еще с одной операцией – транспонированием. Для ее выполнения необходимо ввести символ одинарной кавычки рядом с переменной-матрицей:
-->tr=matr(1,:); tc=matr(:,3); // выделяем 1-ю строку и 3-й столбец -->matr(1,:)=tc'; matr(:,3)=tr'; // транспонируем и записываем в // 1-ю строку элементы 3-го столбца // в 3-й столбец элементы 1-ой строки -->matr matr = 3. 6. 0. 4. 0. 2. 7. 8. 3.
Следует помнить и еще об одном правиле: при работе с векторами и матрицами действуют матричные правила выполнения арифметических действий. Например, умножение векторов Vec_x и Vec_y дает разные результаты в зависимости от порядка множителей:
-->Vec_x*Vec_y ans = 30. -->Vec_y*Vec_x ans = 1. 2. 3. 4. 2. 4. 6. 8. 3. 6. 9. 12. 4. 8. 12. 16.
как и должно быть по правилам матричной алгебры. Для того, чтобы выполнить поэлементное арифметическое действие (то есть перемножение не самих векторов, а только их соответствующих элементов: первый на первый, второй на второй и т. д.) используется символ операции с точкой в начале, при этом перемножаемые векторы должны иметь одинаковую размерность:
-->Vec_x .* Vec_y !--error 9999 inconsistent element-wise operation -->Vec_x .* Vec_y' ans = 1. 4. 9. 16.
В первом случае мы пытались выполнить поэлементное умножение строки на столбец и потому была выдана ошибка: размерность Vec_x – 1x4, а Vec_y – 4х1. Во втором случае мы транспонировали столбец и оба множителя стали одинаковой размерности – 1х4.
Выполним одно из простых действий – решим систему линейных уравнений методом обратной матрицы. Пусть дана система:
тогда для ее решения нам потребуется подать следующие команды (для сокращения выводится только результат):
-->A=[1 -2 1; 2 1 -3; 1 3 1]; -->b = [2; -1; 1]; -->x = inv(A)*b x = 0.8 - 0.2 0.8
Построение графиков
Вектора и матрицы можно не только вводить вручную, но и формировать автоматически, используя конструкцию <начальное значение>:<шаг>:<конечное значение>. Например, сформируем вектор из чисел от 1 до 3 с шагом 0.2:
-->vec=1:0.2:3 vec = 1. 1.2 1.4 1.6 1.8 2. 2.2 2.4 2.6 2.8 3.
Если шаг не указывается, то он принимается равным единице, скажем:
-->vec2=1:3 vec2 = 1. 2. 3.
Сформированный вектор может использоваться как обычная переменная, то есть участвовать в математических операциях и быть аргументом функций. В последнем случае получится вектор, каждый элемент которого есть результат действия функции на элемент исходного вектора.
-->Y=sin(vec2) Y = 0.8414710 0.9092974 0.1411200
Таким образом можно довольно просто создавать таблицы функций, а от них два шага и до графика: достаточно просто сгенерировать вектор значений переменной и подать команду plot2d с указанием функции или перечня функций, заключенных в квадратные скобки и разделенных пробелом. При построении важно помнить, что на вход команды plot2d необходимо подавать вектор-столбцы значений функций, поэтому автоматически созданный вектор обычно необходимо транспонировать.
-->x=[0:0.1:2*%pi]'; //создаем вектор и транспонируем его -->plot2d(x, [sin(x) cos(x) sin(x).*cos(x)]) //строим графики
Если не указывать первый параметр (переменная х), то на графике по оси х будут отображаться просто порядковые номера значений в массиве. Обратите внимание, что для получения третьей функции мы использовали поэлементное умножение.
Теперь давайте построим трехмерную поверхность. Для начала создадим два вектора с координатами x и y, затем – матрицу значений функции, причем здесь очень важен порядок множителей (вспомните комментарий выше): первым должен быть столбец (то есть любая из переменных), а вторым – строка (транспонированная переменная). После того, как мы получили все, что нужно, подаем команду plot3d:
-->x=[0:0.1:2*%pi]'; -->y=x; -->z=sin(4*x)*cos(y'/2); -->plot3d(x,y,z)
Результат вы можете посмотреть на рисунке.
Хочется заметить, что многие из описываемых команд имеют дополнительные параметры, но мы не можем описать здесь их синтаксис полностью. Так что, если вам нужна дополнительная информация, то пройдитесь по приведенным во врезке ссылкам и, конечно же, покопайтесь во встроенной справке. До новых встреч!
http://www.scilab.land.ru – прекрасное руководство на русском языке для желающих ознакомиться с основами SciLab. Руководство сделано для Windows-версии 4.0 и является самым свежим в рунете.
http://scilab.psati.ru/rukovodstvo/index.html – еще одно руководство на русском языке, оформленное в виде вопросов и ответов, но создавалось оно перед самым выходом версии 3.0, так что кое-что уже устарело. Описывается Windows-версия.
http://www.wolffdata.se/index.html – множество учебных примеров, демонстрирующих применение SciLab для решения задач физики, обработки сигналов и др.
http://wiki.scilab.org – официальный Wiki.