Scilab/Управление сеансом

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

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

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

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

Для начала запомните и попробуйте следующие горячие клавиши:

  1. Сначала нажмите <Ctrl>+<C>;
  2. Затем нажмите <Ctrl>+<X>.

Вы увидите такой результат

-->

Введите «resume» или «abort» для возврата на стандартный уровень командной строки.
-1->
-2->

Вы нажали комбинации, которые выполнили одно и то же действие — создали подуровень, т.е. как бы в одном сеансе вы открыли одновременно три. На каждом подуровне своя область памяти для хранения переменных. Данная система работает по принципу стека «первым вошёл, последним вышел». Это означает, что выход из подуровня очищает безвозвратно область памяти, выделенную на него.

Выполните следующее:

  1. Введите на втором подуровне выражение
    -2-> 2+2;
    
  2. Нажмите еще раз любую комбинацию, чтобы создать подуровень;
  3. Введите еще раз
    -3-> 2+2;
    

Теперь посмотрите в окно Обозреватель переменных и вы увидите, что «в мире» сосуществуют две переменные с одинаковым именем. Это происходит потому, что они не подозревают о существовании друг друга.

Чтобы подняться на уровень выше, необходимо ввести команду

resume

Если вы уверены, что подуровни вам больше не нужны, то удалить их можно все сразу командой

abort

после которой вы окажетесь на главном уровне с единственной областью памяти для переменных.

Данные подуровни созданы для упрощения работы со средой, в частности, чтобы не захламлять память неиспользуемыми переменными.

Вот вам пример использования многоуровневой работы. Допустим Основная задача содержит подзадачу, после решения которой вам нужен только результат. Решив подзадачу, вам требуется удалить всё, что от неё осталось. Считайте вам повезло, если для решения подзадачи вам понадобилась всего одна переменная, но если вы писали временные функции, использовали матрицы, векторы и прочее, вам потребуется время на очистку памяти.

Как же можно поступить? Решив подзадачу, вы всегда можете перенести нужные вам результаты на уровень выше, воспользовавшись командой resume. При этом за одну операцию вы не только переносите нужную вам информацию, но и очищаете память от переменных подзадачи.

Упражнение

Для начала удалите все подуровни, оставив только основной, командой abort. Положим, что нам нужно решить полиномиальное уравнение второго порядка, корни которого будут использованы для каких-либо решений. Отметим, что нам важен лишь результат и ничего больше.

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

 

  1. Для начала создадим два подуровня, с помощью одной из двух комбинаций клавиш.
  2. На втором подуровне вычислим дискриминант, введя
    -2-> D=4^2-4*2*-10;
    
  3. Теперь мы заберем результат на первый подуровень, а второй удалим. Для этого введите следующее
    -2-> D=resume(D)
    
    Отметим, что Вы попросили среду переместить значение D второго уровня в переменную D уровня выше, а всё остальное удалить. Так как пространство первого уровня пусто, то переменная D будет создана системой, но если бы это имя было занято, то переносимый результат был бы записан в уже имеющуюся переменную.
  4. На первом уровне рассчитаем корни, для чего введите
    -1-> x1=(-4+sqrt(D))/4, x2=(-4-sqrt(D))/4
    
    Обратите внимание на то, что мы ввели две команды за раз, разделив их запятой. Таким образом, мы нашли два вещественных корня, записав их соответственно в переменные x1 и x2.
  5. Дискриминант нам уже не нужен, а корни необходимо перенести на главный уровень. Чтобы перенести за раз больше одной переменной, необходимо переносимые переменные объединить в вектор. Введите следующую команду
    -1-> [x1, x2]=resume(x1, x2)
    
    . Обратите внимание на то, как объявляется вектор: в квадратные скобки помещаются переменные, разделяемые запятыми. В дальнейшем мы научимся их создавать и для математических целей.
  6. Мы решили нашу подзадачу, но правильно ли? Проведем проверку и заодно научимся ещё одному приёму. Введите следующую команду
    --> 2*x1^2+4*x1-10,..
    
    и нажмите клавишу <Enter>. Вы увидите, что командная строка создаст новую строку, но результат расчёта не покажет. Дело в том, что ввод команды ещё не завершен: введя две точки в конце команды вы даёте указание создать новую строчку и продолжить ввод команды. После того, как вы завершите ввод, интерпретатор проигнорирует эти точки и слепит всё в единую команду. Этот приём используется, когда вам за один раз необходимо ввести много длинных и несвязанных между собой команд. После создания строчки введите вторую команду
    --> 2*x2^2+4*x2-10
    
    и нажмите клавишу <Enter>
