Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Начала прогаммирования в среде MatLab / Начала программирования в среде MatLab.pdf
Скачиваний:
254
Добавлен:
02.05.2014
Размер:
5.66 Mб
Скачать

3.2. Производные классы MatLAB

171

 

 

 

4.2. Производные классы MatLAB

Рассмотренные ранее классы вычислительных объектов построены таким образом, что на их основе пользователь имеет возможность создавать новые собственные классы объектов.

Всамой системе MatLAB на этой основе создан и используется встроенный класс inline, который предоставляет простой способ определения встроенных функций для применения в программах вычисления интегралов, решения дифференциальных уравнений и вычисления минимумов и нулей функций. Пакет символьных вычислений Symbolic Math Toolbox базируется на классе объектов sym, который позволяет выполнять вычисления с символьными переменными и матрицами. Пакет Control System Toolbox использует класс объектов lti и три его дочерних подкласса tf, zpk, ss, которые поддерживают алгоритмы анализа и синтеза линейных стационарных систем автоматического управления.

Вязыке MatLAB отсутствует необходимость и возможность предварительного объявления типа или класса переменных, которые будут использованы. То же самое относится и к объектам любых вновь создаваемых классов.

Объекты класса создаются в виде структур (записей), т. е. к потомкам

(наследникам) класса struct. Поля структуры и операции с полями являются доступными только внутри методов данного класса.

Все М-файлы, определяющие методы объектов данного класса, должны размещаться в специальном каталоге, который называется каталогом класса и обязательно имть имя, состоящее из знака @ (коммерческое 'эт') и имени класса, т. е. @<имя класса>. Каталог класса должен быть подкаталогом одного из каталогов, описанных в путях доступа системы MatLAB, но не самим таким каталогом. Каталог класса обязательно должен содержать М-файл с именем, совпадающим с именем класса. Этот файл называют конструктором класса. Назначение такого М-файла - создавать объекты этого класса, используя данные в виде массива записей (структуры) и приписывая им метку класса.

4.2.1.Класс объектов inline

ВMatLAB определен класс объектов inline. Он предназначен для описания функций в виде F(x, P1, P2, ...), который соответствует их математическому описанию. При таком представлении вычисления функции при заданных значениях аргумента x и параметров P1, P2, ... может осуществляться путем обращения к ней в естественной форме, например, F(0.6, -0.5, 3).

Классу inline соответствует подкаталог @INLINE каталога TOOLBOX/MATLAB/FUNFUN. В нем содержатся такие М-файлы:

- конструктор inline; - методы класса

argnames disp

formula nargin

vectorize

cat

display

horzcat nargout

vertcat

3.2. Производные классы MatLAB

172

char

feval

subsref

 

 

Конструктор inline. Эта процедура создает inline-объект, т. е. функцию, заданную в символьном виде, что позволяет обращаться к ней как к обычному математическому объекту. Процедура имеет несколько форм обращения. Обращение вида F = inline('<математическое выражение>') образует символьное представление заданного математического выражения как функции. Аргумент функции определяется автоматически путем поиска в составе выражения одноместного символа, отличного от i и j. Если символ отсутствует, в качестве аргумента используется символ x. Если в выражении есть несколько одноместных символов, в качестве аргумента выбирается символ, ближайший к x по алфавиту, прежде всего - один из следующих за ним по алфавиту:

>> FUN1 = inline('am*sin(om*t+eps)')

FUN1 =

Inline function:

FUN1(t) = am*sin(om*t+eps)

Если обратиться в конструктора таким образом

F = inline('<математическое выражение>', 'имя1', 'имя2', ...),

то формируется функция, имеющая заданные в 'имя1', 'имя2', ... обозначения аргументов:

