Лекция 7
Решение типовых математических задач
Действия с полиномами (многочленами)
Среди математических задач часто возникает необходимость использовать полиномы или как их еще называют степенные многочлены. В ML предусмотрены функции для работы с ними. С помощью этих функций можно вычислить значение полинома, найти его корни, выполнить операции умножения и деления полиномов и т.д.
Полином (многочлен) определяется выражением вида:
P(x)=a1xn+a2xn-1+…..+anx+an+1
В системе Matlab полином задаётся и хранится в виде вектора, элементами которого являются коэффициенты полинома:
P=[a1 a2 …an an+1]
Число элементов вектора должно быть на единицу больше степени полинома. Если в полиноме отсутствует слагаемое, соответствующее какой-либо степени х, то в этом случае в векторе в качестве значения коэффициента записывается ноль.
Например, пусть задан полином x7+3.2x5-5.2x4+0.5x2+x-3. Вектор коэффициентов полинома будет иметь вид:
p=[1, 0 , 3.2 , -5.2 , 0 , 0.5 , 1 , -3]
Вычислить корни полинома можно с помощью функции roots. Число корней определяется степенью полинома:
>> p=[1 , 0, 3.2, -5.2, 0, 0.5, 1, -3];
>> x=roots(p)
x =
-0.5668 + 2.0698i
-0.5668 - 2.0698i
-0.6305 + 0.5534i
-0.6305 - 0.5534i
1.2149
0.5898 + 0.6435i
0.5898 - 0.6435i
Результат – вектор-столбец. Число корней должно совпадать со степенью полинома. В данном случае найдены семь корней, из которых один вещественный и шесть комплексных.
Для построения графика надо задать 2 вектора вектор значений и вектор аргумента (например, x=roots(p); a=-1:0.05:3;).
Если необходимо нанести на график значения корней, то для того, чтобы отметить только действительные корни, можно использовать следующую последовательность команд:
for i=1:length(x) % цикл по количеству элементов
if imag(x(i))==0
plot(x(i),0,'*r')
end;
end;
Можно вычислить значения полинома при некотором значении аргумента. Для этого предназначена функция polyval(p, x), где p – вектор коэффициентов полинома; х – значение аргумента, при котором надо вычислить значение полинома.
Например,
>>p=[1 0 3.2 -5.2 0 0.5 1 -3];
>>Y=polyval(p,1)
Y =
-2.5000
В результате будет вычислено значение полинома p при x=1.
В качестве аргумента х может быть указан вектор или матрица. В результате получится вектор или матрица того же размера, что и аргумент:
>> p=[1 0 3.2 -5.2 0 0.5 1 -3]; x=1:4;
Y=polyval(p,x)
Y =
1.0e+004 * %Это множитель, на который надо умножить каждый элемент
-0.0003 0.0148 0.2548 1.8339
Элементы вектора Y – значения полинома, вычисленные для каждого элемента вектора X.
Текст скрипт-файла:
p=[1 , 0, 3.2, -5.2, 0, 0.5, 1, -3];
x=roots(p);
a=-1:0.05:3;
y=polyval(p,a);
plot(a,y);
hold on
for i=1:length(x) % цикл по количеству элементов
if imag(x(i))==0
plot(x(i),0,'*r')
end;
end;
Можно восстановить коэффициенты полинома, применив функцию
>> p1=poly(X)
p1 =
Columns 1 through 5
1.0000 0.0000 3.2000 -5.2000 0.0000
Columns 6 through 8
0.5000 1.0000 -3.0000
Однако, если коэффициент у старшей степени не 1, то полученный вектор надо умножить на коэффициент, равный старшей степени (p1*n).
Чтобы вычислить производную от полинома, следует использовать функцию polyder. Результатом этой функции является вектор, элементы которого представляют собой коэффициенты полинома-производной от исходного полинома:
>> p=[1 0 3.2 -5.2 0 0.5 1 -3];
>> polyder(p)
ans =
Columns 1 through 5
7.0000 0 16.0000 -20.8000 0
Columns 6 through 7
1.0000 1.0000
Для выполнения умножения и деления полиномов предназначены функции conv и deconv:
Z=conv(P1,P2),
где P1, P2 – полиномы, заданные векторами; Z – результирующий вектор коэффициентов полинома, полученного в результате перемножения полиномов, заданных векторами P1, P2.
[R1, R2]=deconv(P1,P2)
Результат работы этой функции – два вектора R1, R2, где R1, R2 – векторы коэффициентов полинома-частного и полинома-остатка, полученного в результате деления полиномов, заданных векторами P1,P2.
