![](/user_photo/_userpic.png)
Базовые средства матпакета Scilab
.pdf![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn51x1.jpg)
В каких же случаях для описания функции пользователя целесообразно использовать 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;
51
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn52x1.jpg)
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 Гц. Определение комплексного токав 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)Какие системные константы Вам известны?
52
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn53x1.jpg)
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?
53
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn54x1.jpg)
1.3 Матричные операции создания, доступа, извлечения и модификации.
Векторизация и индексирование
1.3.1. Представление данных в Scilab
Из предыдущих разделов известно, что математический пакет Scilab построен как программная система, ориентированная на работу с матрицами. Двумерная структура данных способна хранить данные различного типа. Это могут быть числа, символы, логические значения, полиномы, рациональные дроби и другие объекты. Scilab размещает матрицы всех типов данных в Рабочей области – оперативной памяти компьютера, по столбцам и отображает информацию об активных объектах текущей сессии в окне
Обозревателя переменных.
Из рис. 1.3.1-1, иллюстрирующем матричную структуру представления данных в Scilab, следует, что матрицы могут быть пустыми []; скалярными; векторными, состоящими из одной строки или одного столбца, называемыми соответственно вектор-строкой или вектор-столбцом; квадратными и прямоугольными, а их элементы могут быть объектами практически любыхтипов данных, допустимыхвсистеме Scilab.
Рис. 1.3.1-1 Представление данных в Scilab
При работе с матрицами в матрично-ориентированных программных системах необходимо понимать, как можно создавать различные типы матриц и осуществлять доступ к ее элементам, и знать правила матричных операций и функций.
54
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn55x1.jpg)
1.3.2. Создание векторов и матриц
Способы создания векторов и матриц
Под созданием матриц понимают создание матриц определенного размера, структуры и содержания (присвоение ее элементам соответствующих значений заданного типа, в том числе и пустых матриц).
Напомним еще раз, что прежде чем выполнять операции с матрицами и их элементами, необходимо создать и присвоить элементам матрицы значения допустимого типа.
ВScilab реализовано несколько различных способов создания векторов
иматриц:
с помощью операции квадратные скобки (операция конструирования - []);
с помощью соответствующих встроенных функций;
путем объединения уже существующих матриц;
с помощью операции двоеточие (:).
Создание векторов и матриц с помощью операции – []
При создании векторов с помощью операции конструирования,
квадратные скобки используют совместно с операцией присваивания (=). При этом значения элементов векторов, заключенные в [], отделяются друг от друга символами:
точкой с запятой, если нужно создать вектор-столбец;
пробелом или запятой, если нужно создать вектор-строку.
На рис. 1.3.2-1. приведено несколько примеров создания векторов с помощью операции [].
--> // Примеры создания векторов с помощью операции []
-->
--> // Пример1. Создание вектор-строки av из 4-х элементов
--> av = [2 4 -7 5] av =
2. 4. -7. 5. -->
--> // Пример2. Создание вектор-столбца bv из 3-х элементов
--> bv = [0; 3 ;5] bv =
0.
3.
55
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn56x1.jpg)
5. -->
--> // Пример3. Создание вектор-столбца сv из 4-х элементов --> // и вектор-строки tv из 4-х элементов
--> cv = [4; 6; -3; 2]; length(cv) ans =
4.
--> tc = cv' tc =
4. 6. -3. 2.
Рис. 1.3.2-1. Примеры создания векторов с помощью операции []
В Примере3 для определения длины вектора использовалась функция length, а для транспонирования матрицы – апостроф (').
При создании матриц с помощью операции [] точно также, как и при создании векторов, необходимо сначала ввести имя матрицы и знак присваивания, а затем в квадратных скобках значения их элементов. При этом значения элементов строк записываются через пробел или запятую, а строки матрицы разделяются точкой с запятой, например, А=[v1;v2;v3], где v1, v2, v3 – вектора одинакового размера (рис.1.3.2-2). Если строки матрицы слишком длинные (Пример3), то ввод очередной строки матрицы можно перенести в следующую строку экрана, нажав после символа точки с запятой клавишу <Enter>.
В Примере1 создается матрица mA1(3,4), а в Примере2 пустая матрица 0×0. Матрица называется пустой, если она имеет число элементов равное нулю, хотя бы в одном измерении. В Примере3 показан ввод элементов матрицы в две строки.
--> // Примеры создания матриц –[]
--> --> // Пример1.Матрица 3х4
--> mA1 = [1 2 3 4;5 6 7 8; 9 10 11 12]
mA1 = |
|
|
|
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
11. |
12. |
--> --> // Пример2. Матрица 0×0
--> mA2 = [] mA2 =
[] -->
--> // Пример3. Ввод в две строки
-->B=[1.4444 2.78888 3.565555 -4.36789; > 6.4444 2.55555 6.32322 -4.8796]
B =
56
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn57x1.jpg)
1.4444 |
2.78888 |
3.565555 |
-4.36789 |
6.4444 |
2.55555 |
6.32322 |
-4.8796 |
Рис. 1.3.2-2. Примеры создания матриц с помощью операции []
Создание матриц с помощью встроенных функций
Для создания матриц определенного размера, структуры и содержания в Scilabможно использовать встроенные функции ones, zeros, eye, rand, repmat и некоторые другие, описанные в Приложении 1.3, табл.1.3.2-1.
Перечисленные выше функции имеют следующие назначения: ones– создает единичную матрицу; zeros –имеет те же форматы, что и функция ones, но создает матрицу, состоящую из нулей; eye –создает матрицу с единицами на главной диагонали; rand–создает матрицу чисел двойной точности со случайными вещественными или комплексными элементами;repmat –создает большую матрицу, состоящую из копий другой матрицы, заданной параметром.
Все перечисленные выше функции (кроме функции repmat) в зависимости от входных параметров, создают матрицы в соответствии с заданной размерностью (или того же размера), что и уже существующая матрица, указанная в параметрах.
Рассмотрим несколько примеров по созданию матриц с использованием описанных функций (рис. 1.3.2-3).
-->// Создание матриц с помощью функций
-->
-->A = ones(2, 2) // Матрицы, состоящей из 1
A=
1. 1.
1. 1. -->
-->B = zeros(2, 2)// Матрицы, состоящей из 0
B=
0. 0.
0.0.
-->
-->C = eye(A) // Матрицы в которой элементы -->// главной диагонали равны 1
C =
1.0.
0. 1. -->
-->r = rand(A) // Матрицы из случайных чисел
r=
0.7560439 0.3303271
0.2211 53811
--> |
|
|
|
|
|
-->D = repmat(1:3,2,2) |
|
|
|||
D = |
|
|
|
|
|
1. |
2. |
3. |
1. |
2. |
3. |
1. |
2. |
3. |
1. |
2. |
3. |
57
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn58x1.jpg)
-->
--> f = testmatrix('frk',3) // МатрицаFranck
f=
3.2. 1.
2.2. 1.
0.1. 1.
Рис. 1.3.2-3. Созданиеспециальных матрицы с помощью встроенных функций
Создание матриц путем объединения существующих
Новую матрицу можно создать ипутем объединения уже существующих матриц с помощью операции [] и соответствующих функций. В этом случае операция [] используется не только как конструктор матриц,
но |
и |
как |
операция |
объединения. Например, |
выражение |
c=[mA,mB] предполагает горизонтальное сцепление матриц |
mA и mB, а |
||||
mC=[mA;mB] их вертикальное объединение (рис. 1.3.2-4). |
|
--> // Примеры матриц, созданных путем |
объединения |
|||
--> |
|
|
|
|
--> // Пример1 |
|
|
|
|
--> ma = ones(2, 4) * 3; |
|
|
||
--> mb = rand(3, 4); |
|
|
||
-->mc = [ma; mb] |
|
|
||
mc |
= |
|
|
|
|
3. |
3. |
3. |
3. |
|
3. |
3. |
3. |
3. |
|
0.2113249 |
0.3303271 |
0.8497452 |
0.068374 |
|
0.7560439 |
0.6653811 |
0.685731 |
0.5608486 |
|
0.0002211 |
0.6283918 |
0.8782165 |
0.6623569 |
--> |
|
|
|
|
--> // Пример2 |
|
|
|
|
-->md = [5.36, 7.01, [], 9.44] |
|
|||
md |
= |
|
|
|
5.367.01 9.44 // Пустая матрица не влияет на формированияmd
Рис. 1.2.3-4 Примеры создания новых матриц путем объединения уже существующих
В Примере1 создается новая матрица mc из матриц ma и mb в вертикальном направлении, а в Примере2 создается новая матрица md из матриц ma и mb в горизонтальном направлении.
Кроме операции объединения в Scilab имеется встроенная функция cat, которая также позволяет объединить существующие матрицы для формирования новой матрицы. Функция cat возвращает матрицу, которая
58
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn59x1.jpg)
образуется путем сцепления двух или нескольких матриц, перечисленных в параметрах. Эта функция являются альтернативой операции [] для объединения матриц. С помощью этой функции можно построить новые матрицы вдоль заданного измерения (рис. 1.3.2-5).
-->// Сцепление по строкам и столбцам
-->
-->A = [1 2 3; 6 7 8]; B = [0 8 7; 3 2 1]; -->C = cat(1, A, B) // Сцепление по строкам
C=
1.2. 3.
6.7. 8.
0.8. 7.
3.2. 1.
--> // Сцепление по столбцам
--> C = cat(2, A, B) C =
1. 2. 3. 0. 8. 7.
6.7. 8. 3. 2. 1.
Рис. 1.2.3-5 Сцепление матриц по строкам и столбцам
Если матрицы объединяются по горизонтали, то они должны иметь одинаковое количество строк. Если матрицы объединяются по вертикали, то матрицы должны иметь одинаковое количество столбцов.
Создание матриц с помощью операции двоеточие – :
Создание векторов и матриц, элементы которых представляют собой некоторую последовательность значений, можно осуществить с помощью операции двоеточие –(:).
Операция двоеточия позволяет генерировать последовательность значений вектора или строки (столбца) матрицы от n до m (n:m). Причем в этой последовательности каждое последующее значение отличается от предыдущего на 1, даже если конечное значение не является точным значением
(Примеры1-6, рис. 1.3.2-6).
--> // Создание векторов и матриц с помощью – :
--> --> // Пример1
--> vA1 = 10:15 vA1 =
10. 11. 12. 13. 14. 15. --> --> // Пример2
-->vA2 = -2.5:2.5 vA2 =
59
![](/html/76326/137/html_ctVC1SAafF.e3oS/htmlconvd-ei0Swn60x1.jpg)
-2.5 |
-1.5 -0.5 0.5 1.5 2.5 |
|
|||||
--> |
|
|
|
|
|
|
|
--> // Пример3 |
|
|
|
||||
-->vA3 = 1:6.3 |
|
|
|
||||
vA3 |
|
= |
|
|
|
|
|
|
1. |
2. 3. 4. 5. |
6. |
|
|
||
--> |
|
|
|
|
|
|
|
-->//Пример4 |
|
|
|
|
|||
--> vA4=10:5:50 |
|
|
|
||||
vA4 = |
|
|
|
|
|
||
10. |
15. |
20. |
25. 30. 35. |
40. |
45. 50. |
||
--> |
|
|
|
|
|
|
|
--> //Пример5 |
|
|
|
||||
-->vA5 = 3:0.2:3.8 |
|
|
|||||
vA5 = |
|
|
|
|
|
|
|
|
3. |
|
3.2 |
3.4 |
3.6 |
3.8 |
|
--> |
|
|
|
|
|
|
|
--> // Пример6 |
|
|
|
||||
-->vA = 9:-1:1 |
|
|
|
||||
vA6 = |
|
|
|
|
|
|
|
9. |
8. |
7. 6. |
5. 4. 3. 2. 1. |
|
|||
--> |
|
|
|
|
|
|
|
-->//Пример7 |
|
|
|
|
|||
-->mA=[10:14;-2:2.5;1:5.3;5:-1:1] |
|||||||
mA |
= |
|
|
|
|
|
|
10.11. 12. 13. 14.
-2. |
-1. |
0. |
1. |
2. |
1. |
2. |
3. |
4. |
5. |
5.4. 3. 2. 1.
Рис. 1.3.2-6 Создание векторов и матриц с помощью операции двоеточие
Если шаг изменения последовательности значений отличается от 1, то необходимо указать значение шага h (n:h:m). Причем шаг может быть, как положительным, так и отрицательным. В Примере7 показано создание матрицы, элементы каждой строки которой генерируются в различных диапазонах и с разными шагами. Используя такой способ задания матриц, следует помнить, что в каждой строке матрицы должно быть одинаковое количество элементов. В случае ошибки система выводит сообщение:
«несовпадающие размеры строки/столбца».
Динамическое изменение размера матрицы
Матрицы могут динамически изменять свой размер в процессе выполнения программы с помощью функций matrix и resize_matrix. Это позволяет адаптировать размер уже созданной матрицы к тем данным, которые ей предстоит хранить (рис. 1.3.2-7).
60