Главная страница

Учебное пособие для студентов высших учебных заведений


Скачать 5.41 Mb.
НазваниеУчебное пособие для студентов высших учебных заведений
Дата10.03.2022
Размер5.41 Mb.
Формат файлаpdf
Имя файлаmatlab.pdf
ТипУчебное пособие
#390741
страница21 из 44
1   ...   17   18   19   20   21   22   23   24   ...   44

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;

4.4. Создание методов нового класса
182
Проверим корни созданного полинома, используя процедуру roots (см. да- лее):
>> roots(Pol2)
ans = 5.0000 4.0000 3. 0000 2. 0000 1. 0000
Как свидетельствует результат, все созданные М-файлы работают нор- мально.
4.4. Создание методов нового класса
Весьма удобной в системе MatLAB является предоставляемая ею возмож- ность создания процедур, которые могут быть выполнены не только стандартным путем обращения к ее имени, но и более простым путем использования знаков арифметических действий, операций сравнения, скобок и т.п. С этим мы уже столкнулись в предыдущем разделе, убедившись, что процедура display выполня- ется не только при явном обращении вида display(х), но и неявно, если некоторый оператор формирует величину х, а после этого оператора отсутствует символ ' ; '.
Поэтому, если в любом новом классе объектов присутствует М-файл с именем
display, он будет выполняться во всех случаях, когда очередной оператор, соз-
дающий объект этого класса, не заканчивается точкой с запятой.
Приведем перечень имен таких М-файлов, предусмотренных системой
MatLAB, с указанием вида оператора их неявного вызова и краткого описания особенностей их использования.
Таблица 3.1. Операторные функции
Оператор
вызова
Имя М-
файла
Условное на-
звание
Особенности применения
+ a
uplus(a)
Добавление
знака плюс
Аргумент один. Результат - того же
класса.
- a
uminus(a)
Добавление
знака минус
Аргумент один. Результат - того же
класса
a + b
plus(a,b)
Сложение
Два аргумента. Результат - того же
класса, что и аргументы
a - b
minus(a,b)
Вычитание
Два аргумента. Результат - того же
класса, что и аргументы
a * b
mtimes(a,b)
Умножение
Два аргумента. Результат - того же
класса, что и аргументы
a / b
mrdivide(a,b)
Правое деле-
ние
Два аргумента. Результат - того же
класса, что и аргументы
a \ b
mldivide(a,b)
Левое деление Два аргумента. Результат - того же
класса, что и аргументы
a ^ b
mpower(a,b)
Степень
Два аргумента. Результат - того же
класса, что и аргументы
a . * b
times(a,b)
Умножение
поелементное
Два аргумента. Результат - того же
класса, что и аргументы

4.4. Создание методов нового класса
183
a . / b
rdivide(a,b)
Правое делени
поелементное
Два аргумента. Результат - того же
класса, что и аргументы
a . \ b
ldivide(a,b)
Левое деление
поелементное
Два аргумента. Результат - того же
класса, что и аргументы
a . ^ b
power(a,b)
Степень
поелементная
Два аргумента. Результат - того же
класса, что и аргументы
a < b
lt(a,b)
Меньше
Два аргумента.
Результат - логическая величина
a > b
gt(a,b)
Больше
Два аргумента.
Результат - логическая величина
a <= b
le(a,b)
Меньше или
равно
Два аргумента.
Результат - логическая величина
a >= b
ge(a,b)
Больше или
равно
Два аргумента.
Результат - логическая величина
a = = b
eq(a,b)
Равно
Два аргумента.
Результат - логическая величина
a '
ctranspose(a)
Транспониро-
вание
Аргумент один.
Результат - того же класса.
a . '
transpose(a)
Транспониро-
вание
Аргумент один.
Результат - того же класса.
a : d : b
a : b
colon(a,d,b)
colon(a,b)
Формирова-
ние
вектора
Два или три аргумента.
Результат - вектор того же класса,
что и аргументы
вывести в
командное
окно
display(a)
Вывод на
терминал
Аргумент один. Результат - изобра-
жение на терминале символьного
представления аргумента .
[
a b]
horzcat(a,b,...)
Объединение
в строку
Два или больше аргумента. Резуль-
тат - вектор-строка из аргументов
[
a; b]
vertcat(a,b,...)
Объединение
в столбец
Два или больше аргумента. Резуль-
тат - вектор-столбец из аргументов
a(s1,...sn)
subsref(a,s)
Индексная
ссылка
a(s1,...sn)=b
subsasgn(a,s,b)
Индексное
выражение
b(a)
subsindex(a,b)
Индекс
подмассива
Перечисленные процедуры в MatLAB могут быть переопределены под теми же именами во всех новообразованных подкаталогах новых классов. После этого обычные операторы арифметических действий и операций сравнения могут при- меняться и при оперировании объектами новых классов. Смысл этих операций, конечно, может значительно отличаться от обычного и будет определяться со- держимым соответствующих М-файлов в подкаталогах классов.
Учитывая это, можно сделать вывод, что М-файлов с названиями, указан- ными в таблице 3.1, может быть много. MatLAB различает их по типу аргументов, указанных в перечне входных параметров.

