Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Matlab / Matlab / Matlab - Lazarev.pdf
Скачиваний:
133
Добавлен:
18.05.2015
Размер:
5.67 Mб
Скачать

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;

Соседние файлы в папке Matlab