Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



Вычисления в интерактивном режиме. 2 часть



В системе MATLAB все одномерные массивы трактуются либо как вектор-строки, либо как вектор-столбцы. До сих пор мы вводили только вектор-строки. Следующее выражение, использующее операцию конкатенации, задаёт вектор-столбец

a4=[ 1; 2; 3]

состоящий из трёх строк, так как точка с запятой в операции конкатенации означает переход на новую строку.

Для массива a4 функция length( a4 ) возвращает число 3, так как действительно этот массив состоит из трёх элементов. Функция length не различает вектор-строки и вектор-столбцы.

Если попросить систему MATLAB показать значение переменной a4, то мы увидим следующую картину:

a4 =
1

То есть MATLAB распознаёт "геометрию" этого одномерного массива и наглядно отображает его, располагая элементы для показа в своём окне вертикально.

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

size( a3 )

ans =

3 2

причём первым показывается число строк, а вторым - число столбцов.

Применяем эту же функцию к одномерным массивам. Вот, что из этого получается для вектор-строки a2

size( a2 )

ans =

1 3

состоящего из одной строки и трёх столбцов. Для вектор-столбца a4, состоящего из трёх строк и одного столбца, имеем следующий результат применения функции size:

size( a4 )
ans =
3 1

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

var1 = 5

size( var1 )

ans =

 
 

1 1

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

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

7. Синтаксис операций с массивами.Так как массивы являются важнейшим объектом нашего внимания в системе MATLAB, рассмотрим синтаксис операций с массивами более подробно.

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

Напомним также, что для операции конкатенации в качестве разделителей элементов используются либо запятые (пробелы), либо точки с запятой. Причём в первом случае речь идёт о "горизонтальной" конкатенации или конкатенации вдоль строк, а во втором - о "вертикальной" конкатенации или конкатенации вдоль столбцов. Например, операция

C = [ A1 , A2 ]

из двух матриц A1 и A2, у которых предполагается одинаковым число строк, производит более "широкую" матрицу C с числом столбцов, равным сумме столбцов матриц-слагаемых.

Операция же

C = [ A1 ; A2 ]

 
 

соединяет матрицы A1 и A2 вертикально, производя матрицу C, у которой число строк будет равно сумме числа строк матриц A1 и A2. В случае разного числа столбцов у A1 и A2 появится сообщение об ошибке:

 

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

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

Существует ещё одна мощная групповая операция, применяемая к массивам. Это операция формирования диапазона значений, обозначаемая двоеточием. Составим одномерный массив diap1, состоящий из всех вещественных чисел от 3.7 (включительно) с приращением 0.3 и не более 8.947 . Для этого применяем операцию, обозначаемую двоеточием:

diap1 = 3.7 : 0.3 : 8.947 ;

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

Довольно трудно так сразу в уме подсчитать количество попадающих в заданный диапазон и, соответственно в массив diap1, элементов. Поэтому вызовем функцию length:

length( diap1 )

ans =

Чаще всего эту операцию применяют для формирования диапазона целых чисел:

diap2 = 4 : 2 : 26

Если приращение равно единице, то его можно для краткости опускать:

diap3 = 2:45

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

Применим операцию "диапазон" в контексте операции индексации:

a = [ 1 2 ; 3 4 ; 5 6 ];

b = a( 2 , : )

b =

3 4

Здесь операция "диапазон" позволяет захватить все имеющиеся значения второго индекса. В результате переменная b становится равной одномерному массиву, состоящему из всех элементов второй строки двумерного массива a. Таким образом, компактное выражение a( 2 , : ) позволяет "взять" из матрицы a её вторую строку.

Это же выражение позволяет удалить строку (или столбец), если при этом использовать понятие пустого массива, который обозначается как [ ]:

a( 2 , : ) = [ ]

Теперь рассмотрим другой пример. Пусть у нас имеется одномерный массив

a = [ 1 6 3 9 2 ];

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

b = a( 2 : 4 )

в котором указано не единственное значение индекса, а целый диапазон индексов, значения которых последовательно возрастают от 2 до 4. Это означает, что мы выполняем групповую операцию, помещающую в переменную b последовательно второй, третий и четвёртый элементы массива a. Таким образом формируется одномерный массив b:

b =

6 3 9

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