Вы увидите следующее
--> 2*x1^2+4*x1-10,..
--> 2*x2^2+4*x2-10
ans =
    -1.776D-15
ans =
    -3.553D-15
Очевидно, что мы правильно рассчитали корни с двойной точностью. Отметим, что команды выполнились последовательно и результат последней команды записался в переменную ans.

Теперь углубимся. Нажимая сочетания клавиш <Ctrl>+<X> или <Ctrl>+<C> вы на самом деле вызывали функцию

pause

. Новый подуровень не запрещает вам пользоваться уже созданными переменными. Например, вы можете воспользоваться полученными корнями на новом уровне при этом не меняя имя переменной. Создавая подуровень вы защищаете уже полученные результаты.

Например, попробуйте ввести

--> pause
-1-> x1=x1+3;

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

Не менее полезными будут следующие приёмы работы с текущей строкой:

  • Нажимая кнопки со стрелками «вверх» и «вниз», вы перемещаетесь по истории введенных вами команд;
  • После нажатия кнопки <End>, курсор мгновенно переносится в конец строки, кнопка <Home> перемещает курсор в начало строки;
  • Нажимая комбинацию <Ctrl>+<Стрелка вправо> или <Стрелка влево>, вы мгновенно можете перемещать курсор между законченными частями выражения в строке: например, в выражении 235 + 458, если курсор находится слева, комбинация <Ctrl>+<Стрелка вправо> сначала переместит курсор за цифру 5, потом за знак '+' и, наконец, за цифру 8;
  • Нажимая комбинацию <Ctrl>+<Shift>+<Стрела вправо> или <Стрелка влево>, вы можете быстро выделять законченные части выражения в строке;
  • Если в строке выделен фрагмент введенного выражения, то комбинация <Ctrl>+<C> работает как команда «Скопировать», комбинация <Ctrl>+<V> — «Вставить».

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

  • tohome — поднимает курсор так, чтобы скрыть все введенные команды вместе с результатами, при этом не удаляя их из командного окна. Можно воспользоваться ползунком окна, чтобы снова их увидеть;
  • clc — удаляет все содержимое в командном окне. После очистки вернуть результаты невозможно. Если вы передадите в качестве аргумента число, например clc(5), то команда удалит это число строчек выше курсора.

Мы познакомились с основными приёмами работы с командной строкой. Теперь рассмотрим наиболее важные функции по конфигурированию среды.

Конфигурация среды

править

Под конфигурированием среды мы будем понимать доступные пользователю настройки.

Правила записи выражений

править

Данный раздел написан для начинающих пользователей, которые сталкиваются с проблемами ввода математических выражений в строчку. Этот раздел можно пропустить опытным пользователям математических пакетов, так как следующая информация тривиальна и не несёт в себе ничего нового.

Для начала запомните следующие правила, которыми руководствуется интерпретатор:

  • Любое выражение читается интерпретатором слева на право;
  • В выражении можно выделить операнды (объекты над которыми производятся действия, или которые участвуют в действии над другими операндами) и операторы (инструкции, которыми руководствуется интерпретатор, когда выполняет действия).

Операторы бывают унарными, когда инструкция направлена на один операнд, и бинарными, когда инструкция направлена на два операнда.

Основные операторы, которые используются для записи математических выражений, вы уже можете знать:

Бинарные
' * ' — оператор умножения;
' / ' — оператор правого деления, т.е. когда левый операнд делится на правый;
' \ ' — оператор левого деления, т.е. когда правый операнд делится на левый;
' + ' — оператор сложения;
' — ' — оператор вычитания;
' = ' — оператор присваивания;
' ^ ' — оператор возведения в степень
' & ' — конъюнкция (логическое И);
' | ' — дизъюнкция (логическое ИЛИ);
' == ' — логическое равно;
' <> ' — логическое не равно;
' > ', ' >= ' — логические «больше» и «больше или равно»;
' < ', ' <= ' — логические «меньше» и «меньше или равно»;
Унарные
' ~ ' — инверсия (логическое НЕ);
" ' " — транспонирование матрицы

