В соответствии с синтаксисом Scilab описание функции с использованием deffдолжно располагаться в одной строке командного кода, поэтому назовем ее однострочной функцией.Начинается описание с ключевого слова deffи имеет следующий формат:
deff ('[y1,…, yn]=ИмяФункции(x1,…, xk)','y1 =Выражение1,…,yn=Выражениеn '),
где: x1,…,xk – СписокВходныхФормальныхПараметров;
y1,…,yn – СписокВыходныхФормальныхПараметров (для одного выходного параметра квадратные скобки необязательны);
Выражение1,…,Выражениеn – список выражений, по которым определяются выходные параметры функции.
Если описание функции не умещается в одной строке экрана, то ее можно перенести, используя символы переноса – три точка (…).
Параметры передаются системе в виде строк, которые затем разбиваются на лексемы и из которых Scilab строит однострочную функцию.
При описании функции deff в выражениях для вычисления выходных параметров могут использоваться не только входные параметры функции, но и выходные параметры, вычисленные в предыдущих выражениях этой функции, а также переменные, определенные в Командном окне.
Обращение к функции, описанной с помощью deff, производиться из программного кода:
[z1,…,zn]=ИмяФункции(p1,…,pk)
[z1,…,zn]= ИмяФункции(p1,…,pk);,
где: p1,…,pk – СписокВходныхФактическихПараметров функции;
z1,…,zn– СписокВыходныхФактическихПараметров (для одного
выходного параметра квадратные скобки необязательны).
В первом случае на экран выводятся значения всех выходных параметров (причем вывод начинается с последнего), а во втором – вывод значений параметров гасится точкой с запятой, но в переменных z1,…,zn сохраняются все вычисленные значения выходных параметров.
Если вызов функции осуществляется без указания имен выходных параметров (ИмяФункции(p1,…,pk)), то результат отображается в переменной ans, значение которой равно значению последнего выходного параметра. Именно поэтому такое обращение к функции рекомендуется применять к функции только с одним выходным параметром. Обращение по имени функции можно использовать не только при выводе результата, но в записи арифметических выражений внутри его описания (рис.1.2.6.1).
--> // Использование deff для описания функции --> // с одним выходным параметр ом --> --> deff('y = f1(x1, x2)','y = sin(x1) + a * x2'); --> --> a = 2; //Определение переменной a, используемой в выражении функции --> r = f1(2, 3)//Обращение к функции f1 r = 6.9092974 --> --> f1(2, 3) // Обращение к функции f1 ans = 6.9092974 --> --> d = 1 + f1(2,3) // или d=1+ans d = 7.9092974 |
--> // Использование deff для описания функции --> // с двумя выходными параметрами --> --> deff('[y1, y2] = ff1(x1, x2)', 'y1 = sin(x1) + x2; y2 = cos(x2) + y1'); --> --> [z1, z2] = ff1(2, 3) // Обращение к функции f2 в командной строке z2 = 2.9193049 z1 = 3.9092974 --> --> z = z1 + z2 // Использование результатов выполнения функции z = 6.8286024 --> --> ff1(2, 3) // В ans сохраняется значение первого выходного параметра ans = 3.9092974 |
Рис. 1.2.6-1 Использование deff для описания однострочной функции
пользователя в Командном окне
Function – Описание и вызов многострочной функции
Второй способ описания функций в Командном окне начинается со слова function, а заканчивается словом endfunction (или end). В этом случае описание функции имеет следующий формат:
Function [y1,…, yn]=ИмяФункции(x1,…, xk)
ТелоФункции
…
y 1=Выражение1;
...
yn=Выражение n ;
…
Endfunction
где: x1,…,xk – СписокВходныхФормальныхПараметров функции (если функция не имеет входных параметров, тогда после имени функции указываются пустые скобки);
y1,…,yn – СписокВыходныхФормальныхПараметров(для одного выходного параметра квадратные скобки необязательны);
ТелоФункции – команды, операторы и библиотечные функции, необходимые для вычисления выходных параметров. Если вычисленные результаты должны быть в ходе выполнения функции (или ее отладки) отображены в
Командном окне, то символ точка с запятой в конце операторов отсутствует, иначе вывод результата гасится символом точки с запятой. Ввод каждой строки ТелаФункции осуществляется последовательно и завершается нажатием клавиши <Enter>, а ввод всех строк ТелаФункции считается незавершенным до тех пор, пока не будет введено ключевое слово endfunction (или end).
ИмяФункции формируется аналогично имени переменной и должно быть в данном сеансе работы уникально. Если имя функции уже было использовано, то выводится сообщение:«Предупреждение: переопределение функции:… » с указанием имени переопределенной функции.
Поскольку в Командном окне все строки выполняются последовательно, то очевидно, что описание функции должно предшествовать первому обращению к этой функции.
Правила обращения к функциям, описанных с помощью deff и function, полностью идентичны (Рис.1.2.6-2).
--> // Описание function для функции с одним выходным параметром --> function y =f2(x1, x2) > y = sin(x1) + a * x2; > end --> --> a = 2; // Определение переменной a, используемой в выражении функции --> r = f2(2, 3) // Обращение к функцииf2в Командной строке r = 6.9092974 --> --> f2(2, 3) //Обращение к функции f2 ans = 6.9092974 --> --> d = 1 + f2(2, 3) // или d=1+ans d = 7.9092974 --> |
--> // Описание function для функции ff 2 с двумя выходными параметрами --> function [y1, y2] = ff2(x1, x2) > y1 = sin(x1) + x2; > y2 = cos(x2) + y1; >end --> --> [z1, z2] = ff2(2, 3) // Обращение к функции f f2 z2 = 2.9193049 z1 = 3.9092974 --> z = z1 + z2 // Использование результатов выполнения функции z = 6.8286024 --> --> ff2(2, 3)// В ans сохраняется значение только первого выходного параметра ans = 3.9092974 |
Рис. 1.2.6-2 Использование function в Командном окне
Как видно из приведенных примеров (рис.1.2.6-1 и 1.2.6-2), использование для описания в deff и function позволило получить одинаковые результаты.
В каких же случаях для описания функции пользователя целесообразно использовать deff, а в каких function?
Описание функции с помощью deff используется, как правило, если функция имеет один или два выходных параметра, а выражения для их вычислений достаточно короткие. В противном случае описание функции либо полностью не видно в Командном окне, либо строка должна быть перенесена с использованием символов три точки (…), что затрудняет чтение и контроль за правильностью ввода. Громоздкие выражения принято вычислять по частям, но тогдадля вычисления значения одного выходного параметра требуется не один, а несколько операторов, что не соответствует формату описания функции с помощью deff. Описание функции с помощью function в данном случае предпочтительнее, поскольку оно может занимать несколько строк.
Наряду с рассмотренными выше способами создания внутренних встраиваемых функций пользователя в Командном окне, в Scilab имеется возможность создания функций с использованием текстового редактора SciNotes, который позволяет сохранить содержимое его окна в виде sce -файла. В этом случае сохраненный файл можно многократно подключать и использовать в других сеансах работы. Подробнее материал о создании и работе со sce -файлами, а также о средствах программирования в среде Scilab, будет изложен в п. 1.5.
Рассмотрим несколько простейших задач по ТЭЦ.
Заданы: катушка с резистивным сопротивлением R =10 Ом, индуктивностью L =0.05 Гн подключена к источнику ЭДС E =120 В с частотой f =50 Гц. Определить комплексный ток Iв данной последовательной RL-цепи (рис. 1.2.6-3).
// Определение комплексного тока в // последовательной RL-цепи // Исходные данные R=10;// Сопротивление в Ом L=0.05; // Индуктивность в Гн E=120;// ЭДС в В F=50;// Частота, Гц W=2*%pi*f;// Угловая частота в рад/с XL=w*L;// Индуктивное сопротивление в Ом Z=R+%i*XL;// Комплексная сопротивление в Ом I=E./Z; // ТоК в RL=цепи в А Imod=abs(I);// Модуль тока в А // Фазатокавградус arg_I=atan(imag(I),real(I))*180/%pi; mprintf( I=3.4608053 - 5.4362202i Imod=6.4443513 arg_I=-57.518363 |
Рис. 1.2.6-3. Определение комплексного токапоследовательнойRL-цепи
Резистивное сопротивление R =10 Ом и катушка с индуктивностью L =0,05 Гн параллельно подключены к источнику ЭДС E =120 В с частотой f=50 Гц. Рис. 1.2.6-3. Определение комплексного токав RL-цепи (рис. 1.2.6-4).
// Определение комплексного тока в // параллельнойRL-цепи // Исходные данные R=10; // Сопротивление, Ом L=0.05; // Индуктивность, Гн E=120; // ЭДС, В f=50; // Частота, Гц w=2*%pi*f; // Угловая частота, рад/с XL=w*L;// Индуктивное сопротивление, Ом BL=1/XL; // Проводимость катушки, См G=1/R; // Проводимость резистора, См Y=G-%i*BL; // Общая комплексная проводимость, См I=E*Y//То в RL=цепи, А Imod=abs(I)// Модультока, А // Фазатока, градус arg_I=atan(imag(I),real(I))*180/%pi mprintf( I =12. -7.6394373i Imod = 14.225365 arg_I=-32.481637 |
Рис. 1.2.6-4. Определение комплексного токав параллельнойRL-цепи
1.2.7. Контрольные вопросы
1) Какие объекты Scilab Вам известны?
2) Как называются символы ., : ; () [] {} // % $ ' " ~= и в каково их назначение в Scilab?
3) Что означает в Scilab «определить данные»?
4) Какой символ служит для переноса части командной строки на следующую строку?
5) Для чего используются системные встроенные функции: whos , who , who _ user , typeof , typeи clear?
6) Как в Scilab представлены комплексные числа?
7) Какие системные константы Вам известны?
8) Из каких элементов строятся числовые арифметические выражения?
9) Каков приоритет действий в арифметических выражениях?
10) Какой символ используется для запрета вывода результата вычислений на экран?
11) Какие типы переменных используются в Scilab?
12) Чем характеризуются матрицы?
13) Как создать вектор-строку?
14) Как создать вектор-столбец?
15) Какая функция служит для определения длины вектора?
16) Каким образом создать вектор с постоянным шагом?
17) Требуется ли при работе с векторами и матрицами предварительное объявление их размера?
18) Какой символ используются для разделения элементов матрицы в строке, а какой для разделения ее строк?
19) Какие команды предназначены для заполнения матрицы случайными числами, распределенными по равномерному или нормальному закону распределения?
20) Формат команд выбора минимального и максимального значения элемента матрицы.
21) Как записать выражение для решения матричных уравнений?
22) Какие поэлементные матричные операции Вам известны?
23) Как происходит преобразование данных к арифметическому типу?
24) Из каких элементов состоят логические выражения?
25) Как представлены в Scilab строки символов?
26) Что такое форматированный вывод данных?
27) Для чего используется функция mprintf и каков ее формат?
28) Какие символы преобразования вам известны?
29) Что такое списки, структуры и ячейки в Scilab?
30) Какие типы функций пользователя используются в Scilab?
31) Как описываются и вызываются функции, описанные с использованием операторов deffиfunction?
1.3 Матри чные операции создания, доступа,
извлечения и модификации.
Векторизация и индексирование
Дата: 2019-11-01, просмотров: 883.