b = a( [ 5 3 1 ] )

так как в индексации участвует целый набор индексов, первый из которых равен 5, второй индекс (по порядку следования) равен 3, а третий равен 1. Это и объясняет порядок формирования элементов массива b.

Переставим местами столбцы в матрице

a = [ 1 2 3; 4 5 6; 7 8 9];

Мы хотим, чтобы последний столбец стал первым, второй - последним, а первый - вторым. Вот подходящее решение:

a = a( : , [ 3 1 2 ] )

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

 
 

Например, из матрицы a с размером 3x3, полученной предыдущей операцией и имеющей вид

 

можно сделать матрицу c с размером 4x5 :

 
 

c = a( [ 2 3 3 2 ] , [ 2 1 3 2 1 ] )

 

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

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

v = [ 1 ; 2 ]

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

v( 1 , 1 ) = 1;

v( 2 , 1 ) = 2;

так как если бы мы писали v( 1 ) = 1; v( 2 ) = 2, то мы создали бы вектор-строку.

Теперь с помощью выражения

v = v( : , [ 1 1 ] )

 
 

превращаем переменную v из вектор-столбца в матрицу 2x2:

 

Про только что выполненную операцию можно сказать, что для получения матрицы исходный вектор-столбец был продублирован (размножен два раза). А как быть, если нужно размножить столбец много раз? Не писать же операцию конкатенации на несколько километров! Или, если нужно продублировать вектор-столбец N раз, где N - переменная. В этом случае пригодится функция ones, порождающая массивы любой размерности, все элементы которых равны единице.

В частности, для производства одномерного массива эта функция принимает один аргумент, задающий его размер (число элементов). Следующее выражение

U = ones( 1,N )

порождает одномерный массив U, состоящий из N единиц. В результате выражение

v = v( : , ones( 1,N ) )

позволяет размножить вектор-столбец v ровно N раз, то есть получить матрицу 2xN.

Под конец приведём совсем уж замысловатые выражения. Пусть A - матрица 3x2:

A = [ 4 2 ; 1 6 ; 5 3 ],

и a=[ 1 7 2 4 5 1 ] - вектор-столбец. Мы знаем, что выражение A( 2,1 ) означает конкретный элемент матрицы A (стоящий во второй строке и первом столбце); выражение A ( :,2 ) означает второй столбец матрицы A (так второй индекс равен 2, а первый пробегает в порядке возрастания все возможные значения).

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

Теперь понятно, что справедливо равенство

a( A( : ) ) == [ 4 1 5 7 1 2 ]

Здесь элементы матрицы A, упорядоченные по столбцам, являются индексами для входа в массив a, откуда и извлекаются элементы для формирования массива-результата.

 
 

А что может значить такое выражение - a(A)? Спросим об этом у самой системы MATLAB:

 

Из рисунка видно, что мы из одномерного массива a получили матрицу 3x2. MATLAB трактует такое выражение как порождающее двумерный массив той же структуры, что и матрица A, поставляющая индексы для выборки значений из одномерного массива a.

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

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

Дадим наглядную иллюстрацию многомерных массивов на примере массива трёх измерений. Допустим, что ежедневно в течение месяца проводятся измерения одних и тех же величин, причём значения этих величин за день сводятся в прямоугольную таблицу. Тогда в конце месяца имеются тридцать двумерных таблиц. Как упорядочить всю эту совокупность опытных данных? Для этого можно расположить эти матрицы вдоль некоторого направления и пронумеровать их. Это будет уже третье направление упорядочивания данных, так как вдоль первого направления (условно - вертикального) упорядочиваются строки, вдоль второго (горизонтального ) - столбцы. В результате третий индекс для доступа к отдельному элементу данных будет равен номеру таблицы вдоль "направления времени". Получившаяся совокупность упорядоченных данных иллюстрируется следующим рисунком:

 
 

Если создать трёхмерный массив A, содержащий так упорядоченные данные, то к индивидуальному данному можно обращаться с помощью трёх индексов. Элемент A(1,2,2) находится в первой строке, втором столбце и во второй матрице. Из рисунка видно, что этот элемент равен 3.

Теперь расскажем о том, какими операциями можно создать такой массив. Во-первых, это прямое прописывание всех его элементов:

A(1,1,1)=3; A(2,1,1)=5;… A(1,2,1)=4;A(2,2,1)=8;… A(1,1,2)=2;

A(2,1,2)=3;…A(1,2,2)=3;… A(1,1,,30)=7; A(2,1,30)=4;

Процесс задания всех элементов такого трёхмерного массива допускает группировку. Сначала можно по-очереди сформировать первую матрицу (любым способом) B1, затем - вторую матрицу B2 и так далее. После того, как все матрицы будут сформированы, можно для создания трёхмерного массива выполнить следующие тридцать групповых присваиваний (по одной матрице за одно присваивание):

A(:,:,1) = B1; A(:,:,2) = B2;…A(:,:,30) = B30;

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

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

Для примера, создадим таким образом трёхмерный массив D с размером 2x3x2:

D=ones(2,3,2);

а потом изменим значения двух элементов:

D(2,2,1)=7;D(1,2,2)=5;

 
 

После этого попросим MATLAB показать содержимое этого массива:

Мы ранее в связи с матрицами (массивами размерности два) уже рассказывали, как MATLAB хранит в памяти элементы массивов, а именно в виде одного большого столбца. Это же справедливо и для многомерных массивов. К примеру, для только что представленного на рисунке трёхмерного массива D сначала идут элементы первого столбца первой матрицы ("страницы"), затем - второго столбца первой матрицы, далее - элементы первого столбца второй матрицы, и, наконец, идут последними элементы второго столбца второй матрицы. Обратиться к элементам в такой последовательности можно, указав единственный индекс для трёхмерного массива D. Верны следующие равенства:

D(3)==1; … D(4)==7; … D(7)==1; … D(9)=5; …

Работа с массивами размерности 4 и выше вполне аналогична рассмотренной нами работе с массивами размерности 3.

10. Функции для работы с массивами.В системе MATLAB несколько функций специально предназначены для работы с массивами. Одну из таких функций - функцию ones, мы уже рассмотрели в предыдущем пункте. Эта функция предназначена для создания массивов произвольной размерности с единичными элементами.

Другими функциями этой группы являются функция zeros, производящая массив из нулей, и функция rand, генерирующая массив со случайными элементами, равномерно распределёнными на интервале от 0 до 1.

Например, выражение с этой функцией

A = rand( 3 )

производит массив 3x3 случайных чисел чисел

 
 

равномерно распределённых на интервале от 0 до 1.

Если вызвать эту функцию с двумя аргументами

B = rand( 2 , 3 )

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

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

help имя_функции

Получив такую справку по функции rand, узнаём, что вызов функции rand(2,3) полностью эквивалентен вызову rand( [ 2 , 3 ] ), то есть вместо двух скалярных аргументов можно задать одну вектор-стоку с двумя элементами. Так как функция size для матрицы C = [ 1 2 ; 4 5 ; 7 8 ] возвращает вектор-строку v

v = size( C )

v =

3 2

элементами которой служат размеры матрицы C, то вызовы

D = rand( 3, 2 ); D = rand( [ 3 , 2 ] ) и D=rand( size( C ) )

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

[ m , n ] = size( C ); D = rand( m , n );

где мы ввели две скалярные переменные m и n для размеров матрицы C, определяемые за один вызов функции size.

Ранее при рассмотрении многомерных массивов мы уже сказали, что операцию конкатенации с помощью квадратных скобок нельзя применить для порождения нового измерения в матрицах (кроме как для перехода от размерности 1 к размерности 2). Для этой цели применяют специальную функцию cat. Пусть имеются два двумерных массива (матрицы) A1 = [ 1 2 3 ; 4 5 6 ] и A2 = [ 7 8 9 ; 3 2 1 ]. Тогда их конкатенация вдоль разных направлений приводит к следующим результатам:

1). cat( 1, A1,A2 ) порождает массив [1 2 3; 4 5 6 ; 7 8 9; 3 2 1 ]

то есть тот же результат, что и [ A1 ; A2 ].

2). cat( 2, A1,A2 ) порождает массив [ 1 2 3 7 8 9 ; 4 5 6 3 2 1 ]

то есть тот же результат, что и [ A1 , A2 ].

 
 

3). A3 = cat( 3, A1,A2 ) порождает из двумерных массивов A1 и A2 трёхмерный массив A3, который показывается в командном окне следующим образом:

 

 

 
 

