Учебнометодическое пособие к практикуму по курсу Пакеты компьютерной алгебры
Скачать 1.85 Mb.
|
semilogx, semilogy и loglog. 40 Пример 9. Использование логарифмической шкалы для оси x clear, clc x=[1e+0,1e+1,1e+2,1e+3,1e+4,1e+5,1e+6] y=[1,2,4,8,16,32,64]; p=semilogx(x,y), set(p, 'LineWidth' ,2); title( 'Логарифмическая шкала по оси x' ) Пример 10. Использование логарифмической шкалы для обеих осей clear, clc x=[1e+0,1e+1,1e+2,1e+3,1e+4,1e+5,1e+6] y=[1e+1,1e+4,1e+1,1e+3,1e+1,1e+4,1e+1]; p=loglog(x,y) set(p, 'LineWidth' ,2); title( 'Логарифмическая шкала для обеих осей' ) grid on % задание сетки 41 Задания для самостоятельного решения 1. Постройте график функции y = exp(-x)*sin(10*x). Задайте тип и цвет линии. Добавьте заголовок. 2. Постройте графики функций в одних осях. y1 = exp(-x).*sin(10*x) y2 = sin(10*x) Добавьте легенду. Попробуйте перенести легенду с помощью мыши в другое место окна figure. Задайте параметр расположения легенды вне графика - в правом верхнем углу графического окна. 3. Постройте графики функций: y1 = sin(x) y2 = cos(x) Подпишите оси. Добавьте сетку. 4. Постройте графики функций в одном графическом окне, один под другим. y1 = sin(x) y2 = cos(x) 5. Постройте четыре графика функций, каждый в своем окне, в одном figure y1=cos(x) y2=sin(x) y3=x^(1/2) y4=x^2 6. Постройте график функции y = sin(x). Добавьте подписи координатных осей, сетку, команду задания границ для осей. Добавьте подпись '← sin(x)' в точке (3.05,0.16). 42 7. Для функции n! постройте график функции в логарифмическом масштабе по оси y. 8. Постройте графики функций f = log(0.5*x) g = sin(log(x)) в логарифмическом масштабе по оси х. Добавьте легенду на графики. 9. Постройте графики функции y=exp(x) в обычном и логарифмическом мас- штабе в одном figure, но в разных осях (используйте subplot). Добавьте ле- генду на графики. 10. Постройте график функции в полярных координатах: x=[0:0.01:2*pi] f =8*sin(x) r = cos(2*x) 11. Постройте в полярных координатах следующие кривые: окружность, спи- раль Архимеда, сердце, бабочка, полярная роза. 12. Постройте графики функций, заданных параметрически. Диапазон изме- нения параметра подберите таким образом, чтобы построенные графики были похожи на графики, приведенные на рисунках ниже. Установите тол- щину линии графиков в 2 пикселя. Добавьте заголовок и легенду. Сохраните построенные графики в различных графических форматах - png, jpg, eps. Сравните качество и размер получившихся графических файлов. Сделайте вывод о том, какой графический формат предпочтительнее для графиков и почему. 43 Эвольвента окружности Улитка Паскаля 44 Гипоциклоида Циклоида 13. Постройте кривую «локон Аньези» для нескольких значений параметра. 14. Постройте график функции x*sin(1/x). 15. Задайте три вектора. Первый вектор содержит номера дней месяца. Вто- рой и третий список содержат значения курса акций в эти дни, для двух раз- ных месяцев. Построить графики зависимости курса акций от номера дня. Добавить заголовок, подписи осей, сетку и легенду, цвета для линий графи- ков. 16. Дана таблица. Отобразите данные в графическом виде. Количество Эксперимент 1 Эксперимент 2 Эксперимент 3 10 3 0.02755529361166 0.04623873215974 0.06307710110520 10 4 0.28666151628344 0.67483306464728 0.85628458136542 10 5 2.84742674641796 4.92785226951551 6.29249360982561 10 6 28.5048610591205 48.4353558734875 60.7404539333518 45 17. Постройте график зависимости времени возведения матрицы в квадрат от ее порядка. Матрицу наполнять случайными целыми числами в диапазоне от 1 до 10. Построить такие же графики для верхней и нижней треугольных матриц. Все графики строить в одних осях. Добавить сетку и легенду. Сделать вывод. 18. Постройте график функции sin(x). С помощью панели инструментов окна figure измените толщину линии графика, добавьте текстовую надпись. Вы- полните экспорт графика в файл png. 19. Постройте график функции sin(x)/x. С помощью функции gtext добавьте текстовую надпись. Контрольные вопросы 1. Перечислите способы построения графиков функций. 2. Как построить график функции, заданной параметрически? 3. С помощью какой команды можно отобразить сетку в координатных осях? 4. Как построить несколько графиков в одних осях с помощью одной коман- ды (с помощью нескольких команд)? 5. С помощью какой команды можно вывести текстовую надпись в графиче- ское окно? 6. Для чего используют логарифмический масштаб для графиков. Приведите примеры. 7. Что такое легенда и когда ее используют? 8. Перечислите параметры функции subplot. Для чего используют эту функ- цию? 9. Чем отличаются команды plot и fplot? 10. Для чего строят графики? 46 Основные типы данных Любой объект в ML, в том числе скаляр, является массивом. Класс ARRAY – законодатель класса массивов, в котором разработаны методы функционирования всех дочерних объектов. Хранение массивов в ML осуществляется в векторной форме последо- вательно по столбцам, поэтому поддерживается как двойная (матричная) нумерация, так одинарная (векторная). Основой операций с массивами яв- ляется согласование размерностей. Заметим, что класс ARRAY является роди- тельским для всех потомков и определяет все объекты более низкого уровня как массивы (матрицы) так и правила (методы). На рисунке представлена схема иерархии классов (типов данных) в ML. Методы класса Array ndims – возвращает количество размерностей многомерного массива (лю- бой природы), n = ndims(a); size – определяет вектор v = size(a) размерностей массива; так, для n = 2, [m, p] = size(a); 47 length(a) – определяет длину вдоль большей размерности; length(a(:)) определяет длину массива, записанного вектором; numel(a) – количество элементов массива; disp(display) – визуализация объектов, не подавляется знаком (;) Типы данных Numeric и Double Все объекты в ML делятся на числовые, если isnumeric(a) = 1 равно логической единице, и нечисловые, если isnumeric = 0. В момент создания числового объекта идентифицируется класс потом- ка Numeric, которому он принадлежит. ML ориентирован на матричные вы- числения двойной точности с элементами класса Double. Пример 1. Логическая единица не является числовым объектом % Справка по элементарным функциям clear a=rand(2,3 ); % генерирование матрицы из двух строк, трех столбцов, элементы которой равномерно распределены на отрезке [0,1] b=isnumeric(a) % результат: 1 , т.е. a – числовой объект islogical(b) % результат: 1, т.е. b – логический объект isnumeric(ans) % результат: 0, т.е. логический объект - нечисловой В силу свойств наследования имеем: • скаляр – тоже массив, минимальный элемент размера (1,1); • в памяти матрица хранится как вектор, записанный последовательно по столбцам и поддерживается одинарная и двойная нумерация; 48 Заметим, что диапазон вещественных чисел [realmin, realmax], здесь realmin, realmax системные переменные минимальное и мак- симальное вещественные значения. Способы создания объектов Double Пример 2. Задание объектов перечислением: % вектор–столбец a = [1; 2; 3] ; % задание вектор-строки a = [1 2 3] % задание вектор-строки, иной синтаксис a = [1,2,3] % задание вектора с элементами арифметической прогрес- сии (первый член, шаг, последний) a = [a1 : aStep:aEnd] Пример 3. Задание объектов с помощью специальных матриц: a = rand(size(b)) % – матрица с элементами, полученными генера- тором случайных чисел, равномерно распределенных на отрезке [0,1], такого же размера, как некоторая матрица b a = randn(m, n) % – размер генерируемой матрицы m на n; исполь- зуется генератор нормального распределения с нулевым средним и единичной дисперсией. a = ones(n) % – создается квадратная матрица из единиц размера n b = eye(n) % – единичная матрица a = zeros(n) % – нулевая матрица Задание объектов импортированием можно производить с помощью непо- средственного импортирования и чтением из внешних файлов: команды File →ImportData, чтение экселевского файла: namemtrix=xlsread(pathname.filename) , здесь path- name.filename – строка (путь и имя файла); 49 Заметим, что имена листов следует писать на английском языке, файлы не должны нарушать структуру матриц; создается файл по имени выходной пе- ременной namematrix. Ниже, на рисунке, приведен пример чтения данных из файла Excel и резуль- тат чтения в ML: Файл inex.xls Имя листа Sheet1 импортирование текстового файла load filename (текстовый файл, см. пример, пусть filename это inp.dat ) форматированный ввод сначала открывается файл pathname.filename, записанный строкой в ка- честве первого аргумента: fid = fopen('pathname.filename', 'permission') второй аргумент,'permission' – указывает на форму доступа ('r' – чтение из файла; 'w' – запись в новый файл, 'a' – добавление в сущест- вующий файл, подробнее см. help); fid – файловый идентификатор, кото- рый система связывает с файлом (здесь подразумевается, что файл располо- жен в рабочей папке) или указывает на ошибку (например, отрицательное значение fid). 50 Затем происходит считывание данных из файла: a = fscanf(fid, format, size), здесь format = [' %g %f %e %s %c %d \n'], указывает, что в каждой строке файла записано шесть чисел , указанного формата: %g – с плавающей точкой машинного представления %f – с фиксированной точкой %e – с плавающей точкой %s – строка, пробелы в которой не учитываются %c – строка, учитываются пробелы %d – целые десятичные символ \n – переход считывания на следующую строку (перевод каретки); size - размер массива (матрицы), обусловлен машинным представлением, т.е. колонки матрицы, последовательно записаны в вектор-строку size = [m, n] m - количество элементов в строке; n – количество элементов в столбце, n = inf, если неизвестно количество строк в файле (длина столбца), из которого производится чтение, т.е. size = [m, inf] (см. далее рисунок с примерами, случай size= [2,inf]). Обратите внимание, что после считывания получаем матрицу, транспониро- ванную по отношению к заданной в файле, но операция транспонирования A.' поставит все на свои места. 51 Операцию транспонирования A.' необходимо применить после считывания в обоих примерах, это обусловлено машинным представлением – хранением матриц вектором, записанным по столбцам. форматированный вывод fprintf(fid, format, namevar) Запись в файл namevar (записанный строкой с необходимым расширени- ем); fid – файловый идентификатор файла, который уже открыт и пустой или ранее создан; format – строка по аналогии с форматированным вводом, здесь далее при- веден пример формата, который еще имеет поясняющие надписи ['points number= %d x= %g y=%e surf=%f \n' ] fclose(fid) - команда, закрывающая созданный файл. Пример 4. Создание шахматной структуры, без использования циклов %% шахматный порядок figure %m - нечетное; n-любое m=9 n=6 A=rand(m,n) A(1:2:end)=0 mytitle=['m=',num2str(m),' - число строк, нечетное'] subplot(2,2,1),spy(A),title(mytitle) m=8 %m - четное; n=6 A=rand(m,n) A(1:2:end)=0 mytitle=['m=',num2str(m),' - четное'] subplot(2,2,2),spy(A), title(mytitle) A=rand(m,n) AA=A A=[rand(1,n);A] 52 A(2:2:end)=0 A(1,:)=[] mytitle=['добавляем 1-ю строку; тот же алгоритм, и уда- ляем 1-ю строку'] subplot(2,2,3),spy(A), title(mytitle) 53 Задания для самостоятельного решения Задание 1 Построить блочно-диагональную матрицу, которая состоит из n блоков (n – целое, генерируется случайным образом на отрезке [4,8] с помощью randi или randint – зависит от версии MatLab). Блоки строятся генератором равномерно распределенных чисел на отрез- ке [0,1], размер каждого из n блоков определяется арифметической прогрессией n:1:2n-1. Вывести на экран структуру матрицы командой spy. Задание 2 Построить матрицу A пятого порядка с помощью генератора rand. Вычислить A' A и A'+A и доказать, что полученные матрицы симмет- ричны. При выполнении задания циклы использовать нельзя. Задание 3 Второй и предпоследний блоки блочно-диагональной матрицы (см. задание 1) определяют подматрицу блочной матрицы, начинающейся с n+1 –й строки и столбца и до end-(2n-1) строки и столбца. Требуется передвинуть выбранные блоки так, чтобы они разместились в вершинах побочной диагонали подматрицы. Структуру матрицы отобразить на экране с помощью команды spy. Задание 4 Постройте заполненную матрицу размера (m,n). Расставьте нули в матрице в шахматном порядке, не используя опера- торов цикла. Рассмотрите случаи для четного и нечетного значений m. Отобразите на экране структуру исходной матрицы и результата в смежных осях. Для этого используйте команды spy и subplot. 54 Задание 5 Предложите два способа суммирования элементов вектора длины 10000000 (сгенерируйте случайным образом с помощью rand), без использования цикла. Оцените скорость выполнения операций в обоих случаях. Команды оценивания времени работы процессора: tic, toc; -секундомер; и затраты на процесс как разница времени начала и конца: t1=clock , инструкции алгоритма, t2=etime(clock,t1) Задание 6 Задайте n - размер матриц A=ones(n), B=zeros(n); n=size(C), C – произвольная матрица, состоящая из нулей и единиц, сгенерирован- ная randi (randint). Объясните смысл и результат следующих операций: B&C A|C Замечание. Любую матрицу, элементы которой нули, или единицы, можно конвертировать в логическую. Например, матрица A=logical(ones(n)) – логическая; здесь logical – конвертер. Контрольные задания и вопросы Выполните и объясните следующие команды. Полагайте переменные зада- ний 1-4 глобальными. Задание 1. help elmat ones(2,5) A=[1:3;4:6] B=ones(size(A)) eye(5) rand(5) C=zeros(3) 55 Задание 2. help > D=[1-i 2; 0.5i -1+2*i] real(D) imag(D) D1=D’ D2=D.’ % объясните отличие D1 D2 A’ % матрица A из задания 1 Задание 3. Выполнить, объяснить особенности 10/3 format rational 1/3 format short 1/3 % обратите внимание на системные переменные, % которые являются результатом выполнения последних двух команд 1/0 0/0 realmin realmax Задание 4. Выполнить, определить размер результирующих массивов. Объ- яснить. A=[A; sin(0.5*pi*(1:3))] diag(A) diag(diag(A)) S=sum(A) S=sum(sum(A)) abs(A) norm(A) %определите по справке, какую норму вы определили 56 Объекты класса Char. Функции и свойства Объекты типа Char являются потомком ARRAY, поэтому для них спра- ведливы все принципы, которые поддерживаются для массивов. Объекты типа Char – строки; строки состоят из цифр, букв и символов таблицы ASCII, каждый элемент строки занимает два байта, это является нетипичным для других языков программирования, в которых одному элементу отводится один байт памяти, но MatLab ориентирован на матричные вычисления, в основе которых лежит комплексная арифметика (переход от операций комплексной арифметики к вещественной достигается автоматически с нулевой мнимой частью, обратный переход автоматически невозможен), это и обусловливает резервирование еще одного байта на комплексную часть. Справка о создании, контроле типа и редактировании строковых перемен- ных % Задание строки: % один или серия символов заключается в апостроф A='ученье' % кавычка задается четырьмя апострофами A=''''ученье'''' % выводится “ученье” % контроль типа: % является ли аргумент функции ischar строкой, ischar(A) % если да, то результат - логическая единица length(A) % количество элементов строки равно 10 % Конкатенация строк (по правилом матричной алгебры): % строки записываются матрицей размера 2 3 ['tip'; 'top'] % аналогично функцией strvcat (важно: согласование раз- мерностей по столбцам не требуется!) % две строки последовательно записываются строкой %из шести букв,аналогично функцией strcat ['tip', 'top'] 57 % Поиск букв или лексем: S= ’sin(x)*cos(y)’, s=’x’ % ищем в большей строке меньшую k = findstr(s, S) % ищем в строке первого аргумента строку второго r = strfind(S, s) isempty(k), isempty(r) % проверка хотя бы % одного совпадения лексем (успех - логическая единица) %% Сравнение строковых переменных v1 и v2 % v1 сравнилось c v2, если все буквы совпали с учетом % регистра strcmp(v1,v2) % v1 сравнилось c v2, если все буквы совпали без учета % регистра strcmpi(v1,v2) % сравнилось n букв, с учетом регистра strncmp(v1,v2,n) % сравниваются n букв без учета регистра strncmpi(v1,v2,n) Пример 1. Конкатенация (соединение) строк % Конкатенация строк с пробелами и без в конце, % первый способ: strcat('C ', 'Новым ', 'Годом!') % пробел – элемент строки! strcat('C', 'Новым', 'Годом!') % второй способ: ['C ', 'Новым ', 'Годом!'] Пример 2. Сравнение строк % c учетом регистра и без: s1='ABCDEFGH' s2='ABCDefgh' s3='ABCabc' strcmp(s1,s2) strcmpi(s1,s2) strncmp(s1,s2,3) 58 Пример 3. Сравнение матриц, элементы которых - строки % c учетом регистра и без: sm1=['1234567'; 'ABCDEFG'], sm2=['1234567'; 'ABCDefg'] strcmp(sm1, sm2) strncmp(sm1, sm2, 4) strcmpi(sm1, sm2) sm3=['1234567'; 'ABCDEFG'] sm4=['1234567'; 'ABCdefg'] strcmpi(sm3, sm4) Пример 4. Преобразование регистра строки % строчные буквы: lower('Happy Birthday - С Днем Рождения!') % прописные буквы: upper('Happy New Year - С Новым Годом!') Пример 5. Выделение лексем % выделение слов, составляющих выражение, % разделенных пробелами s='С Новым Годом!' [t1, r1] = strtok(s) [t2, r2] = strtok(r1) [t3, r3] = strtok(r2) % выбраны три лексемы в переменных: t1, t2, t3 |