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
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" его % старшего коэффициента. |