Наглядно такой массив можно изобразить на "трёхмерном" рисунке:

 
 

Для простых расчётов с элементами массивов предназначены функции sum, prod, max, min и sort. Функцию sum чаще всего применяют для одномерных массивов, где она суммирует все элементы. Для матриц (двумерных массивов) эта функция суммирует элементы в столбцах, так что если B = [ 1 2 3 ; 4 5 6 ; 7 8 9 ], то

sum( B ) == [ 12 , 15, 18 ]

Для многомерных массивов эта функция позволяет выбрать направление суммирования элементов.

Функция prod во всём аналогична только что рассмотренной функции sum, но только вместо суммирования выполняет умножение, так что

prod( B ) == [ 28 , 80, 162 ]

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

max( B ) == [ 7 , 8, 9 ]

На примере этих функций покажем ещё одну уникальную особенность функций в системе MATLAB - возможность требовать от тех функций, которые это могут, разное число возвращаемых значений!!!

Пусть имеется вектор-сторока v=[ 5 2 6 8 3]; Вызывая функцию min для этого массива, находим наименьший из его элементов:

m = min( v );

равный двум. Но если нас также будет интересовать и номер (индекс) N наименьшего элемента, то мы можем осуществить вызов функции min следующим образом:

 
 

[ m , N ] = min( v );

откуда видно, что в векторе v наименьший элемент стоит на втором месте.

Функция sort сортирует в возрастающем порядке элементы одномерных массивов, элементы столбцов в матрицах (каждый столбец отдельно) и так далее.

Под конец рассмотрим очень важные функции all, any и find. Функция all в случае её применения к вектору возвращает 1 ("истина"), если все элементы вектора не равны нулю ("истинны"), или 0 в противном случае (то есть в случае, если хотя бы один элемент нулевой). Функция any действует противоположным образом. Она возвращает нуль в случае, когла все элементы вектора нулевые, и она возвращает единицу, когда хотя бы один элемент ненулевой. В случае применения к матрицам обе эти функции трактуют столбцы матриц как векторы, по каждому из которых нужно дать результат так, как это описано выше.

Для примера, если F = [ 1 2 0 ; 0 3 0; 7 4 0 ], то

all( F ) == [ 0,1,0 ]; any( F ) == [1,1,0];

Функция find в качестве аргумента принимает некоторое условие, а возвращает набор номеров (индексов) неравных нулю элементов массива. Для одномерного массива v вызов этой функции

u = find( v )

возвращает вектор u индексов ненулевых элементов. В частности, для вектора

v=[1 0 3] имеет место равенство

find( v ) == [ 1 3 ]

так как отличны от нуля элементы с номерами (индексами) 1 и 3.

Для матриц функция find возвращает уже не один вектор индексов, а целый их набор. Каждый вектор из этого набора получается обработкой отдельного столбца матрицы. Например, для матрицы A = [ 1 0 3; 0 4 5; 6 7 8] следующий вызов функции

[ u1 , u2 ] = find( A )

возвращает вектор-столбцы u1 и u2, первый из которых содержит номера строк отличных от нуля элементов матрицы A, причём матрица просматривается по столбцам слева-направо (сначала - первый столбец, затем - второй и т. д.). Вектор столбец u2 содержит номера столбцов ненулевых элементов. То есть справедливы равенства

u1 == [ 1; 3; 2; 3; 1; 2; 3 ]; u2 ==[ 1; 1; 2; 2; 2; 3; 3; 3 ]

11. Вычисления с массивами.Так как массивы явяляются самыми распространёнными и самыми ценными типами данных в системе MATLAB, то важно подробно рассмотреть все нюансы вычислений с ними. Ранее (п. 2) мы рассмотрели действие арифметических, логических операций и операций сравнения в частном случае скаляров (массив размера 1x1). Теперь повторим это рассмотрение для случая массивов.

Начнём с арифметических операций. Операции сложения и вычитания осуществляются с массивами поэлементно и обозначаются теми же самыми традиционными значками. Если A = [ 1 1 1; 2 2 2; 3 3 3 ];

B = [ 0 0 0; 7 7 7; 1 2 3 ], то справедливо равенство

