
- •Начала программирования в среде MatLab
- •Содержание
- •Предисловие
- •Введение
- •1. MatLAB как научный калькулятор
- •1.1. Командное окно
- •1.2. Операции с числами
- •1.2.1. Ввод действительных чисел
- •1.2.2. Простейшие арифметические действия
- •1.2.3. Ввод комплексных чисел
- •1.2.4. Элементарные математические функции
- •1.2.5. Специальные математические функции
- •1.2.6. Элементарные действия с комплексными числами
- •1.2.7. Функции комплексного аргумента
- •1.2.8. Задания
- •1.2.9. Вопросы
- •1.3. Простейшие операции с векторами и матрицами
- •1.3.1. Ввод векторов и матриц
- •1.3.2. Формирование векторов и матриц
- •1.3.3. Извлечение и вставка частей матриц
- •1.3.4. Действия над векторами
- •1.3.5. Поэлементное преобразование матриц
- •1.3.6. Матричные действия над матрицами
- •1.3.7. Матричные функции
- •1.3.8. Задания
- •1.3.9. Вопросы
- •1.4. Функции прикладной численной математики
- •1.4.1. Операции с полиномами
- •1.4.2. Обработка данных измерений
- •1.4.3. Функции линейной алгебры
- •1.4.4. Аппроксимация и интерполяция данных
- •1.4.5. Векторная фильтрация и спектральный анализ
- •1.4.6. Задания
- •1.4.7. Вопросы
- •1.5. Построение простейших графиков
- •1.5.1. Процедура plot
- •1.5.2. Специальные графики
- •1.5.3. Дополнительные функции графического окна
- •1.5.5. Задания
- •1.5.6. Вопросы
- •1.6. Операторы управления вычислительным процессом
- •1.6.1. Оператор условного перехода
- •1.6.2. Оператор переключения
- •1.6.3. Операторы цикла
- •1.6.4. Задания
- •1.6.5. Вопросы
- •2. Программирование в среде MatLAB
- •2.1. Функции функций
- •2.2. Создание М-файлов
- •2.2.1. Особенности создания М-файлов
- •2.3.1. Общие требования к построению
- •2.3.2. Типовое оформление процедуры-функции
- •2.3.3. Задания
- •2.3.4. Вопросы
- •2.4. Создание Script-файлов
- •2.4.1. Основные особенности Script-файлов
- •2.4.2. Ввод и вывод информации в диалоговом режиме
- •2.4.3. Организация повторения действий
- •2.4.4. Организация изменения данных в диалоговом режиме
- •2.4.5. Типовая структура и оформление Script-файла
- •2.5. Графическое оформление результатов
- •2.5.1. Общие требования к представлению графической информации
- •2.5.2. Разбивка графического окна на подокна
- •2.5.3. Вывод текста в графическое окно (подокно)
- •2.6. Создание функций от функций
- •2.6.1. Процедура feval
- •2.6.2. Примеры создания процедур от функций
- •2.6.3. Задания
- •2.7. Пример создания сложной программы
- •2.7.1. Программа моделирования движения маятника
- •2.7.2. Задания
- •3.1. Функции меню командного окна
- •3.1.2. Другие меню командного окна
- •3.1.3. Панель инструментов
- •3.2. Команды общего назначения
- •3.3. Создание М-книги
- •3.3.1. Начало новой М-книги
- •3.3.2. Написание М-книги
- •3.3.3. Редактирование М-книги
- •3.3.4. Преобразование документа WORD в М-книгу
- •3.3.6. Изменение параметров вывода результатов
- •4. Классы вычислительных объектов
- •4.1. Основные классы объектов
- •4.1.1. Класс символьных строк (char)
- •4.1.2. Класс записей (struct)
- •4.1.3. Класс ячеек (cell)
- •4.2. Производные классы MatLAB
- •4.2.1. Класс объектов Inline
- •4.2.2. Классы пакета CONTROL
- •4.3. Пример создания нового класса polynom
- •4.3.1. Создание подкаталога @polynom
- •4.3.2. Создание конструктора
- •4.3.3. Создание процедуры символьного представления polynom-объекта.
- •4.4. Создание методов нового класса
- •5.1. Формирование типовых процессов
- •5.1.1. Формирование одиночных импульных процессов
- •5.1.2. Формирование колебаний
- •5.2.1. Основы линейной фильтрации
- •5.2.2. Формирование случайных процессов
- •5.3. Процедуры спектрального (частотного) и статистического анализа процессов
- •5.3.1. Основы спектрального и статистического анализа
- •5.3.2. Примеры спектрального анализа
- •5.3.3. Статистический анализ
- •5.4. Проектирование фильтров
- •5.4.1. Формы представления фильтров и их преобразования
- •5.4.2. Разработка аналоговых фильтров
- •5.4.3. Проектирование БИХ-фильтров
- •5.5. Графические и интерактивные средства
- •5.5.1. Графические средства пакета SIGNAL
- •5.5.2. Интерактивная оболочка SPTOOL
- •6.1. Ввод и преобразование моделей
- •6.2. Получение информации о модели
- •6.3. Анализ системы
- •6.4. Интерактивный "обозреватель" ltiview
- •6.5. Синтез системы
- •7.1. Общая характеристика пакета SimuLink
- •7.1.1. Запуск SimuLink
- •7.1.2. Библиотека модулей (блоков)
- •7.1.3. Раздел Sinks (приемники)
- •7.1.4. Раздел Sources (Источники)
- •7.1.5. Раздел Сontinuous
- •7.1.6. Раздел Discrete
- •7.1.7. Раздел Math
- •7.1.8. Раздел Functions & Tables
- •7.1.9. Раздел Nonlinear
- •7.1.10. Раздел Signals & Systems
- •7.2. Построение блок-схем
- •7.2.1. Выделение объектов
- •7.2.2. Оперирование с блоками
- •7.2.3. Проведение соединительных линий
- •7.2.4. Проставление меток сигналов и комментариев
- •7.2.5. Создание подсистем
- •7.2.6. Запись и распечатка блок-схемы S-модели
- •7.3. Примеры моделирования
- •7.3.1. Моделирование поведения физического маятника
- •7.3.2. Моделирование поведения гироскопа в кардановом подвесе
- •7.4. Объединение S-моделей с программами MatLAB
- •7.4.2. Функции пересечения нуля
- •7.4.5. Образование S-блоков путем использования программ MatLab. S-функции
- •7.4.6. Пример создания S-функции
- •7.5.1. Создание библиотеки
- •7.5.2. Маскировка блоков
- •7.5.3. Моделирование процесса ориентации космического аппарата
- •Послесловие
- •Предметный указатель
- •Указатель операторов, команд, функций и функциональных блоков MatLAB
3.3. Пример создания нового класса |
178 |
|
|
|
|
Td = 0
InputName = {'Угол'}
OutputName = {'Напряжение'}
Notes = {'Гиротахометр'}
UserData = []
4.3. Пример создания нового класса polynom
Создание нового класса рассмотрим на примере класса многочленов. Назовем этот класс polynom. В этом классе объектом будет полином, т. е. функция одной переменной (например, x) вида
p(x) = an*xn + ... + a2*x2 + a1*x + a0.
Очевидно, полином как функция целиком определяется указанием целого положительного числа n, которое задает наибольший показатель степени аргумента, коэффициент при котором не равен нулю (an не равно нулю), и вектора длиною n+1 из его коэффициентов
с= [ an ... a2 a1 a0].
4.3.1.Создание подкаталога @polynom
Для создания подкаталога нового класса вызовите команду Open меню File командного окна, а затем в появившемся окне перейдите к папке Toolbox\Matlab\Polyfun. Воспользуйтесь пиктограммой создания новой папки в этом окне, чтобы открыть новую папку с именем @POLYNOM.
Перейдите во вновь созданную папку. Теперь вы готовы к созданию М- файлов нового класса.
4.3.2. Создание конструктора
Первым необходимым шагом в создании нового класса объектов является создание конструктора polynom-объекта, т. е. М-файла, который образовывал бы новый polynom-объект по некоторым заданным числовым данным.
Для этого прежде всего надо установить структуру polynom-объекта как записи. Из характеристики полинома как математического объекта следует, что можно выбрать представление polynom-объекта в виде записи, которая состоит из двух полей
-n - целого числа, которое задает порядок полинома;
-с - вектора длиной n+1 коэффициентов полинома.
Входным аргументом для образования polynom-объекта должен быть, очевидно, заданный вектор его коэффициентов.
В процедуре конструктора должны быть предусмотрены такие операции: - создание структуры (записи) p с полями p. n и p. c;
- преобразование этой структуры в polynom-объект.
Последнее осуществляется применением специальной функции class по схеме:
p = class(p, '<имя класа>').
3.3. Пример создания нового класса |
179 |
|
|
|
|
Ниже приведен возможный текст М-файла polynom. m. function p=polynom(v,cs);
%POLYNOM - конструктор полином-объектов
%Под полином-объектом понимается объект языка MatLab,
%который является записью с двумя полями:
%.с - вектор-строка, содержащая коэффициенты
%полинома в порядке уменьшения степени аргумента;
%. n - число, равное порядку полинома.
%p=POLYNOM(v) формирует полином-объект "р" по заданному
%вектору "v", который состоит из значений коэффициентов
%будущего полинома в порядке уменьшения степени аргумента.
%p=POLYNOM(v,cs) формирует полином-объект "р" по заданному
%вектору "v" корней полинома и значению "cs" его
%старшего коэффициента.
if nargin==0 |
% Эта часть |
p.c=[]; |
% создает пустой полином-объект, |
p.n=0; |
% если отсутствуют аргументы |
p=class(p,'polynom');
elseif isa(v,'polynom') |
% Эта часть создает дубликат, |
||
p=v |
|
% если аргумент является полином-объектом |
|
elseif nargin==2 |
% Эта часть работает, если в обращении есть 2 аргумента, |
||
|
|
% то есть задан вектор корней полинома |
|
if cs==0 |
|
% Если старший коэффициент равен нулю, |
|
|
cs=1; |
|
% его следует заменить на 1; |
|
end |
|
|
|
k=length(v); |
|
% Определение длины заданного вектора |
|
for i=1:k |
|
% коэффициентов |
|
|
|
|
|
vs(i,:)=[1 -v(i)]; |
|
|
|
end |
|
|
|
p.n=k; |
% Определение порядка полинома |
|
|
p.c=cs*vs(1,:); |
|
% Формирование |
|
for и=2:k |
|
% вектора |
|
p.c=conv(p.c,vs(и,:)); % коэффициентов |
||
|
end |
|
% полинома |
p=class(p,'polynom'); |
% Присвоение метки полином-объекта |
||
else |
% Эта часть работает, если аргумент один, |
||
|
% то есть задан вектор коэффициентов |
||
k=length(v); |
|
|
|
n=k; m=1; |
|
|
|
while v(m)==0 |
% Этот цикл сокращает длину входного вектора |
||
|
n=n-1; |
% (уменьшает порядок полином) в случае, |
|
|
m=m+1; |
% если первые элементы вектора |
|
end |
% равны нулю |
||
p.n=n-1; |
% Тут присваиваются значения полям |
||
p.c=v(k-n+1:end); % записи будущего полином-объекта |
|||
p=class(p,'polynom'); |
% Присвоение метки полином-объекту |
||
end |
% Завершение конструктора POLYNOM |
Система MatLAB позволяет вызывать конструктор без аргументов. В этом случае конструктор может образовать шаблон объекта с пустыми полями. Возможно также, что конструктор будет вызываться с входным аргументом, который уже является полином-объектом. Тогда конструктор должен создать
3.3. Пример создания нового класса |
180 |
|
|
|
|
дубликат входного аргумента. Функция isa проверяет принадлежность входного аргумента указанному классу.
Если аргумент существует и является единственным, он перестраивается так, чтобы стать вектором-строкой и присваивается полю .с результата. Если аргументов два, то первый из них полагается вектором корней полинома, а второй - значением старшего коэффициента полинома. Так как в этом случае порядок полинома обязательно может должен быть равен числу корней, старший коэффициент не может быть равным нулю. Поэтому, если ошибочно второй аргумент равен нулю, он исправляется на единицу. Функция class используется для присвоения результату метки, которая определяет его как polynom-объект.
4.3.3. Создание процедуры символьного представления polynom-объекта.
Следующим шагом в формировании класса polynom целесообразно сделать создание М-файла, который образовывал бы символьное представление заданного polynom-объекта. Такое представление необходимо для того, чтобы можно было убеждаться в правильности формирования polynom-объектов и контролировать правильность действий отдельных создаваемых методов класса polynom, а также получать наглядные результаты преобразований полиномов в программах.
Создадим этот М-файл в подкаталоге @POLYNOM и назовем его char. Единственным аргументом процедуры char является заданный полином-объект p, а выходной величиной - массив s символов, являющийся символьным представлением полинома.
Ниже приведен вариант такого М-файла. Представленный вариант формирует символьную строку вида
<значение an>*x^ n + ... +<значение a2>*x^2+<значение a1>*x+...
+<значение a0>
с изъятием членов, коэффициенты при которых равны нулю: function s = char(p)
% POLYNOM/CHAR формирует символьное представление полинома c=p.c;
if all(c==0) s='0';
else d=p.n; n=d+1; s=[];
for k=1:n a=c(k);
if a~=0;
if ~isempty(s) if a>0
s=[s ' + ']; else
s=[s ' - ']; a=-a;
end
3.3. Пример создания нового класса |
181 |
|
|
|
|
end
if a~=1|d==0
s=[s num2str(a)]; if d>0
s=[s '*']; end
end
if d>=2
s=[s 'x^' int2str(d)]; elseif d==1
s=[s 'x']; end
end d=d-1;
end
end % Завершение POLYNOM/CHAR
Чтобы эта символьная строка выводилась на экран, нужно создать еще один М-файл по имени display в том же подкаталоге @POLYNOM .
Метод display автоматически вызывается всегда, когда оказывается, что исполняемый оператор не заканчивается точкой с запятой. Для многих классов метод display просто выводит на экран имя переменной, а затем использует преобразователь char для вывода символьного изображения объекта. Для рассматриваемого случая он может быть такого вида
function display(p)
% POLYNOM/DISPLAY вывод на экран полином-объекта disp('');
disp([' ',inputname(1),' = ',char(p),';']);
disp(''); % Завершение POLYNOM/DISPLAY % Завершение POLYNOM/DISPLAY
Проверим эффективность работы созданных трех М-файлов на простом примере. Сформируем вектор коэффициентов полинома
>> V = [0 0 0 -1 2 3 4 0 0 –6 -5 -7]
V = 0 0 0 -1 2 3 4 0 0 -6 -5 -7
Создадим на его основе полином-объект и сразу выведем его символьное изображение на экран. Для этого достаточно не поставить символ ' ; ' после обращения к функции polynom :
>>Pol1=polynom(V)
Pol1 = -1*x8 + 2*x7 + 3*x6 + 4*x5-6*x2-5*x - 7;
Создадим теперь полином-объект по заданным его корням и значению старшего коэффициента:
>> Pol2=polynom([1 2 3 4 5],-5)
Pol2 = -5*x5 + 75*x4 - 425*x3 + 1125*x2 - 1370*x + 600;