«Аннотация В настоящем документе рассматриваются основные возможности пакета Scilab и навыки, необходимые для того, чтобы приступить к работе как можно быстрее. В первой главе показано, как получить дистрибутив и ...»
Введение в Scilab
Michal Baudin
e
Перевод Artem Glebov
Ноябрь 2010 года
Аннотация
В настоящем документе рассматриваются основные возможности пакета Scilab и навыки, необходимые для того, чтобы приступить к работе
как можно быстрее. В первой главе показано, как получить дистрибутив и установить Scilab на персональный компьютер, а также где искать помощи в случае затруднений. Вторая глава представляет обзор графической и текстовой среды пакета Scilab. Основные конструкции встроенного языка программирования Scilab рассматриваются в главе 3. Глава 4 посвящена работе с матрицами и основным функциям библиотеки линейной алгебры. В пятой главе представлены основные конструкции структурного программирования в Scilab. Вопросы определения пользовательских функций, управления входными и выходными аргументами, а также создания библиотек функций составляют шестую главу. Завершает обзор глава 7, где дано краткое введение в графические возможности Scilab, включая построение двухмерных графиков и экспорт изображений.
Содержание 1 Введение 1.1 О данном руководстве.......................... 1.2 Обзор пакета Scilab........................... 1.3 Как получить дистрибутив и установить Scilab........... 1.3.1 Установка Scilab в Windows.................. 1.3.2 Установка Scilab в Linux.................... 1.3.3 Установка Scilab в Mac OS................... 1.4 Как получить помощь.......................... 1.5 Списки рассылки, wiki и отчеты о дефектах............. 1.6 Демонстрационные примеры Scilab.................. 1.7 Упражнения............................... 2 Основы работы в Scilab 2.1 Консоль Scilab.............................. 2.2 Встроенный редактор скриптов.................... 2.3 Расположение панелей......................... Использование команды exec 2.4..................... 2.5 Пакетная обработка........................... 2.6 Упражнения............................... 3 Основные элементы языка Scilab 3.1 Определение вещественных переменных............... 3.2 Имена переменных............................ 3.3 Комментарии и продолжение строки................. 3.4 Элементарные математические функции............... 3.5 Предопределенные математические константы........... 3.6 Логический тип............................. 3.7 Комплексные числа........................... 3.8 Целые числа............................... 3.8.1 Обзор целых чисел....................... 3.8.2 Преобразование целых типов.................. 3.8.3 Выход за пределы диапазона и проблемы переносимости. 3.9 Целые числа и числа с плавающей точкой.............. Переменная ans............................
3.10. 3.11 Строки.................................. 3.12 Динамическая типизация переменных................ 3.13 Упражнения............................... 4 Матрицы 4.1 Обзор................................... 4.2 Создание вещественных матриц.................... Пустая матрица [].................
4.3........... 4.4 Определение размера матрицы..................... 4.5 Работа с элементами матрицы..................... 4.6 Оператор ”:”............................... Генерация единичной матрицы. Функция eye.
4.7........... 4.8 Динамическое изменение размера матрицы............. 4.9 Оператор ”$”............................... 4.10 Арифметические операции....................... 4.11 Поэлементные операции......................... 4.12 Эрмитово сопряжение и транспонирование.............. 4.13 Умножение векторов.......................... 4.14 Сравнение вещественных матриц................... 4.15 Числа с плавающей точкой в качестве индексов........... 4.16 Еще об элементарных функциях.................... 4.17 Высшая алгебра и другие возможности Scilab............ 4.18 Упражнения............................... 5 Операторы ветвления и цикла Оператор if............................... 5. Оператор select............................. 5. Оператор for............................... Отладка функций. Инструкция pause.
Copyright c 2008-2010 - Consortium Scilab - Digiteo - Michal Baudin Copyright c 2010 - Перевод Artem Glebov This file must be used under the terms of the Creative Commons AttributionShareAlike 3.0 Unported License:
http://creativecommons.org/licenses/by-sa/3. 1 Введение Данный раздел представляет краткий обзор целей создания и основных особенностей пакета Scilab. Здесь мы рассмотрим способы получения и установки дистрибутивов Scilab, основные справочные источники, включая встроенную справочную систему пакета, а также интерактивные демонстрации, поставляемые в составе дистрибутивов.
1.1 О данном руководстве Данный документ, как и программный продукт, который он описывает, является проектом с открытым исходным кодом. Исходный текст в разметке L TEX доступен в репозитории Scilab Forge:
http://forge.scilab.org/index.php/p/docintrotoscilab/ Исходный текст L TEX распространяется в соответствии с лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License:
http://creativecommons.org/licenses/by-sa/3. Скрипты Scilab, используемые в данном руководстве, содержатся в папке scripts проекта. Правила распространения скриптов определяются лицензией CeCiLL:
http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt 1.2 Обзор пакета Scilab Программный пакет Scilab объединяет в себе развитый язык программирования и обширную библиотеку численных алгоритмов, охватывающую многие области научных и технических вычислений.
Язык программирования Scilab относится к числу интерпретируемых языков высокого уровня, предоставляя пользователю возможность напрямую манипулировать математическими конструкциями, такими как матрицы или полиномы. Тем самым достигается большая скорость и простота написания программ. Язык Scilab допускает расширение посредством определения пользовательских типов данных. При этом стандартным операциям, например, арифметическим операторам или операторам сравнения, возможно придать особый смысл применительно к пользовательским типам данных. Пользователи пакета могут разрабатывать собственные модули расширения для решения конкретных задач. Возможен также вызов из Scilab функций, реализованных на других языках программирования, в частности Fortran или C, благодаря чему сторонние библиотеки могут быть использованы, как если бы они были частью встроенных средств пакета. Scilab также предоставляет возможности для взаимодействия с программным комплексом LabVIEW компании National Instruments, предназначенным для визуального проектирования измерительных систем, а также сбора и анализа экспериментальных данных.
Разрабатываемый в соответствии с принципами свободного программного обеспечения, Scilab распространяется бесплатно на основе лицензии Cecill [2].
Дистрибутив Scilab включает исходный код, поэтому заинтересованный пользователь может самостоятельно исследовать внутреннее устройство пакета и особенности его работы. Скомпилированные версии пакета Scilab доступны для операционных систем Windows, Linux и Mac OS. Справочная документация переведена на многие языки мира.
Scilab предоставляет чрезвычайно богатый набор средств для научных и инженерных расчетов. Хотя первоначальный акцент при разработке пакета был сделан на матричную алгебру, вскоре функциональные возможности расширились настолько, что охватили большинство разделов научных вычислений, включая:
• линейную алгебру и разреженные матрицы, • полиномы и рациональные функции, • интерполяцию и аппроксимацию, • линейную, квадратичную и нелинейную оптимизацию, • обыкновенные дифференциальные уравнения, дифференциально-алгебраические уравнения, • классическое и робастное управление, решение линейных матричных неравенств, • оптимизацию дифференцируемых и недифференцируемых функций, • обработку сигналов, • математическую статистику.
Кроме того, Scilab содержит значительное число функций для построения графиков, а также мощное средство визуального моделирования Xcos, которое объединяет в себе возможности редактора моделей и симулятора.
1.3 Как получить дистрибутив и установить Scilab Дистрибутивы, содержащие исполняемые файлы для каждой из поддерживаемых платформ (Windows, Linux и Mac OS), доступны на домашней странице Scilab а также в разделе Download Предлагаются версии для 32- и 64-битовых платформ.
Scilab также может быть загружен в форме исходных кодов и скомпилирован пользователем самостоятельно. Самостоятельная компиляция будет интересна в том случае, если пользователь желает более подробно ознакомиться с особенностями внутреннего функционирования Scilab, а также при необходимости отладки или добавления новых возможностей. Для компиляции Scilab понадобятся дополнительные файлы, которые также можно загрузить в разделе Download. Кроме того, потребуется компилятор Fortran или C. Инструкции по компиляция можно найти в разделе ”Compilation of Scilab” wiki-энциклопедии Scilab, размещающейся по адресу 1.3.1 Установка Scilab в Windows Версия Scilab для ОС Windows содержит программу-установщик, которая значительно облегчает установку и настройку пакета. В ходе установки на рабочий стол добавляется ярлык приложения, при выборе которого отображается консоль Scilab (рис. 1).
Для платформ на базе процессоров Intel в Scilab используется библиотека Intel Math Kernel Library (MKL) [6], позволяющая существенно повысить скорость вычислений.
1.3.2 Установка Scilab в Linux Для операционных систем семейства Linux бинарные версии Scilab предлагаются в виде сжатых tar-файлов (*.tar.gz). Специальной программы-установщика в данном случае не требуется - достаточно распаковать архив в выбранный каталог, после чего Scilab готов к запуску. Исполняемый файл расположен по адресу /scilab-5.x.x/bin/scilab, где - путь к каталогу, куда был распакован архив. При выполнении данного скрипта отображается окно консоли, которая полностью аналогична консоли в версии для Windows.
Отметим, что Scilab также распространяется в виде пакетов в дистрибутивах Linux, основанных на Debian (например, Ubuntu). Установка в этом случае чрезвычайно проста, однако поскольку между выходом новой версии Scilab и обновлением соответствующих пакетов в дистрибутивах проходит некоторое время, загруженная таким образом версия пакета может оказаться не самой свежей.
В настоящий момент в версии Scilab для Linux используется библиотека линейной алгебры, которая обеспечивает независимость от конкретной операционной системы. При этом из Scilab для Linux исключена бинарная версия библиотеки ATLAS [1], поэтому функции линейной алгебры могут выполняться медленнее, чем в Windows.
1.3.3 Установка Scilab в Mac OS Версия Scilab для Mac OS предлагается в виде файла формата.dmg. Данный формат поддерживается версиями Mac OS начиная с 10.5. Для распаковки используется классический инсталлятор Mac OS. Архитектуры на основе Power PC в Scilab не поддерживаются.
В версии Scilab 5.2 для Mac OS по техническим причинам отключена библиотека Tcl / Tk, в результате чего существуют определенные ограничения на использование Scilab в рамках данной платформы. В частности, не работает интеграция Scilab/Tcl (TclSci), графический редактор и редактор переменных.
Эти возможности будут реализованы на языке Java в будущих версиях Scilab, после чего ограничения будут сняты.
Несмотря на указанные особенности, использовать Scilab в Mac OS достаточно просто, чему немало способствуют ”горячие” клавиши, привычные пользователям данной платформы. Например, как в консоли, так и в редакторе можно пользоваться клавишей Cmd, имеющейся на клавиатуре Mac. А поскольку платформа не поддерживает щелчков правой клавишей мыши, в Scilab для Mac OS вместо нее применяется комбинация клавиши Control и щелчка мышью.
Как и в случае с Linux, версия Scilab для Mac OS содержит библиотеку функций линейной алгебры, однако не комплектуется бинарной версией библиотеки ATLAS [1], поэтому функции линейной алгебры могут выполняться несколько медленнее, чем в Windows.
1.4 Как получить помощь Наиболее простым способом получить справку по возможностям пакета Scilab является функция help. Окно справки Scilab показано на рис. 2. Для его отображения наберите help в консоли и нажмите клавишу :
Если вас интересует информация о конкретной функции (например, optim), вы можете пролистать содержание справки, найти раздел, посвященный оптимизации, и выбрать optim, после чего будет отображено окно со справкой по данной функции. Однако более удобным способом получить информацию о конРис. 2. Окно справки Scilab. Левая панель представляет список разделов справки, а правая - содержимое выбранного раздела.
кретной функции, если вы знаете ее название, является использование команды help с указанием имени интересующей функции:
В этом случае Scilab автоматически отобразит окно справки, содержащее информацию о выбранной функции. Если функции с указанным именем не существует, будет отображено сообщение об ошибке.
Также вы можете использовать страницы справки на сайте Scilab:
Эта страница всегда содержит сведения о наиболее свежей версии Scilab. Используя возможности поиска вашего Интернет-обозревателя, вы можете быстро найти необходимую информацию. Также можно одновременно держать открытыми окна со справкой по нескольким командам Scilab. Например, изучив описание команд derivative и optim, можно записать целевую функцию, основанную на вычислении производных посредством команды derivative и пригодную для оптимизации при помощи optim.
На домашней страничке Scilab также можно найти список книг, онлайнруководств и статей, посвященных пакету:
http://www.scilab.org/publications 1.5 Списки рассылки, wiki и отчеты о дефектах Список рассылки [email protected] предназначен для общих вопросов, касающихся использования Scilab. Для того чтобы подписаться на него, отправьте письмо на [email protected] (содержание и тема письма не имеют значения, поэтому можно оставить то и другое пустым). Список рассылки [email protected] посвящен вопросам разработки Scilab, в том числе вычислительного ядра и модулей, активно взаимодействующих с ним. Для того чтобы подписаться, отправьте пустое письмо на [email protected].
Архивы данных рассылок доступны по адресам http://dir.gmane.org/gmane.comp.mathematics.scilab.user http://dir.gmane.org/gmane.comp.mathematics.scilab.devel Перед тем как задавать вопрос в списке рассылки, настоятельно рекомендуется для начала обратиться к архиву - возможно, на этот вопрос уже был дан ответ.
Специфические вопросы, касающиеся технических моментов и не предназначенные для широкой аудитории, следует направлять по адресу электронной почты [email protected], где они будут рассмотрены разработчиками Scilab и получат квалифицированные ответы.
Wiki-энциклопедия Scilab, представляющая открытый источник для обмена опытом между пользователями и разработчиками пакета, располагается по адресу Программисты смогут здесь найти пошаговые инструкции для компиляции Scilab, информацию о библиотеках, необходимых для работы различных версий пакета, указания по работе с хранилищем исходного кода и т.д.
Для регистрации обнаруженных дефектов консорциум Scilab использует систему Bugzilla (http://bugzilla.scilab.org). Если вы обнаружили ошибку в функционировании пакета, разработчики Scilab будут вам признательны, если вы сообщите о ней, заполнив размещенную по этому адресу форму. Может случиться, что данную ошибку уже обнаружил кто-то другой, поэтому целесообразно провести поиск в базе данных перед тем, как сообщать о новой ошибке.
Если ошибка пока не зарегистрирована, пожалуйста, сообщите о ней, сопроводив ваш отчет описанием ситуации, в которой она возникает, и последовательностью инструкций, позволяющей ее воспроизвести. Последовательность инструкция должна быть по возможности простой, что позволит быстро обнаружить и устранить дефект.
Эффективным способом получения актуальной информации о Scilab является RSS-подписка:
http://www.scilab.org/en/rss_en.xml В данном канале регулярно публикуются пресс-релизы и объявления общего характера, которые могут заинтересовать пользователей Scilab.
1.6 Демонстрационные примеры Scilab Дистрибутив Scilab включает набор демонстрационных примеров, доступных для запуска из консоли либо при выборе пункта меню Справка > Примеры (? > Scilab Demonstrations)1. На рис. 3 показано окно демонстраций. Некоторые демонстрации являются графическими, другие предполают пошаговое выполнение, ожидая нажатия клавиши для перехода к следующему шагу.
Сопутствующие демонстрационные скрипты размещаются в соответсвующих подкаталогах каталога Scilab. Например, демонстрация, связанная с модулем optimization, находится в файле \scilab-\modules\optimization\demos\datafit\datafit.dem.sce где - это путь к каталогу файловой системы, куда установлен Scilab (например, C:/Program Files в Windows), а - версия пакета (например, 5.2.2).
Разбор содержимого этих демонстрационных файлов может помочь начинающему пользователю избежать многих типичных ошибок, а также способствовать пониманию внутренних особенностей работы пакета.
Полезную информацию может дать также анализ исходного кода встроенных функций Scilab. Например, исходный текст функции derivative размещается в файле \scilab-\modules\optimization\macros\derivative.sci В большинстве своем функции реализованы на высоком профессиональном уровне, с учетом всех возможных комбинаций входных и выходных значений.
Часто, рассматривая исходный код встроенных функций, можно почерпнуть для себя отдельные приемы, которые впоследствии пригодятся при разработке собственных алгоритмов.
1 Здесь и далее в скобках указаны названия элементов меню англоязычной версии Scilab.
О том, как выбрать язык интерфейса Scilab, см. раздел 2.5.
1.7 Упражнения тер (на момент написания данного руководства текущей является версия Scilab 5.2). Полезно также установить более старую версию Scilab для сравнения. Установите Scilab 4.1.2 и рассмотрите отличия между двумя версиями.
значена для вычисления производной. Цель данного упражнения состоит в том, чтобы научиться пользоваться различными видами интерактивной справки. Откройте окно справки Scilab, используя меню Справка > Содержание (? > Scilab Help ), найдите статью, посвященderivative.
ную функции Затем используйте для этой же цели консоль Scilab.
Упражнение 1.3 (Использование Если после прочтения данного руководства у вас останутся вопросы по использованию Scilab, воспользуйтесь списком рассылки [email protected] для того, чтобы получить ответы.
2 Основы работы в Scilab В этом разделе мы сделаем наши первые шаги в Scilab и рассмотрим различные пути работы с пакетом:
• используя консоль Scilab в режиме диалога, • используя функцию exec для выполнения предварительно написанных алгоритмов, • используя терминал операционной системы и возможности пакетной обработки.
2.1 Консоль Scilab Простейшим способом использования Scilab является непосредственный ввод команд в консоли. Результат выполнения команды при этом отображается сразу же после ее ввода и выполнения. Все примеры в настоящем руководстве можно выполнить, копируя соответствующие команды в консоль, так что читатель может самостоятельно экспериментировать с рассматриваемыми возможностями Scilab. Пошаговое выполнение является наиболее эффективным способом для того, чтобы понять поведение готовых программ, и чаще всего позволяет достаточно быстро перейти к разработке собственных алгоритмов.
В следующем примере мы воспользуемся функцией disp для отображения строки ”Hello World!”:
Символы ”-->” представляют собой приглашение Scilab и отображаются автоматически, когда Scilab ожидает ввода очередной команды от пользователя.
Набрав инструкцию s="Hello World!" и нажав клавишу, мы укажем Scilab выполнить команду: создать переменную s, содержащую заданный текст.
Рис. 4. Подсказка отображается при нажатии клавиши.
Реакция Scilab на ввод команды подтверждает, что переменная была создана и ее значение установлено. Теперь, набрав disp(s), можно отобразить содержимое созданной переменной.
Для ввода команд используется клавиатура, точно так же как в обычном текстовом редакторе. Для перемещения курсора в пределах строки используются клавиши и. Для удаления неверно введенного символа используются кнопки и.
Клавиши и позволяют перемещаться по истории ранее введенных команд, в том числе в рамках предыдущих сеансов работы с пакетом.
При нажатии на клавишу отображается подсказка (рис. 4), где перечислены команды, имена которых начинаются с введенных символов (в данном случае disp). С помощью клавиш, и можно выбрать из списка необходимую команду. Подсказки отображаются для имен функций, переменных, файлов и графических дескрипторов, тем самым ускоряя и упрощая работу со Scilab.
2.2 Встроенный редактор скриптов Реализованный ранее и сохраненный в файл алгоритм, представляющий последовательность инструкций для решения некоторой задачи, называется скриптом.
Версия Scilab 5.2 предлагает новый редактор, упрощающий разработку собственных скриптов. Внешний вид окна редактора показан на рис. 5. В данном случае пользователь редактирует скрипт, содержащий команды рассмотренного выше примера, где в консоль выводилась строка ”Hello World!”.
Запустить редактор можно из меню Инструменты > Текстовый редактор (Applications > Editor ) либо из консоли, набрав команду Редактор позволяет работать с несколькими открытыми файлами одновременно: на рис. 5 открыты 5 файлов.
Наиболее часто используемые команды редактора располагаются в меню Выполнение (Execute):
• Загрузить в Scilab (Load into Scilab) - позволяет выполнить все команды некоторого скрипта так, как будто эти команды последовательно вводятся в консоли. При этом результат выполнения инструкций, оканчивающихся символом ”;”, не отображается.
• Вычислить выделенное (Evaluate Selection) - позволяет выполнить выделенные инструкции.
• Выполнить файл в Scilab (Execute File Into Scilab) - загружает на исполнение файл подобно тому, как это делается с использованием функции exec (см. раздел 2.4). При этом в консоль будут выводиться лишь результаты работы печатающих функций, например, disp.
Меню Правка (Edit) предлагает полезную возможность автоматического форматирования отступов Исправить отступы (Correct Indentation). Эта возможность позволяет структурировать текст программы, что существенно упрощает чтение блоков в таких конструкциях как if, for и т.д.
Выделив несколько строк и нажав правую кнопку мыши (или комбинацию Control+Click в Mac OS), можно отобразить контекстное меню, представленное на рис. 6. Контекстное меню содержит ряд полезных команд:
• Вычислить выделенное (Execute selection in Scilab) - выполнить выделенные команды;
Рис. 6. Контекстное меню в редакторе скриптов.
• Править выделенное в новой вкладке (Edit selection in a new tab) - открыть новую вкладку и скопировать туда выделенный фрагмент;
• Справка по ’...’ (Help about ’...’ ) - оторбразить страницу помощи, связанную с выделенной командой.
2.3 Расположение панелей Графические возможности Scilab начиная с пятой версии основаны на использовании Java, что дает ряд преимуществ, в том числе широкие возможности для управления расположением панелей. Для реализации этого механизма используется библиотека Flexdock [8], разработанная в рамках проекта с открытым исходным кодом и основанная на стандартном наборе классов Swing.
Предположим, что в какой-то момент открыты окно консоли и редактора, как это показано на рис. 7. Переключение между двумя окнами может представлять неудобство, поэтому реализована возможность разместить окно редактора в качестве панели в пределах основного окна Scilab. Все окна в Scilab, включая консоль, текстовый редактор, окно справки и окна вывода графических результатов, могут быть сгруппированы подобным образом. На рис. 8 представлена ситуация, где совместно размещены четыре таких окна.
Для того чтобы поместить некоторое окно рядом с другим, необходимо перетянуть его в область, занимаемую вторым окном. Для этого следует нажать левой клавишей мыши на заголовок перемещаемого окна и, удерживая клавишу мыши, переместить указатель в область, где должна размещаться панель.
При этом серыми пунктирными линиями будет отображено предлагаемое положение перетаскиваемого окна (один из четырех вариантов: слева, справа, снизу Рис. 7. Строка заголовка перемещаемого окна. Для перемещения выбранного окна, перетащите его в нужную область, удерживая указатель на строке заголовка.
Рис. 8. Управляющие элементы заголовка окна. Закругленная стрелка позволяет отстыковать окно из текущего положения, а крестик служит для закрытия окна.
или сверху). Выбрав один из вариантов, отпустите левую клавишу мыши, после чего панель займет свое положение (как на рис. 7).
Если отпустить клавишу мыши над центром области, панель будет добавлена в качестве вкладки, как показано на рис. 9.
2.4 Использование команды Последовательность из нескольких команд Scilab, предназначенную для многократного выполнения, удобно записать в файл, используя редактор скриптов Scilab. Для того чтобы впоследствии запустить данный скрипт на выполнение из консоли, применяется команда exec, после которой указывается имя файла.
В зависимости от содержимого файла расширением будет либо.sce, либо.sci:
• файлы с раширением.sci содержат определения функций Scilab - выполнение таких файлов приводит к загрузке данных функций в рабочее окружение пакета, после чего их можно использовать точно так же, как встроенные функции Scilab;
• файлы с расширением.sce могут содержать как определения функций, так и исполняемые инструкции - обычно в результате выполнения такого файла вычисляются значения переменных, происходит вывод результатов в консоль, отображение графиков, чтение или запись файлов и т.д.
Представим, что файл myscript.sce содержит всего одну строку:
Использую функцию exec в консоли, мы запускаем данный скрипт на выполнение:
-e инструкция выполнить инструкцию -f файл выполнить скрипт, записанный в файле глийского, ru для русского. По умолчанию языком интерфейса является английский. Для установки языка по умолчанию, используемого при загрузке Scilab без задания параметра -l, применяется команда setdefaultlanguage. После выполнения этой команды программу необходимо перезапустить. Команда getlanguage позволяет узнать, какой язык используется программой в данный момент.
-mem N установить начальный размер стека равным N байт отключить выполнение скрипта scilab.start при загрузке -nouserstartup отключить выполнение пользовательских стартовых скриптов -nw запустить Scilab в режиме командной строки с подключением дополнительных возможностей (например отображения графиков) -nwni запустить Scilab в режиме командной строки без дополнительных возможностей -version отобразить текущую версию Scilab и завершить работу На практике при отладке сложных алгоритмов в интерактивном режиме чаще всего используется комбинация вызовов функций exec и disp.
2.5 Пакетная обработка Иным способом работы с пакетом Scilab является его запуск из командной строки операционной системы без отображения оконного интерфейса. Для этого используются параметры командной строки, приведенные в табл. 1.
Вне зависимости от используемой операционной системы, исполняемые файлы размещаются в каталоге scilab-/bin, где представляет номер установленной на компьютере версии Scilab (например, ’5.2.1’). Аргументы командной строки должны следовать за именем исполняемого файла, как будет показано ниже. Параметр -nw позволяет отключить отображение окна консоли, при этом ввод команд и вывод результатов будет происходить в текстовом режиме в терминале операционной системы. Опция -nwni позволяет запустить Scilab без графических библиотек. В этом случае функции отображения (например вывод графиков) будут заблокированы, а попытка их использовать приведет к ошибке.
Для удобства пользователя в подкаталоге bin основного каталога Scilab присутствуют файлы, предназначенные для запуска Scilab в различных режимах без использования параметров командной строки:
• Для операционных систем семейства Windows в дистрибутивах Scilab поставляются два исполняемых файла. Первый из них, WScilex.exe, запускает интерактивную графическую (оконную) консоль Scilab, описанную выше. Именно на этот файл указывает ярлык, создаваемый программойустановщиком Scilab на рабочем столе Windows. Второй исполнимый файл, Scilex.exe, служит для запуска консоли в текстовом режиме, использующем стандартные средства терминала Windows, как при использовании опции -nw. Указав при запуске Scilex.exe параметр -nwni, можно полностью отключить загрузку графических библиотек, после чего вывод диаграмм и другие подобные возможности станут недоступны.
• В Linux поведение оболочки Scilab можно контролировать, используя параметры стартового скрипта. По умолчанию, Scilab запускается в графическом режиме, однако аргументы -nw и -nwni можно использовать для запуска текстового интерфейса. Каталог bin в версии Scilab для Linux также содержит два исполняемых файла scilab-cli и scilab-adv-cli, первый из которых запускает Scilab без оконного интерфейса (эквивалент параметра -nw ), а второй - без вспомогательных библиотек (эквивалент • Поведение версии Scilab для Mac OS аналогично версии для Linux.
В следующем примере для Windows мы запустим файл Scilex.exe с параметром -nwni. Далее попытаемся выполнить команду plot и убедимся, что графические возможности Scilab отключены:
D :\ Programs \ scilab -5.2.0\ bin > Scilex. exe - nwni _ _ Startup execution :
loading initial environment Undefined variable : plot Наиболее полезным параметром командной строки является -f, позволяющий выполнить команды, содержащиеся в некотором файле. Такой метод называется пакетной обработкой. Предположим, что файл myscript2.sce содержит следующие строки (команда quit применяется для выхода из Scilab):
По умолчанию в интерактивном режиме Scilab ожидает от пользователя ввода следующей команды. Команды quit используется для завершения сессии и выхода из Scilab. Для дальнейшей демонстрации предположим, что мы создали на диске C: каталог scripts и поместили в него файл скрипта myscript2.sce.
Следующий пример показывает результат выполнения данного скрипта с использованием опции -f. Заметьте, что в данном случае требуется указать полный путь к исполняемому файлу Scilex.exe.
C :\ scripts > D :\ Programs \ scilab -5.2.0\ bin \ Scilex. exe -f myscript _ _ Startup execution :
loading initial environment Любая строка, начинающаяся символами ”//”, считается комментарием и игнорируется интерпретатором Scilab. Для того чтобы проверить, что по умолчанию Scilab остается в интерактивном режиме, мы исключим команду quit, используя символы комментария:
Если теперь набрать в терминале операционной системы инструкцию scilex -f myscript2.sce, Scilab отобразит строку ”Hello World!” и перейдет в режим ожидания. Теперь, чтобы выйти, необходимо ввести команду quit вручную.
2.6 Упражнения Упражнение 2.1 (Использование Наберите следующее слово в консоли Scilab и нажмите клавишу :
Рассмотрите появившееся окно. Нажмите клавишу ”I” и затем снова. Как изменилось содержимое окна?
Упражнение 2.2 (Использование га. Предопределенная константа содержит путь к каталогу, в который установлен пакет Scilab, и удобна для записи пути к тому или иному скрипту, поставляемому в составе пакета.
Введите следующие команды в консоли Scilab и рассмотрите результаты их выполнения:
exec ( SCI + " / modules / graphics / demos /2 d_3d_plots / contourf. dem. sce " ) exec ( SCI + " / modules / graphics / demos /2 d_3d_plots / contourf. dem. sce " );
3 Основные элементы языка Scilab Как уже отмечалось, Scilab относится к числу языков программирования высокого уровня и позволяет эффективно манипулировать сложными структурами данных. В данной главе будут рассмотрены основные возможности языка, а именно создание вещественных матриц, использование элементарных математических функций и т.д. Если бы Scilab ограничивался только этими возможностями, он был бы не более чем продвинутым настольным калькулятором. Конечно, возможности Scilab намного шире, и в последующих разделах мы рассмотрим работу с другими типами данных (логическими переменными, комплесными и целыми числами, а также строками).
Следует с самого начала усвоить, что большинство объектов в Scilab являются матрицами. Все вещественные, комплексные, целочисленные и логические переменные, строки и полиномы представлены в виде матриц. Не являются матрицами списки и другие составные структуры - эти типы данных в настоящем руководстве не рассматриваются.
Матрица представляет набор элементов одного типа в виде таблицы, содержащей некоторое число строк и столбцов. Тип элементов определяет набор операций, в которых матрица может участвовать. В данной главе мы рассмотрим работу с матрицами различных типов, начиная с наиболее часто используемого типа - вещественной матрицы.
3.1 Определение вещественных переменных Scilab предоставляет возможности для работы как с вещественными, так и с комплексными числами. Это может приводить к путанице, если не вполне ясен контекст. Комплексные переменные будут рассмотрены в разделе 3.7 как обобщение вещественных переменных. В большинстве случаев вещественные и комплексные переменные ведут себя одинаково, хотя иногда обработка комплексных величин требует отдельного внимания. Для простоты будем далее рассматривать вещественные переменные, делая необходимые оговорки в том случае, если поведение комплексных переменных имеет особенности применительно к обсуждаемому вопросу.
В данном разделе мы научимся создавать вещественные переменные и выполнять с ними простые манипуляции.
В Scilab, поскольку он является интерпретируемым языком, нет необходимости объявлять переменную до ее использования. Переменная создается в тот момент, когда ей впервые присваивается значение.
В следующем примере мы создаем переменную x, которой присваиваем значение 1, после чего выполняем умножение на 2. Оператор ”=” в Scilab используется для установки значения переменной (в отличие от оператора ”==”, который применяется для проверки на равенство).
- вычитание / деление справа, т.е. x/y = xy \ деление слева, т.е. x\y = x1 y ^ возведение в степень, т.е. xy возведение в степень (эквивалентно ^) ’ эрмитово сопряжение (комплексное сопряжение и транспонирование) Таблица 2. Элементарные математические операторы Scilab.
Значение переменной отображается после выполнения каждой инструкции.
Если это нежелательно, после инструкции ставится символ ”;”, как показано в следующем фрагменте:
Все привычные алгебраические операторы доступны в Scilab (см. табл. 2).
Стоит отметить, что оператор возведения в степень представляется символом карет ””, поэтому вычисление x2 в Scilab выполняется посредством выражения x2 или эквивалентного ему выражения x**2. Оператор эрмитова сопряжения ”’” будет более подробно рассмотрен в разделе 3.7, где мы коснемся работы с комплексными числами. Также оператор ”’” является предметом обсуждения в разделе 4.12.
3.2 Имена переменных Имена переменных в Scilab могут иметь произвольную длину, однако лишь первые 24 символа имени являются значимыми, поэтому во избежание ошибок следует использовать имена длиной до 24 символов. Допустимыми символами в именах переменных являются латинские буквы, цифры, а также символы ”%”, ”_”, ”#”, ”!”, ”$”, ”?”. Следует отметить, что некоторые переменные, имена которых начинаются символом ”%”, имеют особый смысл в Scilab: как будет показано в разделе 3.5, такие переменные являются предопределенными математическими константами.
Scilab чувствителен к регистру символов, поэтому в следующем примере интерпретатор считает переменные A и a различными:
Таблица 3. Элементарные математические функции: тригонометрические.
maxi min mini modulo pmodulo sign signm sqrt Таблица 4. Элементарные математические функции: прочие.
3.3 Комментарии и продолжение строки Для оформления комментариев в Scilab применяется синтаксис, заимствованный из языка C++: строки, начинающиеся двумя последовательными символами косой черты ”//”, считаются комментариями и игнорируются при выполнении. В отличие от C и C++, в Scilab отсутствуют многострочные комментарии (ограниченные символами ”/*” и ”*/”).
Если инструкция слишком длинна и не помещается в одну строку, ее можно записать в несколько строк с использованием символа продолжения строки (две точки ”..”). Всякая строка, завершающаяся двумя последовательными точками, считается продолженной на следующую строку. Вычисление выражения, записанного в несколько строк, происходит после ввода последней строки.
В следующем фрагменте кода приводится пример комментария и продолжения строки:
--> // Это комментарий.
3.4 Элементарные математические функции В табл. 3 и 4 представлен список элементарных математических функций, доступных в Scilab. Большинство функций в этом списке принимают один аргумент на вход и возвращают единственное значение.
Таблица 5. Предопределенные математические константы.
Все элементарные функции векторизованы в том смысле, что могут быть применены к матрицам, при этом в результате также получаем матрицы. Это свойство позволяет обрабатывать данные более эффективно, без использования циклов.
В следующем примере мы воспользуемся стандартными функциями sin и cos для проверки равенства cos2 x + sin2 x = 1:
3.5 Предопределенные математические константы В Scilab имена математических констант начинаются символом ”%”. Примеры приведены в табл. 5.
В следующем примере переменная %pi используется для проверки равенства cos x + sin2 x = 1:
Тот факт, что вычисленное значение sin не равно в точности 0, является следствием ограниченной разрядности двоичного представления чисел с плавающей точкой в памяти компьютера.
3.6 Логический тип Переменная логического типа может хранить значения истина или ложь. В Scilab истина представляется литералами %t или %T, а ложь - %f или %F.
В табл. 6 перечислены логические операторы и операторы сравнения, которые используются в пакете. Операторы сравнения принимают на вход данные любого из основных типов (вещественные, комплексные и целые числа, строки) Таблица 6. Логические операторы и операторы сравнения.
real возвращает действительную часть комплексного числа imag возвращает мнимую часть комплексного числа imult умножает число на мнимую единицу isreal проверяет отсутствие мнимой части Таблица 7. Функции Scilab для работы с комплексными числами.
и возвращают логическое значение. Операторы сравнения также рассматриваются в разделе 4.14, посвященном сравнению матриц.
Следующий пример иллюстрирует выполнение операций с логическими типами:
3.7 Комплексные числа Комплексные числа в Scilab представляются в виде пары вещественных чисел.
Предопределенная константа %i содержит значение мнимой единицы i, удовлетворяющее равенству i2 = 1.
Все элементарные функции, рассмотренные выше, работают с комплексными числами. В этом случае возвращаемое значение также будет комплексным.
В табл. 7 приведены наиболее часто используемые функции для работы с комплексными числами.
Для примера присвоим переменной x значение 1 + i и выполним над этой переменной несколько простых операций, в том числе выделим действительную и мнимую части. Напоминаем, что одинарная кавычка ”’” обозначает в Scilab оператор эрмитова сопряжения, который при воздействии на скаляр эквивалентен обычному комплексному сопряжению.
Таблица 8. Функции Scilab для создания целочисленных переменных.
Наконец, проверим выполнение равенства (1 + i)(1 i) = 1 i2 = 2:
3.8 Целые числа В Scilab определены шесть типов целочисленных переменных, для создания которых используются функции из табл. 8.
В этом разделе мы рассмотрим основные свойства целых чисел и диапазоны их значений, обратимся к преобразованию целых типов, а также уделим внимание проблемам, связанным с выходом значения за пределы диапазона, и вопросам переносимости программного кода, использующего целые числа.
3.8.1 Обзор целых чисел Тип целочисленной переменной определяет количество бит, которое используется для представления значения переменной в памяти. В свою очередь, количество используемых бит задает диапазон допустимых значений переменной:
• целое число со знаком, для представления которого используется n бит, может принимать значения из диапазона [2n1, 2n1 1], • беззнаковое целое число, занимающее n бит в памяти, может принимать значения из диапазона [0, 2n 1].
y = int16(x) 16-битовое число со знаком [215, 215 1] = [32768, 32767] y = uint16(x) 16-битовое число без знака [0, 216 1] = [0, 65535] y = int32(x) 32-битовое число со знаком [231, 231 1] = [2147483648, 2147483647] y = uint32(x) 32-битовое число без знака [0, 232 1] = [0, 4294967295] Таблица 9. Диапазоны значений целых чисел в Scilab.
iconvert преобразование к целочисленному представлению Таблица 10. Функции преобразования целочисленных типов в Scilab.
Например, 8-битовое целое число со знаком (int8) может принимать значение в пределах [128, 127]. Таблица 9 отражает соответствие между типом целого числа и диапазоном его значений.
Следующий фрагмент позволяет убедиться, что значение 32-битового целого числа без знака заключено в диапазоне [0, 232 1], т.е от 0 до 4294967295:
3.8.2 Преобразование целых типов Scilab предоставляет две функции для работы с типами целочисленных переменных (таблица 10).
Функция inttype позволяет узнать тип переменной, содержащей целое число, возвращая одно из значений, перечисленных в таблице 11.
При выполнении арифметических операций над целыми числами типом результирующего значения становится наиболее широкий из типов операндов. В следующем фрагменте показан пример сложения 8-битового числа i (для которого inttype возвращает 1) и 16-битового значения j (значение inttype равно 2). Полученное значение k имеет тип 16-битового целого числа.
Таблица 11. Коды типов, возвращаемые функцией inttype.
3.8.3 Выход за пределы диапазона и проблемы переносимости Поведение целых чисел при выходе за границы допустимого диапазона заслуживает особого внимания, поскольку часто различается в пакетах математических вычислений.
В Scilab значения целых чисел изменяются циклически, поэтому при увеличении на 1 за максимальным будет следовать минимальное значение диапазона.
Приведенный фрагмент позволяет в этом убедиться:
124 125 126 127 -128 -127 -126 -125 - Такое поведение отличает Scilab от ряда математических пакетов, в частности Octave и Matlab, в которых при превышении верхней границы диапазона число остается равным значению верхней границы.
Например, следующая выдержка из рабочей сессии пакета Octave демонстрирует указанные различия при выполнении тех же действий, что и предыдущий фрагмент в Scilab:
octave -3.2.4. exe :1 > uint8 (0 + ( -4 : 4)) octave -3.2.4. exe :5 > uint8 (2 ^ 8 + ( -4 : 4)) octave -3.2.4. exe :2 > int8 (2 ^ 7 + ( -4 : 4)) Циклическое поведение целых чисел в Scilab способствует большей гибкости в работе, поскольку позволяет избежать избыточных проверок if. Вместе с тем, алгоритмы, допускающие выход за пределы диапазона, должны проверяться с особой тщательностью, в особенности при переносе алгоритма из одной вычислительной среды в другую.
3.9 Целые числа и числа с плавающей точкой По умолчанию числовая переменная в Scilab имеет вещественный тип с плавающей точкой. Для представления значений этого типа в памяти компьютера используется 64 бита. Даже если при создании переменной ей присваивается целое значение, переменная будет иметь тип с плавающей точкой. Целые числа, хранимые таким образом, получили название ”flint” (сокращение от ”floating point integer”) [7]. На практике целые значения в диапазоне [252, 252 ] можно без особых опасений хранить в вещественных переменных, так как Scilab в этом случае гарантирует точность выполнения операций. Например, в следующем фрагменте мы производим точное сложение двух больших целых чисел, лежащих в пределах диапазона [252, 252 ] и убеждаемся, что потери точности не происходит:
Если же в ходе вычислений значение выходит за пределы указанного диапазона, результаты могут быть весьма неожиданными. Например, как демонстрирует следующий фрагмент, при работе с величинами, превышающими 253, полученное значение оказывается четным независимо от значений операндов:
В следующем примере мы вычислим значение 252 с использованием арифметики с плавающей точкой и 16-битовых целых чисел. В первом случае переполнения не происходит, даже несмотря на то, что значение находится на границе диапазона 64-битовых чисел с плавающей точкой. Напротив, во втором случае результат оказывается неверным, так как значение 252 не представимо в рамках 16 бит.
Вопросы доступа к элементам матрицы посредством вещественных индексов будут рассмотрены в разделе 4.15.
3.10 Переменная Если в инструкции Scilab не указано, какой переменной следует присвоить результат вычисления, результат заносится в специальную переменную ans. Переменная ans, будучи инициализированной, может использоваться так же, как любая другая переменная в Scilab.
В следующем фрагменте мы вычисляем значение exp(3), не указывая, куда поместить результат, и затем убеждаемся, что значение сохранено в переменной ans:
20. Переменная ans, как правило, используется только в интерактивном режиме для вычисления некоторого численного результата без создания новой переменной. Недостатком такого способа является возможность потери ранее полученных значений в результате перезаписи переменной ans. При разработке скриптов полагаться на использование ans не следует - вместо этого необходимо применять обычные переменные.
3.11 Строки Переменной в Scilab можно присвоить строковое значение, заключив его в двойные кавычки ”"”. Конкатенация (слияние) строк осуществляется с помощью оператора ”+”. В следующем примере мы объявляем две строки и склеиваем их при помощи оператора ”+”:
Для обработки строк Scilab предоставляет широкий набор возможностей, включая функции для работы с регулярными выражениями, однако в данном документе эти функции рассматриваться не будут.
3.12 Динамическая типизация переменных Тип переменной в Scilab может динамически меняться в зависимости от присвоенного ей значения. Таким образом, возможно, к примеру, создать переменную, содержащую вещественное число, а затем присвоить этой переменной строковое значение:
Необходимо еще раз подчеркнуть, что Scilab является нетипизированным языком, поэтому нет необходимости указывать тип переменной до присвоения ей значения, и более того, тип может изменяться в течение времени жизни переменной.
3.13 Упражнения Упражнение 3.1 (Приоритет Каков результат вычисления следующих выражений (проверьте свои ответы с помощью Scilab)?
Упражнение 3.2 (Скобки ) Каков результат вычисления следующих выражений (проверьте свои ответы с помощью Scilab)?
Упражнение 3.3 (Экспоненциальная Каков результат вычисления следующих выражений (проверьте свои ответы с помощью Scilab)?
Упражнение 3.4 (Функции ) Каков результат вычисления следующих выражений (проверьте свои ответы с помощью Scilab)?
ющих выражений (проверьте свои ответы с помощью Scilab)?
4 Матрицы Матрицы играют ключевую роль в Scilab. В данном разделе будет рассмотрено создание матрицы, изменение ее свойств, доступ к элементам матрицы и высокоуровневые операции, работающие с группами элементов.
4.1 Обзор Базовой структурой данных в Scilab является матрица. Всякая матрица характеризуется своим размером (т.е. числом строк и столбцов) и типом содержащихся в ней значений. Элементами матрицы могут являться вещественные, комплексные или целые числа, логические значения, строки или полиномы. Если две матрицы имеют совпадающее число строк и столбцов, говорят, что они имеют одинаковый размер.
Частным случаем матриц являются векторы, в которых число строк либо столбцов равно 1. Собственно скалярные величины в Scilab отсутствуют - скалярное значение представляется матрицей 1 1. Поэтому в данной главе мы рассматриваем работу с матрицами, подразумевая, что аналогичные действия применимы и к векторам (т.е. матрицам n 1 или 1 n) и скалярам (матрицам 1 1).
Необходимо отметить, что Scilab создавался в первую очередь для работы с матрицами вещественных значений, и поэтому содержит большое число функций для работы с вещественнозначными матрицами.
В числе задач проектирования Scilab также стояла оптимизация скорости выполнения таких операций. Для этого было разработано специальное внутреннее представление матриц, позволяющее интерпретатору эффективно манипулировать ими. Основные операции линейной алгебры, такие как сложение, вычитание, транспонирование и скалярное произведение, выполняются оптимизированными встроенными функциями. Эти операции обозначаются в Scilab символами ”+”,”-”, ”’” и ”*”.
При использовании высокоуровневых операторов и функций практически отпадает необходимость в реализации циклов, которые, помимо прочего, выполняются существенно медленнее (от 10 до 100 раз), нежели встроенные функции. Данное свойство Scilab носит название векторизации. Для написания максимально эффективных алгоритмов в Scilab необходимо всегда пользоваться имеющимися высокоуровневыми возможностями, так чтобы каждой командой по возможности обрабатывалась целая матрица, а не один ее элемент.
Более сложные задачи линейной алгебры, такие как решение систем линейных уравнений Ax = b, различные виды разложений (например, гауссово разложение с перестановками P A = LU ), поиск собственных значений и векторов, также выполняются встроенными оптимизированными функциями. Пользователю эти возможности доступны посредством операторов Scilab ”/” и ”\”, а также специальных функций (например, функции spec, вычисляющей собственные значения и векторы для заданной матрицы).
4.2 Создание вещественных матриц Определение вещественной матрицы в Scilab выглядит следующим образом:
где:
• квадратные скобки ”[” и ”]” обозначают начало и конец перечисления элементов матрицы, • запятой ”,” отделяются элементы матрицы, находящиеся в одной строке, • точка с запятой ”;” разделяет строки матрицы.
Пробелы при отделении значений запятыми не являются обязательными, но улучшают читаемость. Символы ”...” обозначают пропущенные значения.
В следующем примере мы создаем матрицу 2 3, содержащую действительные значения:
linspace вектор равноотстоящих значений testmatrix специальные типы матриц (Гильберта, Франка и пр.) grand улучшенный генератор случайных чисел Можно воспользоваться упрощенным синтаксисом, не требующим применения символов ”,” и ”;”. В этом случае матрица записывается построчно, а значения в пределах одной строки разделяются пробелом, как показано ниже:
Это позволяет существенно облегчить ввод матриц и повысить его наглядность:
Многострочная запись матриц полезна при выводе матрицы в файл, поскольку упрощает просмотр и проверку значений, а также обратное считывание матрицы в Scilab.
Несколько функций Scilab позволяют создавать матрицы заданного размера, принимая в качестве своих параметров значения числа строк и столбцов.
Среди таких функций (см. табл. 12) наиболее часто используются eye, zeros и ones:
4.3 Пустая матрица Пустую матрицу (размером 0 0) можно создать используя пустые квадратные скобки, как показано в следующем примере:
Этот синтаксис также позволяет очистить содержимое ранее созданной матрицы, чтобы освободить занимаемую память:
4.4 Определение размера матрицы Функции, приведенные в табл. 13, позволяют проверить и изменить размер матрицы.
Вызов функции size для некоторой матрицы возвращает два параметра nr и nc, значения которых равны числу строк и столбцов в данной матрице:
Функция size может быть полезна при определении собственных функций в тех случаях, когда обработка аргументов зависит от размерностей аргументов.
В качестве примера можно привести функцию, вычисляющую норму, которая будет различным образом действовать при получении вектора и матрицы.
Функция size также имеет альтернативный синтаксис:
Возвращаемое значение в этом случае определяется вторым параметром sel функции:
• при sel=1 или sel="r" возвращается число строк, • при sel=2 или sel="c" возвращается число столбцов, • при sel="*" возвращается общее число элементов в матрице, равное числу строк, умноженному на число столбцов.
В приведенном ниже фрагменте с использованием функции size подсчитывается общее число элементов в матрице:
4.5 Работа с элементами матрицы Scilab предоставляет несколько способов доступа к элементам матрицы A:
• используя имя матрицы A, можно оперировать матрицей как целым, size определить размер матрицы matrix изменить размер матрицы resize_matrix создать новую матрицу заданного размера и скопировать Таблица 13. Функции для проверки и изменения свойств матрицы.
• для поэлементных манипуляций применяется запись A(i,j), • для доступа к группе элементов, индексы которых лежат в некотором диапазоне, служит оператор ”:” - он будет рассмотрен в следующем разделе.
Для операций с матрицами используются имена содержащих эти матрицы переменных. Все элементарные алгебраические операции применимы к матрицам одинакового размера, как это показано ниже на примере вычисления суммы:
Получить доступ к отдельному элементу матрицы можно с помощью записи A(i,j), при условии что i и j представляют собой допустимые значения индексов. В Scilab первый элемент имеет индекс 1, в отличие от многих языков программирования, где индексы элементов массива начинаются с 0. Допустим, к примеру, что A представляет собой матрицу nr nc, где nr есть число строк, а nc - число столбцов. Запись A(i,j) имеет смысл только при 1 i nr и 1 j nc. Если значение хотя бы одного из двух индексов не является допустимым, выдается сообщение об ошибке:
Прямой доступ к элементам матрицы с использованием синтаксиса A(i,j) следует использовать только в том случае, если отсутствует соответствующая высокоуровневая функция Scilab. В большинстве случаев такая функция может быть найдена. Scilab предоставляет богатый набор простых и эффективных команд, основанных на возможностях векторизации. Одна из таких возможностей заключена в использовании оператора ”:”, который оказывается чрезвычайно полезным на практике.
4. Простейшая запись инструкции с оператором ”:” выглядит следующим образом:
где i - это минимальное, а j - максимальное значение индекса, причем ij. Результатом является вектор v = (i; i+1;...; j). Следующий пример демонстрирует генерацию вектора, элементы которого пробегают значения от 2 до 4:
Расширенный вариант записи оператора ”:” позволяет указать приращение индекса, называемое шагом:
где i и j имеют тот же смысл, что и ранее, а s представляет собой шаг. Данная команда создает вектор v = (i; i + s; i + 2s;...; i + ns), где n - максимальное целое число, такое что i + ns j. Если (j i) делится нацело на s, то максимальное значение индекса совпадает с j, в остальных случаях i + ns < j. Величина шага s может быть как положительной, так и отрицательной.
В следующем примере создается вектор со значениями от 3 до 10 с шагом Последнее значение в данном случае равно 9, т.е. меньше j=10.
Следующий фрагмент иллюстрирует результат действия оператора ”:” при отрицательном значении шага. В первом случае мы создаем вектор значений, убывающих от 10 до 4. Во втором случае результатом выполнения оператора становится пустая матрица, поскольку начальное значение меньше конечного.
Используя вектор значений индекса, можно обращаться к элементам матрицы в определенных диапазонах строк и столбцов:
где i, j, k,l - начальные и конечные значения индексов. Полный синтаксис A(i:s:j,k:t:l) включает также задание шагов s и t.
Предположим, что A является матрицей размера 45. Пусть необходимо обратиться к элементам ai,j, причем i = 1, 2, а j = 3, 4. В Scilab для этого потребуется всего одна инструкция, A(1:2,3:4), как показано в следущем фрагменте:
-->A = testmatrix ( " hilb ", 5) В некоторых случаях значения индексов должны вычисляться динамически (например в цикле). Полученные в результате векторы могут использоваться для адресации элементов матрицы точно так же, как числовые литералы:
Данная запись выделяет элементы матрицы A, индексы которых принадлежат векторам vi и vj. Следующий пример иллюстрирует эту возможность:
-->A = testmatrix ( " hilb ", 5) A(i:j,k) элементы матрицы в k-ом столбце с i-ой по j-ую строку A(i,j:k) элементы матрицы в i-ой строке с j-ого по k-ый столбец A(i,:) i-ая строка матрицы A(:,j) j-ый столбец матрицы Таблица 14. Различные варианты использования оператора ”:” для доступа к элементам матрицы.
На основе оператора ”:” может быть построено большое число комбинаций.
Наиболее часто используемые из них представлены в табл. 14.
Например, следующий фрагмент демонстрирует использование оператора ”:” для перестановки строк матрицы:
Обменять местами столбцы матрицы A можно при помощи инструкции A(:, [ 1 2]).
В этом разделе нами были рассмотрены несколько важных с практической точки зрения случаев использования оператора ”:”. Оператор ”:” повсеместно используется при написании алгоритмов, для которых скорость выполнения имеет решающее значение. Именно использованием оператора ”:” достигается векторизация алгоритмов - одна из ключевых возможностей Scilab, которой уделяется особое внимание в данном руководстве.
4.7 Генерация единичной матрицы. Функция Функция eye позволяет создать единичную матрицу необходимого размера. Название этой функции в английском произношении созвучно названию буквы I, используемой в англоязычной литературе для обозначения единичной матрицы, и было выбрано таким с целью избежать путаницы с традиционным обозначением индексной переменной i или мнимой единицы1.
Следующий фрагмент демонстрирует, как прибавить число 3 к диагональным элементам матрицы A:
1 В Scilab мнимая единица является предопределенной константой и обозначается %i.
Далее мы создаем единичную матрицу B с использованием функции eye, причем размер создаваемой матрицы будет равен размеру матрицы A, переданной функции eye в качестве параметра. Сама матрица A при этом не изменяется:
Наконец, используя синтаксис eye(m,n), можно явно указать количество строк m и столбцов n в генерируемой матрице.
4.8 Динамическое изменение размера матрицы Матрицы могут динамически изменять свой размер в процессе выполнения программы, что позволяет им приспосабливаться к хранимым данным.
Для иллюстрации создадим матрицу 2 3:
Далее мы добавим в эту матрицу элемент с индексами (3, 1), равный 7. При этом в матрице будет создана третья строка, и первому элементу в ней будет присвоено указанное значение, а остальные элементы строки примут значение Таким образом, размер матрицы может увеличиваться динамически. Далее мы покажем, что возможно и его динамическое уменьшение. Для этого, используя обозначение пустой матрицы [], удалим третий столбец матрицы A:
A(i,$) элемент на пересечении i-ой строки и последнего (nc-ого) A($,j) элемент на пересечении последней (nr-ой) строки и j-ого A($-i,$-j) элемент на пересечении строки nr-i и столбца nc-j Таблица 15. Использование оператора ”$” для доступа к элементам матрицы A размера nr nc.
Также можно полностью изменить размер матрицы посредством функции matrix. Эта функция трансформирует исходную матрицу в матрицу другого размера, копируя элементы столбец за столбцом. В следующем примере матрица A размером 3 2 преобразуется в вектор-строку с 6 элементами:
4. Обычно при обращении к элементам матрицы отсчет индексов ведется от первой строки и первого столбца. Оператор ”$” позволяет адресовать элементы матрицы, отсчитывая индексы от последней строки или столбца в зависимости от контекста.
Различные варианты использования оператора ”$” приведены в табл. 15.
Следующий фрагмент демонстрирует использование оператора ”$” для доступа к элементу A(2,1) = A(nr-1,nc-2) = A($-1,$-2) матрицы 3 3:
-->A = testmatrix ( " hilb ", 3) Оператор ”$” также позволяет динамически увеличить размер матрицы. В следующем фрагменте в Гильбертову матрицу добавляется новая строка:
Чаще всего оператор ”$” используется в составе выражения $+1, которое позволяет добавлять в матрицу строки или столбцы. Такой способ оказывается удобным, поскольку избавляет от необходимости постоянно отслеживать текущее число строк и столбцов. Однако пользоваться им необходимо аккуратно - лишь в тех случаях, когда размер матрицы неизвестен заранее. Поскольку при каждом добавлении строки или столбца происходит выделение памяти под матрицу большего размера и копирование всех элементов из исходной матрицы, злоупотребление этой возможностью может привести к существенному снижению производительности программы.
4.10 Арифметические операции Все арифметические операторы, такие как ”+”, ”-”, ”*” и ”/”, работают с вещественными матрицами. Ниже мы рассмотрим действие каждого оператора в отдельности, дабы устранить любую причину для путаницы.
Операции сложения ”+” и вычитания ”-” выполняются в соответствии с обычными правилами линейной алгебры. В следующем примере показано сложение двух матриц размерности 2 2:
Сложение матриц возможно только в случае одинаковых размерностей обоих операндов. Приведенный ниже фрагмент демонстрирует попытку сложения матриц размерностей 2 2 и 2 3, приводящую к ошибке:
Inconsistent addition.
Исключение составляет ситуация, когда одно из слагаемых является скаляром (т.е. матрицей 1 1). В этом случае значение скаляра будет прибавлено к каждому элементу второго операнда:
или возведение в степень поэлементное возведение в Таблица 16. Элементарные матричные операции и их поэлементные варианты.
Элементарные операторы для работы с матрицами представлены в табл. 16.
Оператор деления в Scilab реализован в двух вариантах: деление справа, обозначаемое символом ”/”, и деление слева, которому соответствует символ ”\”. Результат деления справа X = A/B = AB 1 представляет собой решение уравнения XB = A. Результат деления слева X = A\B = A1 B является решением уравнения AX = B. В случае когда A не является квадратной матрицей, результат деления слева A\B дает решение соответствующей задачи о наименьших квадратах.
В табл. 16 представлены также поэлементные операторы, работающие с отдельными элементами матриц. Эти операторы будут подробнее рассмотрены в следующем разделе.
4.11 Поэлементные операции Точка ”.” перед соответствующим арифметическим оператором обозначает, что операция производится поэлементно. Например, при использовании обычного оператора умножения ”*”, элементы матрицы-произведения C=A*B вычисляются по известной формуле cij = k=1,n aik bkj, при этом каждый элемент представляет собой сумму произведений элементов строки первой матрицы и столбца второй матрицы. В случае поэлементного умножения C=A.*B, элемент cij представляет собой простое произведение соответствующих элементов aij и bij. Следующий фрагмент демонстрирует эти различия для двух конкретных матриц:
Особый смысл придает точка ”.” оператору эрмитова сопряжения. Об этом пойдет речь в следующем разделе.
4.12 Эрмитово сопряжение и транспонирование Может возникнуть некоторая путаница между операторами ” ’ ” и ”.’ ”, первый из которых сопрягает и транспонирует матрицу, а второй - только транспонирует ее. Для вещественнозначных матриц действие обоих операторов эквивалентно и сводится к транспонированию. Различия начинают проявляться, когда эти операторы применяются в отношении матриц, содержащих комплексные значения.
В случае комплекснозначных матриц эрмитово сопряжение матрицы Z посредством оператора ” ’ ” дает матрицу A=Z’, значения элементов которой определяются выражением Ajk = Xkj iYkj, где X и Y - матрицы действительных и вещественных частей Z соответственно, а i - мнимая единица. При транспонировании без сопряжения, выполняемом с использованием оператора ”.’ ”, значения элементов результирующей матрицы Ajk = Xkj + iYkj отличаются от полученных выше знаками мнимых частей.
В следующем примере операторы ” ’ ” и ”.’ ” применяются к асимметричной комплекснозначной матрице, так что различия в их действии становятся очевидны:
Далее демонстрируется применение обоих операторов в случае вещественнозначной матрицы - результаты одинаковы:
Поскольку указанные различия часто становятся источником ошибок, необходимо четко усвоить назначение каждого из операторов и применять оператор ”.’ ” в случае, когда требуется только транспонирование (будь то вещественная или комплексная матрица), и оператор ” ’ ” - когда необходимо выполнить транспонирование и сопряжение.
4.13 Умножение векторов Допустим, u Rn является вектором-столбцом, а vT Rn - вектором-строкой.
Тогда элементы матрицы A = uvT представляют собой произведения Aij = ui vj.
Следующий фрагмент демонстрирует вычисление матрицы A:
Обычно в курсах линейной алгебры рассматриваются только векторы-столбцы, обозначаемые наподобие u Rn. В этом случае соответствующий векторстрока будет записан как uT. В Scilab переменная может содержать непосредственно вектор-строку, а значит при умножении транспонировать этот вектор не понадобится.
Также источником ошибок может служить и обратное предположение, что в переменной хранится вектор-строка, в то время как на самом деле переменная содержит вектор-столбец. Поэтому всякий алгоритм, работающий только с определенным типом матриц, должен проверять размерности входных аргументов и генерировать сообщение об ошибке в случае несоответствия.
4.14 Сравнение вещественных матриц Сравнение двух матриц возможно при условии одинаковых размеров. При выполнении этого условия операторы, представленные в табл. 6, могут применяться и к матричным операндам. В результате сравнения двух матриц образуется матрица логических значений, где каждый элемент представляет результат Таблица 17. Функции построчного и постолбцового сравнения элементов матрицы.
сравнения соответствующих элементов исходных матриц. Логические операторы ”&”, ”|” и др. также применимы к матрицам. Кроме того, матрицы логических значений могут выступать в качестве параметров функций and и or, смысл которых раскрывает табл. 17.
В следующем примере мы определяем матрицу A и сравниваем ее с числом 3 (при этом каждый элемент матрицы сравнивается с этим значением). Затем мы создаем вторую матрицу B и сравниваем ее с первой. Наконец, используя функцию or, мы выполняем построчное сравнение, в результате которого получаем вектор логических значений, указывающий, какие из столбцов матрицы A содержат элементы, превосходящие соответствующие элементы матрицы B.
4.15 Числа с плавающей точкой в качестве индексов Предположим, что матрица A имеет размер 2 2. Для того чтобы обратиться к элементам матрицы, могут применяться как жестко заданные в тексте программы индексы, так и значения, вычисляемые динамически в ходе выполнения, в том числе нецелые, как показано далее:
Этот пример демонстрирует, что все значения 1.0, 1.1, 1.5 и 1.9 округляются до 1, как при использовании функции int, усекающей дробную часть числа. Например, результатом каждого из следущий вызовов: int(1.0), int(1.1), int(1.5) и int(1.9) - будет значение 1, а выражения int(-1.0), int(-1.1), int(-1.5) и int(-1.9) возвращают число -11.
Заметим, что округление происходит в соответствии с особенностями работы функции int, а не floor, которая в отличие от int отрицательные значения округляет в меньшую сторону. В самом деле, предположим, что A представляет матрицу 4 4, например, созданную в результате вызова Функция triu(A,k) возвращает верхнюю треугольную часть переданной ей матрицы A, лежащую выше k-ой диагонали. Команды triu(A, -1), triu(A, int(-1.5)) и triu(A, -1.5) возвращают один и тот же результат, в то время как инструкция triu(A,floor(-1.5)) эквивалентна triu(A,-2).
Такое поведение может показаться странным, но способствует единообразию языка Scilab. Действительно, при обращении к элементам матрицы с использованием переменных в качестве индексов, типом переменной чаще всего будет являться число с плавающей точкой. В этом случае преобразование значения происходит посредством функции int. Сказанное иллюстрирует следующий фрагмент:
Обратите внимание, что в этом примере переменные i и j имеют тип с плавающей точкой.
Иногда использование чисел с плавающей точкой в качестве индексов может приводить к неожиданным результатам, например:
1 С точки зрения внутреннего устройства Scilab это объясняется использованием функции int на уровне вызовов С или Fortran внутри шлюзов Scilab для преобразования чисел с плавающей точкой в целые.
При отсутствии ошибок округления, обусловленных конечной разрядностью представления чисел в памяти компьютера, значение выражения (1 0.9) равнялось бы 1, и в приведенном примере мы получили бы матрицу 1 1.
Однако в действительности команда ones(1,(1-0.9)*10) возвращает пустую матрицу, так как в результате округления числа (1 0.9) 10 с использованием функции int получаем 0:
Причиной тому являются особенности двоичного представления дробных чисел. В результате двоичное представление числа 1 0.9 несколько меньше 0.1, а будучи умноженным на 10, дает число, которое меньше 1, в чем позволяет убедиться следующий фрагмент:
0. 0. На практике при вычислении индексов не следует применять числа, которые не имеют точного представления в форме с плавающей точкой. Точные результаты дают обычные арифметические операции с целыми числами в пределах диапазона [252, 252 ].
4.16 Еще об элементарных функциях В данном разделе рассматриваются тригонометрические функции, принимающие входные значения в градусах, логарифмические функции, а также специальные матричные операции.
Тригонометрические функции, такие как sin и cos, принимают на вход значения в радианах. Их аналоги, предназначенные для работы с аргументами, выраженными в градусах, отличаются наличием буквы ”d” в конце имени (например, sind, cosd). Математически пары таких функций связаны соотношениями вида sind x = sin 180. Однако ввиду особенностей компьютерной арифметики реx зультаты выполнения функций для математически эквивалентных аргументов могут различаться. Например, следующий фрагмент демонстрирует вычисление значений sin и sin 180 :
Тот факт, что вычисленное значение sin не равно в точности 0, связан с ограниченной точностью представления действительных чисел в памяти компьютера. Действительно, количество разрядов в двоичном представлении числа в памяти компьютера ограничено. Следовательно, и результат вычисления функции оказывается приближенным. В то же время число 180 представляется точно, поскольку является целым1. Поэтому значение sind(180) вычисляется точно.
Функция log вычисляет натуральный логарифм числа - функцию, обратную экспоненте exp= ex, где e называется основанием натурального логарифма или константой Эйлера. Для вычисления логарифма по основаниям 10 и 2 можно использовать функции log10 и log2 соответственно. В следующем примере мы вычислим значения log, log10 и log2 для набора заданных значений x:
-->x = [ exp (1) exp (2) 1 10 2^1 2^10] В первом столбце отображены исходные значения x, второй столбец содержит значения log(x), третий и четвертый, соответственно, значения log10(x) и log2(x).
Большинство функций являются поэлементными, т.е., получив на вход матрицу, воздействуют на каждый ее элемент независимо. Вместе с тем, некоторые функции имеют специальное значение в линейной алгебре. Так, например, матричная экспонента определена как eX = k=0, k! X k. Для расчета матричной экспоненты в Scilab применяется функция expm. Вполне очевидно, что применение обычной функции exp дает совершенно иной результат. Имена функций, имеющих специальное значение применительно к матрицам, в Scilab оканчиваются буквой ”m”, например, expm, sinm и др. Следующий фрагмент демонстрирует воздействие функций sin и sinm на матрицу A размером 22, содержащую кратные /2 значения:
1 И лежит в диапазоне [252, 252 ] - см. раздел 3.9.
testmatrix генерация специальных матриц (Гильберта, Франка и др.) 4.17 Высшая алгебра и другие возможности Scilab Scilab предлагает широкий набор функций для выполнения всех распространенных операций линейной алгебры, позволяющих оперировать как разреженными, так и плотными матрицами. Описание всех доступных алгоритмов потребовало бы отдельной книги, поэтому ограничимся перечислением наиболее часто используемых функций в табл. 18.
равен Упражнение 4.6 (Применение f, определяемой уравнением 5 Операторы ветвления и цикла В этом разделе рассматриваются конструкции структурного программирования, доступные в Scilab, такие как условный оператор if, оператор выбора select, циклы for и while, а также инструкции break и continue, предназначенные для управления выполнением цикла.
Оператор if позволяет выполнить некоторый блок инструкций в случае истинности заданного условия. В качестве условия может выступать переменная логического типа или любое выражение, результатом вычисления которого является логическое значение. Блок выполняемых инструкций завершается ключевым словом end. В следующем примере мы отображаем строку ”Привет!”, если условие %t выполняется. Выражение %t, как мы знаем, представляет собой константу, обозначающую истину, поэтому данное условие всегда истинно и строка будет отображена в любом случае.
В результате выполнения этого примера в консоль будет выведено Если условие ложно, выполняется ветвь else, как показано в следующем фрагменте:
В данном случае в консоли появится строка В качестве условия может использоваться любое выражение, результатом вычисления которого является логическое значение, например, содержащее операторы сравнения ”==”, ”>” и т.д. или функции, возвращающие логическое значение. В следующем примере мы используем оператор ”==” для проверки условия и выводим сообщение ”Привет!”, если условие истинно, и ”До встречи!”, если оно ложно:
Подчеркнем, что для проверки на равенство используется оператор ”==”, а не ”=”. Использование последнего приводит к предупреждению, как показано в следующем примере:
Warning : obsolete use of ’= ’ instead of ’== ’.
--> disp ( "До встречи! " ) При наличии нескольких условий, которые должны быть проверены последовательно, полезной оказывается конструкция elseif. Следующий фрагмент демонстрирует, каким образом конструкция elseif может применяться для обработки различных значений переменной i:
Количество блоков elseif не ограничено, что позволяет создавать ветвление произвольной сложности. Однако большое число следующих друг за другом блоков elseif часто говорит о необходимости использования оператора select, речь о котором пойдет в следующем разделе.
5.2 Оператор Оператор select предназначен для сокращенной записи нескольких последовательных проверок переменной на равенство одному из ряда значений, которые в противном случае необходимо было бы оформить как блоки elseif. В зависимости от значения переменной оператор select выполняет один из блоков case. Количество таких блоков не ограничено.
Ниже показано, как отобразить одну из нескольких возможных строк в соответствии со значением переменной i:
В результате, как и следовало ожидать, в консоли будет отображена строка ”Два”.
Блок else выполняется в том случае, если значение переменной не соответствует ни одному из перечисленных вариантов.
Наличие блока else не является обязательным, но считается хорошим тоном. Действительно, даже если программист полагает, что соответствующее этому блоку событие в нормальных условиях никогда не может произойти, ошибка в логике выполнения программы может привести к непредсказуемым последствиям. При отсутствии проверки скрипт продолжит выполняться и в наихудшем случае завершится без сообщений об ошибках, вернув неверный результат. Отладка такого скрипта представляет крайне сложную задачу, поскольку неясно, какая инструкция повлекла нарушение работы. Блок else призван воспрепятствовать распространению ошибки и может помочь в том, чтобы точнее определить место ее возникновения.
Таким образом, блок else должен присутствовать в большинстве конструкций select. Для обработки непредвиденных ситуаций в составе блока else часто применяется функция error. Функция error отображает сообщение об ошибке, содержащее указанный в качестве параметра текст. При этом выполнение алгоритма прерывается, интерпретатор Scilab покидает все вызванные функции и возвращает управление консоли.
Модифицируем предыдущий пример. Теперь в случае отрицательного значения переменной i будем выводить сообщение об ошибке:
error ( "Непредусмотренное значениепараметра i" ) В результате будет отображено:
--> error ( "Непредусмотренное значениепараметра i " )Непредусмотренноезначениепарамет Чаще всего, когда конструкция select не содержит блока else, следует задаться вопросом, является ли такая ситуация результатом тщательного анализа либо, наоборот, банального упущения. Предположение о том, что блок else никогда не будет выполнен, в большинстве случаев не оправдывается.
5.3 Оператор Оператор for применяется для повторения некоторого действия заданное число раз. Чаще всего используется числовой счетчик, пробегающий ряд значений.
В конце этого раздела мы увидим, что цикл for является гораздо более универсальным и позволяет проводить итерации по элементам матрицы произвольного типа.
Следующий фрагмент печатает значения i от 1 до 5:
В результате в консоль будет выведено:
Использование оператора ”:” для генерации вектора [1 2 3 4 5] было рассмотрено в разделе 4.6. Запись 1:5 в приведенном примере создает матрицу, содержащую пять вещественных значений:
Стоит еще раз подчеркнуть, что в данном случае матрица 1:5 содержит вещественные значения. Поэтому переменная-счетчик i также является вещественной. К этому вопросу мы вернемся позже в данном разделе, рассматривая общую форму записи цикла for.
Используя более общую форму записи оператора ”:”, можно вывести только нечетные числа в интервале от 1 до 5. Для этого, очевидно, в качестве шага необходимо задать значение 2:
В результате выполнения этого алгоритма в консоли будут отображены строки:
Оператор ”:” можно также использовать для перебора значений счетчика в порядке убывания. Следующий фрагмент отображает числа от 5 до 1 в порядке убывания:
В консоль, как и следовало ожидать, будет выведено:
Действительно, инструкция 5:-1:1 возвращает вектор значений от 5 до 1 в порядке убывания:
Как уже говорилось, цикл for является гораздо более универсальным, позволяя перебирать значения различных типов, в том числе матриц и списков.
В качестве элементов матриц могут выступать вещественные и целые числа, строки и полиномы.
В следующем примере цикл for используется для перебора элементов векторастроки, содержащего вещественные значения (1.5, e, ):
В результате в консоли будет отображено:
Хотелось бы еще раз обратить внимание читателей на нежелательность использования циклов в Scilab. Всякий раз, когда возникает такое намерение, следует выяснить, не существует ли подходящей векторизованной функции, выполняющей требуемые действия. Различие в скорости выполнения пользовательских циклов и встроенных функций может достигать 10-100 раз, поэтому при наличии такой функции предпочтение должно быть отдано ей. Цикл for следует использовать лишь в тех редких случаях, когда подходящей векторизованной функции найти не удается.
5.4 Оператор Оператор while предназначен для повторения некоторого блока инструкций до тех пор, пока условие цикла остается истинным. Проверка условия выполняется перед каждой (в том числе первой) итерацией. В определенный момент условие повторения обращается в ложь и цикл завершается. Заметим, что для корректного завершения цикла необходимо, чтобы в теле цикла каким-либо образом изменялись переменные, входящие в условие продолжения, так чтобы в какой-то момент значение этого выражения изменилось бы с истинного на ложное1.
Следующий фрагмент демонстрирует применение цикла while для подсчета суммы чисел от 1 до 10:
Все сказанное в предыдущем разделе о недостатках цикла for в равной степени относится и к while. Поэтому векторизованные вычисления также предпочтительны по сравнению с написанием собственных алгоритмов, использующих while.
Инструкция break позволяет прервать выполнение цикла. Обычно она применяется для выхода из цикла при достижении определенного условия, делающего его продолжение бессмысленным.
Следующий фрагмент демонстрирует использование инструкции break для вычисления суммы чисел от 1 до 10. При достижении переменной i значения, превышающего 10, цикл завершается:
1 Исключение составляют ситуации с использованием инструкции break, речь о которой пойдет в разделе 5.5.
После выполнения данного алгоритма значения переменных s и i равны:
Инструкция continue позволяет немедленно перейти к выполнению следующей итерации, пропустив команды, следующие после continue в теле цикла.
Встретив команду continue, интерпретатор Scilab переходит к заголовку цикла, проверяет условие продолжения, и, если оно истинно, делает следующую итерацию.
Следующий пример демонстрирует вычисление суммы s = 1 + 3 + 5 + 7 + 9 = 25. Используемая здесь функция modulo(i,2) возвращает 0 при условии, что i четно. В данном случае скрипт наращивает значение i и использует инструкцию continue для перехода к следующей итерации:
Значения переменных s и i после выполнения данного скрипта равны Тот же результат можно получить, используя единственную команду sum в сочетании с оператором ”:”, что является примером векторизованных вычислений в Scilab:
Использование высокоуровневой функции (в данном случае sum) имеет ряд преимуществ перед эквивалентным ей с точки зрения результата циклом на основе while:
1. Высокоуровневая запись короче, а значит проще для понимания человеком.
2. Для матриц значительной размерности высокоуровневые операции выполняются намного быстрее, чем алгоритмы на основе циклов.
Поэтому необходимо внимательно изучить доступные в Scilab функции перед тем, как писать собственный алгоритм с использованием while.
6 Функции Данный раздел посвящен функциям в Scilab. Здесь мы рассмотрим вопросы определения собственных функций и их загрузки в Scilab, научимся создавать библитеки, представляющие собой наборы функций. Поскольку большая часть возможностей Scilab реализована в виде функций, мы увидим, как исследовать свойства той или иной функции. Также будет рассмотрена работа со входными и выходными аргументами. Наконец, мы обсудим возможности отладки функций с использованием инструкции pause.
6.1 Обзор Выделение последовательности инструкций в отдельную функцию, пригодную для повторного использования, является одной из наиболее распространенных задач при работе со Scilab.
Простейший синтаксис вызова функции выглядит следующим образом:
outvar = myfunction ( invar ) Значение каждого из трех элементов вызова функции приведено в списке:
• myfunction представляет собой наименование вызываемой функции, • invar обозначает входные аргументы, • outvar соответствует выходным аргументам.
Значения переменных, указанных при вызове в качестве фактических параметров, функция изменить не может.
Мы уже имели дело со многими функциями на протяжении данного руководства. Например, функция sin в составе команды y=sin(x) принимает входной аргумент x и помещает результат вычисления в переменную y. В соответствии с терминологией Scilab входные аргументы называются правосторонними, а выходные - левосторонними.
Количество входных и выходных аргументов функции не ограничено. Синтаксис вызова функции с фиксированным числом аргументов таков:
Список входных аргументов ограничивается круглыми скобками, а выходных - квадратными. Названия переменных в списках отделяются друг от друга запятыми ”,”.
Следующий фрагмент демонстрирует выполнение LU-разложения матрицы Гильберта. Для начала матрица генерируется с использованием функции testmatrix, принимающей два входных аргумента: тип матрицы и ее порядок.
Созданную матрицу мы передаем функции lu, которая возвращает две или три матрицы в зависимости от заданного пользователем количества выходных аргументов. Если аргументов три, в качестве последнего возвращается матрица перестановок P:
-->A = testmatrix ( " hilb ", 2) Как мы могли убедиться, поведение функции lu зависит от числа выходных аргументов: во втором случае строки матрицы L меняются местами. Говоря точнее, при двух выходных аргументах выполняется разложение A = LU (команда A-L*U позволяет проверить корректность результата), а при трех - разложение P A = LU с матрицей перестановой P (в чем можно убедиться, выполнив команду P*A-L*U). Таким образом, функция lu выбирает соответствующий алгоритм в зависимости от количества переданных ей параметров. Scilab предоставляет также возможность определения функций с переменным числом аргументов, однако этот вопрос выходит за рамки данного руководства.
Инструкции Scilab, предназначенные для работы с функциями, приведены в табл. 19. В последующих разделах наиболее часто используемые из них будут рассмотрены подробно.
6.2 Создание собственной функции Для определения новой функции используются ключевые слова function и endfunction. В следующем примере мы создаем функцию myfunction, которая принимает единственный параметр x, умножает его значение на 2 и возвращает результат в качестве выходного параметра y:
function y = myfunction ( x ) endfunction Строка function y = myfunction ( x ) представляет собой заголовок функции, в то время как тело функции содержит единственную инструкцию y = * x. В общем случае тело функции может включать произвольное число команд.
В Scilab существует, по меньшей мере, три способа определить такую функцию:
function открывает определение функции endfunction завершает определение функции argn количество входных и выходных аргументов в данном вызове функции varargin вектор, представляющий переменное число входных varargout вектор, представляющий переменное число выходных аргументов функции fun2string генерирует текстовое определение (исходный код) get_function_path возвращает путь к файлу исходного кода функции getd отображает полный список функций, определения head_comments отображает комментарии к функции listfunctions отображает свойства функций, которые вызывались macrovar возвращает списки входных и выходных параметров функции, а также используемых в теле функции внешних переменных, вызовов других функций и локальных переменных Таблица 19. Ключевые слова и инструкции Scilab, использующиеся при работе с функциями.
• Во-первых, можно ввести тело функции непосредственно в консоли Scilab, инструкция за инструкцией. Встретив запись наподобие function y = myfunction ( x ), интерпретатор переходит в режим ожидания тела функции. Завершается ввод командой endfunction, после чего Scilab возвращается в обычный режим.
• Более удобным вариантом является определение функции в отдельном файле. Этот способ применяется в большинстве случаев. Для того чтобы загрузить заданную таким образом функцию, можно скопировать содержимое файла в консоль (удобно если определение функции содержит всего несколько строк) либо воспользоваться командой Загрузить в Scilab (Load into Scilab) в меню Scilab.
• Также для загрузки функции можно использовать команду exec. Предположим, что определение функции размещается в файле C:\myscripts\ examples-functions.sce. Для загрузки применяется команда exec, как показано в следующем фрагменте:
--> exec ( " C :\ myscripts \ examples - functions. sce " ) Функция exec предназначена для исполнения инструкций, содержащихся в некотором файле, так, как если бы они вводились непосредственно в консоли Scilab. При этом в консоли отображается каждая строка алгоритма. Если файл содержит большое число команд, отображение каждой из них может оказаться нежелательным. Чтобы этого избежать, после инструкции exec необходимо поставить ”;”:
--> exec ( " C :\ myscripts \ examples - functions. sce " );
Того же результата можно добиться, выбрав пункт меню Выполнить файл в Scilab (Execute file into Scilab).
После того как функция создана, ее можно использовать подобно любой другой команде Scilab:
--> exec ( " C :\ myscripts \ examples - functions. sce " );
Заметим, что присвоение выходному аргументу y значения (в данном случае y=2*x) является обязательным. Для того чтобы убедиться в этом, рассмотрим следующий пример, где значение присваивается переменной z, а не выходному параметру y:
function y = myfunction ( x ) endfunction Попытаемся теперь вызвать эту функцию, передав ей значение 1:
Undefined variable : y Интерпретатор Scilab сообщает нам об ошибке, поскольку переменная y не была инициализирована в теле функции.
При решении некоторой задачи часто возникает потребность в определении более чем одной функции. Например, при выполнении оптимизации с использованием функции optim нам, во-первых, требуется задать целевую функцию в соответствии с форматом, которого ожидает optim, а во-вторых - определить функцию-исполнитель, которая будет вызывать optim с требуемыми параметрами. В данном случае необходимы всего две функции, однако на практике для решения задачи может потребоваться и несколько десятков функций. В этом случае будет разумным объединить функции в библиотеку, как показано в следующем разделе.
6.3 Библиотеки функций Библиотека представляет собой набор функций, написанных на языке Scilab и хранящихся в отдельных файлах.
Если набор функций невелик и не содержит файлов справки или исходных текстов на компилируемых языках (таких как C/C++ или Fortran), объединение их в библиотеку является весьма удачным вариантом, в противном случае следует задуматься о создании модуля. Разработка собственного модуля не представляет трудностей, однако требует более детального знакомства с внутренним устройством пакета Scilab. Кроме того, модули также имеют в своей основе библиотеки, поэтому для создания первых требуется понимание работы последних. Тем не менее, построение собственного модуля выходит за рамки настоящего руководства. Во многих практических ситуациях создание библиотеки является достаточным для организации набора функций.
В этом разделе рассматривается создание простой библиотеки функций Scilab, а также способы ее автоматической загрузки при запуске пакета.
Предположим, что имеется несколько файлов.sci, содержащих определения функций на языке Scilab. Последовательность действий в этом случае такова:
1. Создать бинарные версии функций, используя команду genlib. Функция genlib помимо прочего генерирует индексные файлы.
2. Загрузить библиотеку в Scilab, для чего используется функция lib.
Перед тем как приступить к рассмотрению примера, необходимо обозначить основные правила создания библиотек функций в Scilab:
• Файлы, содержащие определения функций, должны иметь расширение.sci. Строго говоря, это требование не является обязательным, но помогает при поиске скриптов Scilab на жестком диске компьютера.
genlib создает библиотеку из функций, определения которых расположены в заданном каталоге lib загружает библиотеку Таблица 20. Инструкции Scilab для работы с библиотеками функций.