A + B == [ 1 1 1 ; 9 9 9 ; 4 5 6 ];

Складываемые (вычитаемые) матрицы должны иметь одинаковые размеры. Допускается исключение - если одно из слагаемых является скаляром. В этом случае производится генерация матрицы с таким же размером, как и у матричного слагаемого, причём все её элементы одинаковые и равны исходному скаляру. Например,

A + 5 == [ 6 6 6 ; 7 7 7 ; 8 8 8 ];

То есть до выполнения поэлементного матричного сложения из скаляра 5 получают безымянную матрицу [ 5 5 5; 5 5 5; 5 5 5 ], которую и складывают с A.

Теперь рассмотрим умножение и деление (а также возведение в степень). Здесь традиционные значки зарезервированы за действиями линейной алгебры: знак * означает перемножение матриц (а также вектор-строк и вектор-столбцов) по широко известному правилу "строка на столбец". Традиционный знак деления / (а также знак \) закреплён за "операцией нахождения решений систем линейных уравнений". Все эти операции линейной алгебры (включая операцию транспонирования) будут подробно рассмотрены в главе, специально посвящённой решению математических задач с помощью системы MATLAB.

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

A .* B == [ 0 0 0 ; 14 14 14 ; 3 6 9 ];

Соответственно, выражение ( A .^ 2 ) позволяет возвести в квадрат каждый элемент матрицы A. При поэлементном умножении на скаляр производится "расширение скаляра до матрицы", или по-другому можно сказать, что на скаляр умножается каждый элемент матрицы:

A .* 4 == [ 4 4 4 ; 8 8 8 ; 12 12 12 ];

Для поэлементного деления используются комбинации знаков

./ и .\

обозначающие "правое и левое" поэлементные деления. Выражение A ./ B приводит к матрице с элементами A(k,m)/B(k,m), а выражение A .\ B приводит к матрице с элементами B(k,m)/A(k,m). Обе матрицы должны иметь одинаковые размеры, в случае скаляра производится его расширение до размеров операнда-матрицы. Например,

6 ./ A == [ 6 6 6 ; 3 3 3 ; 2 2 2 ];

 
 

Операции отношения и логические операции используютв случае матриц те же самые значки и выполняют поэлементные действия. В случае скаляра производится его "расширение". Выполним сравнение матриц A и B, используя операцию "меньше или равно":

 

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

Операции сравнения для массивов часто комбинируются с вызовом функции find. Действительно, представим, что для массива v = [ 1 3 6 7 0 ] все элементы, большие единицы, нужно сделать равными 9. Эта задача решается с помощью следующего выражения:

v( find( v > 1 ) ) = 9;

 
 

Поясним работу этого выражения. Функция find возвращает набор (массив) номеров тех элементов вектора v, для которых записанное неравенство v > 1 действительно имеет место. Ясно, что это номера [ 2 3 4 ]. Затем эти номера поступают на вход операции индексации массива v, что и обеспечивает присвоение девятки второму, третьему и четвёртому элементам v:

Таким образом, все элементы, большие единице, стали равны девяти.

Работу логических операций продемонстрируем на только что полученном новом значении вектора v, применив к нему операцию "НЕ":

~v == [ 0 0 0 0 1 ]

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

x = 0 : 0.01 : pi/2; y = sin( x );

позволяют осуществить вычисления функции sin сразу в 158 точках. В результате мы имеем массив аргументов x (всего 158 значений) и массив y значений функции (также 158 элементов). Этих двух массивов уже достаточно для построения подробного графика функции sin. В системе MATALB эти два массива можно подать на вход специальной функции, автоматически производящей построение графиков функций. Эта техника будет рассмотрена в следующей главе.

А сейчас приближённо решим уравнение sin(x) = 0.315. Для этого нам потребуется записать всего лишь одно выражение:

res = ( max( find( y < 0.315 ) ) - 1 ) * 0.01

В результате вычислений получается приближённый корень: res = 0.3200. Так как шаг вычислений был выбран равным 0.01, то мы можем надеяться, что корень найден с точностью не хуже 0.01. Для проверки точности найденного корня вычисляем asin(0.315):

asin( 0.315 )

ans = 0.3205



Просмотров 954

Эта страница нарушает авторские права




allrefrs.su - 2025 год. Все права принадлежат их авторам!