>>FUN2=inline('cos(alfa)*cos(beta)+...

sin(alfa)*sin(beta)*cos(gamma)','alfa','beta','gamma')

FUN2 =

Inline function:

FUN2(alfa,beta,gamma) = cos(alfa)*cos(beta)+sin(alfa)*sin(beta)*cos(gamma)

Наконец, при обращении вида

F = inline('<математическое выражение>', n),

создается функция, которая имеет один аргумент x и n параметров с заданными именами P1, P2, ... ,Pn. Т. е. в выражении, кроме некоторых заданных чисел, должны содержаться только аргумент x и параметры P1, P2, ... , Pn. Например:

>> Fun3= inline('P1+P2*x+P3*x^2',3)

Fun3 =

Inline function:

Fun3(x,P1,P2,P3) = P1+P2*x+P3*x2

Получение формулы функции. Это можно сделать при помощи любой из двух процедур класса inline - char(F) или formula(F) . Обе процедуры производят преобразование inline-объекта в символьный массив - строку, содержащую запись формулы функции:

>> s1=char(FUN2)

s1 =cos(alfa)*cos(beta)+sin(alfa)*sin(beta)*cos(gamma)

>> s2=formula(FUN2)

s2 =cos(alfa)*cos(beta)+sin(alfa)*sin(beta)*cos(gamma)

>> s3= formula(Fun3) s3 =P1+P2*x+P3*x^2

Вывод на экран. Процедуры disp(F) и display(F) осуществляют вывод на экран дисплея заданного inline-объекта (F) :

>> disp(Fun3)

Inline function:

Fun3(x,P1,P2,P3) = P1+P2*x+P3*x^2

>> display(Fun3)

3.2. Производные классы MatLAB

173

 

 

 

Fun3 =

Inline function:

Fun3(x,P1,P2,P3) = P1+P2*x+P3*x2

Процедуры незначительно различаются формой вывода. Основное их отличие в том, что процедура display работает и при неявном обращении - если имя этой процедуры не указывается, а в командной строке записано лишь имя inline-объекта :

>> Fun3

Fun3 =

Inline function:

Fun3(x,P1,P2,P3) = P1+P2*x+P3*x2

Получение имен аргументов inline-объекта. Это действие осуществляется процедурой argnames(F):

>> argnames(FUN1) ans = 't'

>> argnames(FUN2) ans = 'alfa'

'beta'

'gamma'

>> argnames(Fun3) ans = 'x'

'P1'

'P2'

'P3'

Векторизация функций. Часто желательно выражение для функции, которая записана для аргументов-чисел, преобразовать так, чтобы вычисление можно было осуществлять и тогда, когда аргументами являются векторы. Для этого в исходном выражении функции надо вставить символ '.' (точки) перед каждым знаком арифметической операции. Это делает процедура vectorize. Если аргументом этой процедуры есть символьное выражение, она формирует другое символьное выражение с указанными изменениями. В случае, когда аргумент - inline-объект, она создает новый inline-объект, в формуле которого произведены эти изменения. Приведем примеры:

>> s = char(Fun3) s =P1+P2*x+P3*x^2

>> sv = vectorize(s) sv =P1+P2. *x+P3. *x. ^2

>> Fun3v = vectorize(Fun3)

Fun3v =

Inline function:

Fun3v(x,P1,P2,P3) = P1+P2. *x+P3. *x. 2

Вычисление inline-объекта. Чтобы вычислить значения функции, представленной как inline-объект, по заданным значениям аргументов и параметров, достаточно после указания имени inline-объекта указать в скобках значения аргументов и параметров функции:

>>v = 0:0. 2:1

>>F3 =Fun3v(v, 2, 3, 4)

v =

0

0.2000

0.4000

0.6000

0.8000

1.0000

F3 =

2. 0000

2. 7600

3. 8400

5. 2400

6. 9600

9. 0000

Вычисление значения функции, заданной М-файлом. Наиболее важной

для практического программирования

сложных вычислительных алгоритмов

3.2. Производные классы MatLAB

174

 

 

 

процедурой класса inline является функция feval. С ее помощью можно производить вычисления по алгоритмам, которые являются общими для любой функции определенной структуры. В этом случае алгоритмы удобно строить общими для всего класса таких функций, а конкретный вид функции будет определяться отдельной процедурой в виде М-функции. При этом, имя этого М- файла должно быть в структуре общего алгоритма одной из переменных, чтобы, изменяя его конкретное значение, можно было применять алгоритм для любых функций той же структуры. В таком случае говорят, что функция является внешней (external) по отношению алгоритма.

Таким образом, процедура feval позволяет использовать внешние функции при программировании в среде MatLAB. Общий вид обращения и примеры применения процедуры feval приведены в разд. 2.6.1.

4.2.2. Классы пакета CONTROL

Пакет прикладных программ (ППП) Control System Toolbox (сокращенно - CONTROL) сосредоточен в подкаталоге CONTROL каталога TOOLBOX системы

MatLAB.

Основными вычислительными объектами этого ППП являются:

-родительский объект (класс) LTI - (Linear Time-Invariant System -

линейные, инвариантные во времени системы); в русскоязычной литературе за этими системами закрепилось название линейных стационарных систем (ЛСС);

-дочерние объекты (классы), т. е. подклассы класса LTI, которые отвечают трем разным представлениям ЛСС:

-TF - объект (Transfer Function - передаточная функция);

-ZPK - объект (Zero-Pole-Gain - нули-полюсы-коэффициент передачи);

-SS - объект (State Space - пространство состояния).

Объект LTI, как наиболее общий, содержит информацию, не зависящую от конкретного представления и типа ЛСС (непрерывного или дискретного). Дочерние объекты определяются конкретной формой представления ЛСС, т. е. зависят от модели представления. Объект класса TF характеризуется векторами коэффициентов полиномов числителя и знаменателя рациональной передаточной функции. Объект класса ZPK характеризуется векторами, которые содержат значения нулей, полюсов передаточной функции системы и коэффициента передачи системы. Наконец, объект класса SS определяется четверкой матриц, описывающих динамическую систему в пространстве состояний. Ниже приведены основные атрибуты этих классов, их обозначения и содержание.

Атрибуты (поля) LTI-объектов

Ниже NU, NY и NX определяют число входов (вектор U), выходов (вектор Y) и переменных состояния (вектор X) ЛСС соответственно; ОМ (SISO) - одномерная система, т. е. система с одним входом и одним выходом; ММ (MIMO) - многомерная система (с несколькими входами и выходами).

Специфические атрибуты передаточных функций (TF-объектов) num - Числитель

3.2. Производные классы MatLAB

175

 

 

 

 

 

 

Вектор-строка для ОМ-систем, для ММ-систем - массив ячеек из

 

 

векторов-строк размером NY-на-NU

 

 

 

 

(например, {[1 0] 1 ; 3 [1 2 3]}).

 

 

den

- Знаменатель

 

 

 

 

Вектор-строка для ОМ-систем, для ММ-систем - массив ячеек из

 

 

 

 

векторов-строк размером NY-на-NU. Например:

 

 

 

 

tf( {-5 ; [1-5 6]} , {[1-1] ; [1 1 0]})

 

 

 

 

определяет систему с одним входом и двумя выходами

 

 

 

 

[ -5/(s-1) ]

 

 

 

 

[ (s2-5s+6)/(s2+s) ]

 

 

Variable - Имя (тип) переменной (из перечня).

 

 

 

 

Возможные варианты: 's', 'р', 'z', 'z-1' или 'q'. По умолчанию прини-

 

 

мается 's' (для непрерывных переменных) и 'z' (для дискретных).

Имя

 

 

переменной влияет на отображение и создает дискретную ПФ для

 

 

дискретных сигналов

 

 

 

 

Специфические атрибуты ZPK-объектов

 

 

z

- Нули

 

 

 

Вектор-строка для ОМ-систем, для ММ-систем - массив ячеек из

 

 

 

 

векторов-строк размером NY-на-NU

 

 

p

- Полюсы

 

 

 

Вектор-строка для ОМ-систем, для ММ-систем - массив ячеек из

 

 

 

 

векторов-строк размером NY-на-NU

 

 

k

- Коэффициенты передачи

 

 

 

 

Число - для ОМ-систем, NY-на-NU матрица для ММ-систем.

 

 

Variable

- Имя (тип) переменной (из перечня)

 

 

 

 

То же, что и для TF (см. выше)

 

 

 

Специфические атрибуты SS-объектов (моделей пространства

 

 

 

 

состояния)

 

 

a,b,c,d

- A,B,C,D матрицы, соответствующие уравнениям в пространстве

 

 

состояния

 

 

 

 

.

 

 

 

 

Еx = Ax + Bu , y = Cx + Du ,

 

 

e

 

- E матрица для систем пространства состояния.

 

 

 

 

По умолчанию E = eye(size(A)).

 

 

StateName

- имена переменных состояния (не обязательное).

 

 

 

 

NX-на-1 массив ячеек из строк

 

 

 

 

(используйте '' для состояний без имени)

 

 

 

 

Пример: {'position' ; 'velocity'}.

 

 

 

 

Атрибуты, общие для всех LTI-моделей

 

 

Ts

 

- Дискрет по времени (в секундах).

 

 

 

 

Положительный скаляр (период дискретизации) для дискретных

 

 

систем

 

 

 

 

Ts=-1 для дискретных систем с неустановленной частотой

 

 

 

 

дискретизации. Ts = 0 для непрерывных систем.

 

 

Td

 

- Задержки входов (в секундах).

 

 

 

 

1-на-NU вектор промежутков времени задержек входов.

 

 

 

 

Установление Td как скаляра определяет единую задержку

 

 

3.2. Производные классы MatLAB

 

 

 

176

 

по всем входам. Используется только для непрерывных систем.

 

 

Используйте D2D для установки задержек в дискретных

 

 

 

системах. Td = [] для дискретных систем.

 

 

 

InputName

- Имена входов.

 

 

 

 

 

 

 

Строка для систем с одним входом. NU-на-1 массив ячеек

 

из строк для систем с несколькими входами

 

 

 

 

(используйте '' для переменных без имени).

 

 

 

 

Примеры: 'torque' или {'thrust' ; 'aileron deflection'}.

 

 

OutputName - Имена выходов.

 

 

 

 

 

 

 

Строка для систем с одним выходом. NY-на-1 массив ячеек

 

из строк для систем с несколькими выходами

 

 

 

 

(используйте '' для переменных без имени).

 

 

 

 

Пример: 'power'

или {'speed' ; 'angle of attack'}.

 

 

 

Notes

- Заметки.

 

 

 

 

 

 

 

Любая строка или массив ячеек из строк символов.

 

 

 

Пример: 'Эта модель создана в течение 2000 года'.

 

 

Userdata

- Дополнительная информация или данные.

 

 

 

 

Может быть любого типа МATLAB.

 

 

 

 

Приведем перечень методов класса LTI:

 

 

 

 

augstate

damp

get

issiso

lticheck

pade

series

trange

balreal

display

gram

kalman

margin

parallel

set

tzero

bode

dssdata

impulse

kalmd

modred

pzmap

sigma

uplus

canon

eig

inherit

lqgreg

nichols

quickset

ss2ss

zpkdata

connect

estim

initial

lqry

norm

reg

ssdata

 

 

covar

evalfr

isct

lsim

nyquist

rlocfind

step

 

 

ctrb

fgrid

lti

obsv

rlocus

tfdata

 

 

 

Конструктором LTI-объектов является файл lti. m в поддиректории @LTI. Он создает только шаблон LTI-объекта по некоторым его параметрам. Ниже приведен его текст:

function sys = lti(p,m,T)

%LTI Конструктор LTI-объекта

%SYS = LTI(P,M) создает LTI-объект размером P-на-M

%SYS = LTI(P,M,T) создает LTI-объект размером P-на-M с дискретом времени Т

%По умолчанию система непрерывна, а имена входа/выхода являются

%векторами ячеек с пустыми строками

ni = nargin; error(nargchk(1,3,ni)) if isa(p,'lti')

%Дублирование LTI-объекта sys = p;

return

elseif ni==3 & T~=0, sys.Ts = T; sys.Td = [];

else

sys.Ts = 0;

sys.Td = zeros(1,m); end

estr = {''};

sys.InputName = estr(ones(m,1),1);

3.2. Производные классы MatLAB

177

 

 

 

sys.OutputName = estr(ones(p,1),1); sys.Notes = {};

sys.UserData = []; sys.Version = 1.0; sys = class(sys,'lti'); % Конец @lti/lti. m

Как видно из приведенного описания, непосредственное применение конструктора lti дает возможность задать только количество входов и выходов ЛСС, а также величину дискрета времени. Другие атрибуты LTI-объекта могут быть определены только употреблением других процедур. Имена входов и выходов и некоторые вспомогательные данные можно задать процедурой set. Конкретные же числовые характеристики ЛСС возможно задать лишь с помощью применения одного из конструкторов дочерних классов.

Рассмотрим пример создания LTI-объекта для непрерывной ОМ-системы:

>> sys=lti(1,1) lti object

Чтобы убедиться, что созданный LTI-объект имеет именно указанные параметры, воспользуемся процедурой get(sys) для получения значений его атрибутов:

>> get(sys)

Ts = 0

Td = 0 InputName = {''} OutputName = {''} Notes = {} UserData = []

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

LTI-объекта, как InputName, OutputName, Notes и UserData . Последнее можно сделать, лишь используя специальную функцию set по схеме

set (<имя LTI-объекта>,'<имя поля>', <Значение>).

Рассмотрим это на примере установления значений некоторых из указанных полей в уже сформированном LTI-объекте sys:

>>set(sys,'InputName','Угол','OutputName','Напряжение','Notes','Гиротахометр').

Проконтролируем результат:

>> get(sys)

Ts = 0