Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебник Математические пакеты

.pdf
Скачиваний:
43
Добавлен:
23.12.2022
Размер:
6.39 Mб
Скачать

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

Арифметические операции и функции

Алгебраические операции (-, +, *, /, \, ^, ') в системе Scilab вы-

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

На рис. 1.2.2-2 приведены примеры использования алгебраических операций и функций над скалярами, векторами и матрицами.

--> // Алгебраические операции над векторами

--> V1 = [1 4 6

8]; V2 = [2 3 4 7]; // Создание векторов V1 и V2

-->

 

--> V = V1 + V2

// Вычисление суммы векторов

V=

3.7. 10. 15.

-->

--> U = V1^2

// Возведение в квадрат вектора V1

U=

1.16. 36. 64.

--> --> // Алгебраические операции над матрицами

--> mA = [1 2 3; -1 2 0; 3 2 4] mA =

 

1.

2.

3.

 

-1.

2.

0.

 

 

3.

2.

4.

 

-->

 

 

 

 

--> mB = [1 2; -2 1; 0 1];

 

--> mC = mA * mB

// Алгебраическое произведения матриц

mC

=

 

 

 

-3.

7.

 

 

-5.

0.

 

 

-1.

12.

 

 

-->

 

 

 

 

--> mP = mA^2

 

// Возведение матрицы в квадрат

mP

=

 

 

 

 

8.

12.

15.

 

-3.

2.

-3.

 

13.18. 25.

-->

d = det(mP)

// Определитель квадратной матрицы

d

=

 

 

64.

 

Рис.1.2.2-2 Примеры алгебраических операций и функций над векторами и матрицами

31

Список алгебраических операций над векторами и матрицами, а также функции det и trace, позволяющие вычислить определитель квадратной матрицы и след матрицы, приведены в табл.1.2.2-5, причем совместимость операндов в приведенных операциях определяется правилами соответствующих алгебраических операций. Матричные алгебраические операции следуют правилам линейной алгебры, а требуемый размер и форма операндов относительно друг друга, зависит от конкретной операции.

Алгебраические матричные операции и функции. Таблица 1.2.2-5

Операции

Назначение

 

Описания

 

и функции

 

 

 

 

 

+

Сложение

A + B складывает матрицы A и B.

 

 

 

 

 

 

 

+

Унарный плюс

+A возвращает A.

 

 

 

 

 

 

 

-

Вычитание

A - B вычитает B из A.

 

 

 

 

 

 

 

-

Унарный минус

-A меняет знакA.

 

 

 

 

 

 

 

*

Матричное

C = A * B – алгебраическое произведение мат-

 

 

умножение

риц A и B, при условии, что количество столб-

 

 

 

цов A равно числу строк B.

 

^

Матричное

A^B – возведение матрицы A в степень B, если B яв-

 

 

возведение в степень

ляется скаляром. Для других значений B вычисле-

 

 

 

ния включают собственные значения и собственные

 

 

 

вектора.

 

 

 

/

Деление матриц

X = B / A – решение уравнения X * A = B, при

 

 

слева направо

условии, что матрицы A и B имеют одинаковое коли-

 

 

 

чество столбцов. С точки зрения операций деления

 

 

 

слева и транспонирования

 

 

 

B / A = (A' \ B')'.

 

\

Обратное (справа

Х = A \ B – решение уравнения A * X = B, при

 

 

налево) деление

условии, что матрицы A и B имеют одинаковое коли-

 

 

матриц

чество строк.

 

 

 

'

Транспонирование

B = A' – комплексно-сопряженное транспонирова-

 

 

матрицы

ния матрицы A. Для комплексных матриц эта опера-

 

 

 

ция не предполагает сопряжения.

 

d = det(mA)

Вычисление

--> A = [3 2; 4 3];

 

 

определителя

--> det(A)

//Определитель матрицы

 

 

матрицы

ans = 1

 

 

 

t = trace(A)

Вычисление следа

--> A = [1 2 3; 4 -2 1; 0 3 -1]

 

 

матрицы, то есть

--> trace(A)

//СледматрицыА

 

 

суммы элементов

ans =

 

 

 

 

главной диагонали

-2

 

 

 

 

 

 

 

 

 

 

--> // то же что и

 

 

 

--> sum(diag(A))

 

 

 

 

 

ans =

 

 

 

 

 

-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

32

 

 

 

 

 

 

 

Рассмотрим пример решения матричного уравнения вида А∙Х=В или Х∙А=В, где Х – неизвестная матрица. Если умножить матричное уравнение на матрицу обратную к А, то оно примет вид: А-1А∙Х=А-1В или Х∙А∙А-1=В∙А-1. Так как А-1А=А∙А-1, а Е∙Х=Х∙Е=Х, то неизвестную матрицу Х можно вычислить так: Х=А-1 В или Х=В∙А-1. Понятно, что матричное уравнение имеет единственное решение если А и В – квадратные матрицы n-го порядка, а определитель матрицы А не равен нулю. Решив матричные уравнения А∙Х=В и Х∙A=B, выполним проверку. Решения матричных уравнений в Scilab показаны на рис. 1.2.2-3.

--> // Примеры решения матричных уравнений

--> A = [3 2; 4 3];

--> B = [1 7; 3 5]; -->

--> // Решение матричного уравнения A∙X=B

-->

X = A \ B

// Первый способ

X

=

 

 

-3.

11.

 

5.-13.

-->

--> X = inv(A) * B // Второй способ, использующий обратную матрицу

X =

-3. 11.

5.-13.

-->

 

 

--> А * X - B

// Проверка

ans

=

 

0.

0.

 

0.0.

-->

--> // Решение матричного уравнения X∙A=B

--> X = B / A

// Первый способ

X

=

 

 

 

-25.

19.

 

 

-11.

9.

 

-->

 

 

--> X = B * inv(A)

// Второй способ, использующий обратную матрицу

X

=

 

 

 

-25.

19.

 

 

-11.

9.

 

-->

 

 

--> X * A – B

// Проверка

ans

=

 

0.0.

0.0.

Рис. 1.2.2-3 Решение матричных уравнений

33

Поэлементные арифметические операции в системе Scilab, операции

с точкой (-, +, .*, ./, .\, .^, .') – это операции между элементами массивов.

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

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

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

Примеры некоторых операций над скалярными данными приведены на рис. 1.2.2-4, а над элементами матриц на рис. 1.2.2-5.

--> // Арифметические операции над скалярными данными

-->

--> a = 2.3; b = -14.654;

--> c = a .* b // Формат вывода результата по умолчанию c =

-33.7042

--> r = a ./ b r =

-0.1569537 -->

--> format(4) // Формат вывода результата с округлением

--> c = a * b c =

-34.

--> r1 = a / b r1 =

-0.2 -->

--> format(16) // Формат вывода результата с двойной точностью

--> c = a .* b c =

-33.7042

--> r1 = a / b r1 =

-0.1569537327692

Рис.1.2.2-4 Примеры арифметических поэлементных операций над скалярами данными (матрицами размерностью 1х1)

Список используемых арифметических операций над элементами матриц приведен в табл.1.2.2-6.

34

Арифметические поэлементные операции над матрицами. Таблица 1.2.2-6

Операция

Назначение

Описание

+

Сложение

A + B поэлементное сложение A и B

+

Унарный плюс

+A возвращает A

-

Вычитание

A - B поэлементное вычитание B из A

-

Унарный минус

-A поэлементное присвоение в A

.*

Поэлементное

C = A .* B поэлементное умножение A и B

 

умножение

 

.^

Поэлементное

A .^ B поэлементное возведение A в степень B

 

возведение в степень

 

.\

Поэлементное обратное

X = A .\ B – поэлементное обратное деле-

 

деление массивов

ние A и B

./

Поэлементное деление

X = B ./ A поэлементное деление A и B.

.'

Транспонирование мас-

A .' – поэлементная операция транспонирова-

 

сива

ния A

--> // Примеры арифметических поэлементных операций матрицами

--> --> // Арифметические поэлементные операции над векторами

--> vX = [1 4 6] vX =

1.4. 6.

--> z = (-vX.^2 + vX ./ 4) .\ 4 z =

-5.333333333 -0.266666667 -0.115942029 --> vX1 = -vX, vX1 .* vX

vX1 =

1. -4. -6. ans =

-1. -16. -36. -->

--> // Арифметические поэлементные операции над элементами матриц

--> M1 = [1 2 3; 3 2 1]; --> M2 = 3 .* M1

M2 =

3.6. 9.

9.6. 3.

--> M3 = M2 + M1.^2 M3 =

4.10. 18.

18.10. 4.

Рис.1.2.2-5 Примеры арифметических поэлементных операций над векторами и матрицами

35

Если при выполнении поэлементных операций требования к размеру или размерности матрицы не выполняются, то матрицы можно преобразовать к необходимому размеру с помощью специальных функций. Например, функция matrix позволяет изменить размеры вектора или матрицы, а функция resize_matrix выполняет обрезку или расширение матрицы. В Scilab имеются также функции, которые позволяют проверить число измерений (ndims) и размеры по каждому измерению аргументов (size). Описание перечисленных выше функций будет рассмотрено в п. 1.3.2.

Поэлементные математические функции, реализованные в Scilab, ис-

пользуются при проведении различного вида математических расчетов. Список наиболее часто используемых в математических расчетах функций, приведен в табл. 1.2.2-7.

Наиболее часто используемые математические функции. Таблица 1.2.2-7

Тригонометрические функции (аргумент задается в радианах)

sin, cos, tan, cot

Синус, косинус, тангенс и котангенс

sec, csc

Секанс, косеканс

 

 

asin,acos,atan,

Арксинус, арккосинус, арктангенс и арккотангенс

atan2, acot

 

asec, acsc

Арксеканс, арккосеканс

Алгебраические и арифметические функции

abs

Модуль

exp

Экспоненциальная функция

log, log2, log10

Логарифм натуральный, по основанию 2 и 10

sqrt

Квадратный корень

fix

Целая часть числа

floor

Округление до ближайшего целого значения, которое не

 

превышает аргумент

mod(x, y), rem(x, y)

Остаток от деления x на y. Целая часть определяется со-

 

ответственно функциями floor и fix

sign

Знак числа

factorial

Вычисление факториала числа

Гиперболические функции

sinh, cosh, tanh, coth

Гиперболические синус, косинус, тангенс и котангенс

sech, csch

Гиперболические секанс и косеканс

asinh, acosh, atanh,

Гиперболические арксинус,

acoth

арккосинус, арктангенс и арккотангенс;

 

Примеры обращения к некоторым из библиотечных математических функций показаны на рис.1.2.2-6.

--> // Примеры использования встроенных математических функций Scilab

--> x = 10;

36

-->

d = sqrt(x)

// Квадратный корень

d

=

 

3.16227766

 

-->

 

 

--> f = abs(-10.65) // Абсолютная величина числа-10.65

f

=

 

10.65

 

-->

 

 

--> sin(x)

// Синус(10)

ans

=

 

-0.544021111

 

-->

 

 

--> factorial(3)

// Факториал 3

ans

=

 

6.

 

-->

 

 

--> hh = sin(10 + 10) .* 10.65 ./ (1 – 3.16227766 * %i)

hh

=

 

0.8838969928355 + 2.7951277141849i

 

Рис. 1.2.2-6. Примеры использования библиотечных функций Scilab

Преобразование данных к арифметическому типу

Поскольку во всех языках программирования, в том числе и в Scilab, основные арифметические операции должны иметь аргументы одного и того же типа, то необходимо осуществлять преобразование аргументов к одному типу. Например, в случае если аргументы арифметических операций разного арифметического типа, вещественные и целые. Кроме того, в Scilab могут использоваться типы данных, отличных от арифметических типов, например, логические, строковые и другие. Преобразования одних типов данных к другим допустимым типам числовых данных можно осуществить явным образом с помощью функций, список которых приведен в табл. 1.2.2-8.

Преобразование данных числового типа. Таблица 1.2.2-8

ФФункции

Назначение

 

 

Примеры

 

 

 

ceil(A)

Возвращает матрицу целых чи-

--> ceil([1.3 1.5 1.7 2.5 3.7])

 

сел, состоящую из элементов,

ans

=

 

 

 

 

 

округлённых в сторону +∞

2. 2.

2.

3.

4.

 

 

 

--> ceil([-1.3 -1.5 -1.7 -2.5 -3.7])

 

 

ans

=

 

 

 

 

 

 

-1. -1. -1. -2. -3.

 

fix(A)

Возвращает матрицу целых чи-

--> fix([1.3

1.5 1.7

2.5 3.7])

 

 

сел, состоящую из элементов,

ans

=

 

 

 

 

 

округлённых в сторону нуля

1. 1.

1.

2.

3.

 

 

y= sign(x) .* floor(abs(x)) (то же са-

--> fix([-1.3 -1.5 -1.7 -2.5 -3.7])

 

мое, что и int).

ans

=

 

 

 

 

 

 

-1. -1. -1.

-2.

-3.

 

floor

Возвращает матрицу целых чи-

--> floor([1.3 1.5 1.7 2.5 3.7])

 

сел, состоящую из элементов,

ans

=

 

 

 

 

 

округлённых в сторону -∞

1. 1.

1.

2.

3.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

37

 

 

 

 

 

 

 

 

 

 

-->

floor([-1.3 -1.5 -1.7 -2.5 -3.7])

 

 

 

ans

 

=

 

 

 

 

 

 

-2. -2. -2. -3. -4.

 

int(A)

Возвращает матрицу целых чи-

-->

int([1.3 1.5 1.7 2.5 3.7])

 

сел, состоящую из элементов,

 

ans

 

=

 

 

 

 

 

округлённых в сторону нуля

1.

1.

1.

2.

3.

 

 

То же самое, что и fix.

-->

int([-1.3 -1.5 -1.7 -2.5 -3.7])

 

 

 

ans

 

=

 

 

 

 

 

 

-1. -1. -1. -2. -3.

 

round

Округляет до ближайшего целого

-->

round([1.3 1.5 1.7 2.5 3.7])

 

по правилам математики

 

ans

=

 

 

 

 

 

 

 

1.

2.

2.

3.

4.

 

 

 

-->

round([-1.3 -1.5 -1.7 -2.5 -3.7])

 

 

 

ans

=

 

 

 

 

 

 

 

-1. -2. -2. -3. -4.

 

ieee()

Устанавливает режим предупре-

-->

ieee(1); 1/0

 

 

 

 

ждающий о исключительных си-

 

Предупреждение : деление на нуль...

 

туациях при операциях с плаваю-

 

ans

=

 

 

 

 

 

 

щей точкой

 

Inf

 

 

 

 

 

 

 

-->

ieee(2); 1/0, log(0)

 

 

 

ans

 

=

 

 

 

 

 

 

 

Inf

 

 

 

 

 

 

 

 

ans

 

=

 

 

 

 

 

 

 

-Inf

 

 

 

 

 

isinf()

Проверяется значения на беско-

-->

realmax + .0001E+308

 

нечность inf

 

ans =

 

 

 

 

 

 

 

 

Inf

 

 

 

 

 

 

 

-->

-realmax - .0001E+308

 

 

 

ans

=

 

 

 

 

 

 

 

 

-Inf

 

 

 

 

 

isnan()

Проверяется значения

 

x =

[1 2 %nan 3 %nan 4]

 

 

на nan

 

k =

find(~isnan(x))

 

 

 

 

 

y =

x(k)

 

 

 

 

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

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

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

38

Приоритет выполнения математических операций

Приоритет выполнения математических операций в Scilab аналоги-

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

Замечания по использованию данных типа double

Как известно, система Scilab по умолчанию осуществляет все вычисления с максимальной возможной точностью – с вещественным типом данных с двойной точностью (double). Поэтому необходимо, во-первых, понимать, как представлены числовые данные этого типа в памяти компьютера, а во-вторых, особенности операций с ними.

В оперативной памяти компьютера Scilab представляет данные типа double в соответствии с принятыми стандартами. Любое числовое значение, хранящееся как double, занимает 64 бита (8 байтов) и состоит из знака числа, мантиссы и порядка. При этом имеет допустимый диапазон отрицательных числовых значений от -1.80D+308 до -2.205D+308, а положительных – от 2.23D-308

до 1.80D+308.

Переменную типа double в Scilab можно создать с помощью простого оператора присваивания, например, x=34.723.

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

(рис. 1.2.2-7)

-->// Примеры использования функции number_properties

-->

--> b = number_properties("radix") // Основание b =

2.

-->

-->eps = number_properties("eps") // Относительная максимальная погрешность eps =

1.110D-16

-->

--> ps = number_properties("huge") // Максимальное допустимое положительное -->// значение

ps = 1.80D+308

-->

--> ps = number_properties("tiny") // Минимально допустимое положительное

-->// значение ps =

39

2.23D-308

Рис.1.2.2-7 Примеры использования функции number_properties

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

1.2.3. Логические выражения в Scilab

Логические выражения в Scilab строятся на основе математических выражений, логических выражений, логических констант (%T, %F), операций отношения и соответствующих им функций, логических операций и функций,

а также круглых скобок. Результатом логического выражения является значение T (True), если выражение «Истинно», и значение F (False) в противном случае – выражение «Ложно».

Операции отношения и соответствующие им функции служат для поэлементного сравнения скалярных величин, векторов и матриц. Список операций отношения приведен в табл. 1.2.3-1.

Операции отношений. Таблица 1.2.3-1

Операция

Описание

 

 

Примеры *

==

Равно

--> x

== y

 

 

ans

=

 

 

 

T

T

F

 

 

--> a

== b

 

 

ans

=

 

 

 

F

 

 

~=

Не равно

--> x

~= y

 

 

ans

=

 

 

 

F

F

T

 

 

--> a

~= b

 

 

ans

=

 

 

 

T

 

 

<

Меньше чем

--> x

< y

 

 

 

ans

=

 

 

 

F

F

T

>

Больше чем

-->x

> y

 

 

 

ans

=

 

 

 

F

F

F

<=

Меньше или равно

--> x

<= y

 

 

ans

=

 

 

 

T

T

T

>=

Больше или равно

--> x

>= y

 

 

ans

=

 

 

 

T

T

F

* Примеры в этой таблице предполагают, что x = [2, 3, 4], y = [2, 3, 5], a = 3 +2 * i, b = 3 + 4 * i.

40