Примечание: заметим, что у некоторых операторов могут быть псевдонимы, например, логические операции можно выполнить через вызовы функций or(), and() и not().

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

В любом случае при выполнении операции присваивания:

  • адресат должен стоять по левую часть от оператора.

Каждый оператор имеет собственный приоритет и выполняется в соответствии с ним. Внизу представлена иерархия операторов, которые были представлены выше.

Уровень приоритета Оператор
1 (), [ ], ' ^ '
3 ' * ', ' / '
4 ' + ', ' — '
14 ' = '

Вы наверное спросите, почему в таблице приведены не все уровни. Данная таблица вырвана из контекста и в ней нарочно приведены не все уровни, чтобы не перегружать читателя лишней информацией.

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

Приведем поучительные примеры. Введите в командной строке

--> 2+2*3
ans =
    8.
--> 6/2*4
ans =
    12.
--> 2+2*3+3
ans =
    11.
--> 2+3^2*2
ans =
    20.

Разберем все примеры по очереди. В первом случае интерпретатор проходя слева на право, согласно таблице приоритетов, выполняет операцию умножения (результат 6), к которому прибавляет двойку (в результате 8). Во втором случае, так как операторы умножения и деления на одном уровне, интерпретатор сначала выполнит операцию деления, потому что он стоит левее, а затем умножения.

В третьем случае интерпретатор выполнит сначала умножение, затем снова начнет с левого края и прибавит двойку к результату. В конце он прибавит тройку.

В четвертом случае интерпретатор сначала возведет тройку в квадрат, так как возведение в степень имеет самый высокий приоритет, затем результат помножит на два и в конце прибавит двойку.

Теперь во втором примере изменим приоритет вычислений, выполнив сначала умножение, а затем деление

--> 6/(2*4)
ans=
     0.75

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

Вещественные числа могут быть введены в командную строку двумя способами: десятичная дробь и экспоненциальный формат. В десятичной дроби целая и дробная части всегда отделяются друг от друга точкой.

В экспоненциальном формате число имеет вид

 

В этой записи M — это мантисса числа; E (также можно использовать символ 'D') кодирует запись «умножить на десять в»; p — порядок числа. Таким образом, следующие записи для одного числа эквивалентны

 

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

На данном этапе вам достаточно знать элементарные математические функции, которые используются для записи математических выражений.

  • sin(x) — синус числа x
  • cos(x) — косинус числа x
  • tan(x) — тангенс числа x
  • cotg(x) — котангенс числа x
  • asin(x) — арксинус числа x
  • acos(x) — арккосинус числа x
  • atan(x) — арктангенс числа х
  • sqrt(x) — квадратный корень числа x
  • exp(x) — экспонента числа х

Отметим также, что в среде существует несколько синтаксических конструкций, которые могут применяться при вызове одной и той же функции. Использование той или иной конструкции регламентируется внутри функции и обычно указывается в справочной информации.

  • В первом варианте достаточно обратиться к функции по имени. Если функция не требует обязательных аргументов, то скобки можно опускать.
function или function()
  • Заметим, что в среде Scilab может быть реализована, так называемая перегрузка, когда для одной функции могут быть предопределены различные варианты поведения в зависимости от передаваемых параметров или аргументов. Во втором варианте функция имеет хотя бы один обязательный аргумент.
function(arguments)
  • Третий вариант является по сути вариацией второго, но аргументы имеют специальные пометки (параметры или флаги), указывающие функции по какому сценарию обрабатывать аргументы
function -param_1 [arguments] -param_2 [arguments]

Комментарии

править

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

Для того, чтобы поставить комментарий, необходимо ввести два правых слэша, например,

// это мой комментарий

Комментарии можно оставлять и в командной строке, хотя это вообще говоря, бессмысленно. К сожалению, в Scilab отсутствуют многострочные комментарии.

Быстрый ввод функций

править

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

Для начала следует начать печатать имя функции, при этом достаточно даже одного первого символа. После этого следует нажать клавишу <Tab>. Рядом с курсором появится раскрывающийся список, в котором будут представлены функции с совпадающими символами. Вы можете продолжить ввод желаемой функции, при этом из списка автоматически будут выпадать несовпадающие пункты. Если вы заметили искому функцию, то выберите ее из списка с помощью стрелок и нажмите <Enter>.