4.4. Создание методов нового класса
184
Создадим, например, операцию (метод) сложения полиномов, используя операторную процедуру plus. Текст соответствующего М-файла для подкаталога
@POLYNOM
приведен ниже.
function r=plus(p,q)
% POLYNOM/PLUS Сложение полиномов r = p + q
p = polynom(p);
q = polynom(q);
k = q.n - p.n;
r = polynom([zeros(1,k) p. c]+[zeros(1,-k) q. c]);
% Завершение POLYNOM/PLUS
Сначала процедура превращает оба аргумента в класс polynom. Это нужно для того, чтобы метод работал и тогда, когда один из аргументов задан как вектор, или когда в качестве аргумента используется выражение типа p + r, где p - поли- ном-объект, а r - число. Затем процедура дополняет нулями векторы коэффици- ентов полиномов-слагаемых, если в этом возникает необходимость (при неодина- ковых порядках полиномов). Фактически сложение сводится к сложению этих ис- правленных векторов коэффициентов. Заключительная операция - по полученно- му вектору полинома суммы создается новый полином-объект с помощью конст- руктора полиномов. Проиллюстрируем работу этого метода на примере. Введем вектор коэффициентов первого полинома:
>> V1 = [ 2-3 0 6];
и создадим из него полином-объект
>> P1 = polynom(V1)
P1 = 2*x3-3*x2 + 6;
Аналогично создадим второй полином:
>> V2=[2 0 0 9 0 0 -3 +5];
>> P2=polynom(V2)
P2 = 2*x^7 + 9*x^4 - 3*x + 5;
Сложим эти полиномы:
>> P1+P2
В результате получим: ans = 2*x7 + 9*x4 + 2*x3-3*x2-3*x + 11;
Аналогичные результаты получаются и в случае, если один из аргументов "ошибочно" представлен вектором:
>> P1+V2
ans = 2*x^7 + 9*x^4 + 2*x^3 - 3*x^2 - 3*x + 11;
>> V1+P2
ans = 2*x7 + 9*x4 + 2*x3-3*x2-3*x + 11;
Однако если оба аргумента представлены векторами, система сразу же от- реагирует на это, обнаружив ошибку:
>> V1+V2
??? Error using Î +
Matrix dimensions must agree.
В этом случае система уже использует не М-файл plus из подкаталога
@POLYNOM
,
а встроенную аналогичную процедуру для векторов. А эта проце- дура осуществляет сложение векторов лишь при условии их одинаковой длины.
Поэтому и возникает ошибка.
Аналогичной является процедура вычитания полином-объектов:

4.4. Создание методов нового класса
185
function r=minus(p,q)
% POLYNOM/MINUS Вычитание полиномов r = p - q
p = polynom(p);
q = polynom(q);
k = q.n - p.n;
r = polynom([zeros(1,k) p. c]-[zeros(1,-k) q. c]);
% Завершение POLYNOM/MINUS
Проверим ее работу на примере:
>> P1-P2
ans = -2*x7-9*x4 + 2*x3-3*x2 + 3*x + 1;
Создадим еще такие методы класса polynom:
- метод double, который осуществляет обратную относительно создания по- лином-объекта операцию, - по заданному полиному определяет вектор его коэффициентов и порядок:
function [v,n]=double(p)
% POLYNOM/DOUBLE - преобразование полином-объекта
% в вектор его коэффициентов
% v=DOUBLE(p) превратит полином-объект "р" в вектор "v",
% содержащий коэффициенты полинома в порядке уменьшения
% степени аргумента
% Обращение [v,n]=DOUBLE(p) позволяет получить также
% значение "n" порядка этого полинома.
v= p.c;
n= p. n;
% Завершение POLYNON/DOUBLE
- метод diff, который создает полином-объект, являющийся производной от заданного полинома
function q = diff(p)
% POLYNOM/DIFF формирует полином-производную "q"
% от заданного полинома "р"
p = polynom(p);
d = p.n;
q = polynom(p. c(1:d). *(d:-1:1));
% Завершение POLYNOM/DIFF
- метод
mtimes; он создает полином-объект, являющийся произведением двух заданных полиномов:
function r = mtimes(p,q)
% POLYNOM/MTIMES Произведение полиномов: r = p * q
p = polynom(p);
q = polynom(q);
r = polynom(conv(p. c,q. c));
% Завершение POLYNOM/MTIMES
- метод
mrdivide; он создает два полином-объекта, один из которых является частным от деления первого из указанных полиномов на второй, а второй – остатком такого деления:
function rez = mrdivide(p,q)
% POLYNOM/MRDIVIDE Деление полиномов: r = p / q
p = polynom(p);
q = polynom(q);
[rr,ro]=deconv(p.c,q.c);
rez{1}=polynom(rr);
rez{2}=polynom(ro);
% Завершение POLYNOM/MRDIVIDE
- метод roots создает вектор корней заданного полинома:
function r = roots(p)

4.4. Создание методов нового класса
186
% POLYNOM/ROOTS вычисляет вектор корней полинома "р"
p = polynom(p);
r = roots(p. c);
% Завершение POLYNOM/ROOTS
- метод polyval вычисляет вектор значений заданного полинома по заданному вектору значений его аргумента:
function y = polyval(p,x)
% POLYNOM/POLYVAL вычисляет значение полинома "р"
% по заданному значению аргумента "х"
p = polynom(p);
y =0;
for a = p.c
y = y. *x + a;
end
% Завершение POLYNOM/POLYVAL
- метод plot строит график зависимости значений заданного полинома в диа- пазоне значений его аргумента, который содержит все его корни:
1   ...   17   18   19   20   21   22   23   24   ...   44


написать администратору сайта