Вы находитесь на странице: 1из 18

1

Лекция 5. Численные методы


1. Операции с многочленами.
2. Вычисление корней уравнения.
3. Аппроксимация и интерполяция.
4. Минимизация функций.
5. Численное интегрирование.
5.1. Операции с многочленами
Многочлен — это функция, в которой с аргументом допускаются алгебраические
операции сложения, вычитания, умножения на константу и возведения в целую
положительную степень:

p( x) = an x n + an −1 x n −1 + ... + a1 x + a0
Порядок многочлена равен высшей степени аргумента — n.
Полином и целая рациональная функция — синонимы многочлена.
Рациональная функция отличается от многочлена тем, что с аргументом допускается
также операция возведения в целую отрицательную степень.
Дробно-рациональная функция — это функция, получаемая в результате деления
двух рациональных функций. Очевидно, что любую дробно-рациональную функцию
можно представить как отношение многочленов.
В MATLAB многочлен представляется вектором коэффициентов в порядке
убывания степеней [ an an −1 ... a1 a0 ] длиной ( n + 1) .

Представим многочлен 5-го порядка p( x) = 4 x5 + 2 x 4 + 7 x3 + x 2 + 8 x + 9 :

>> p = [4 2 7 1 8 9];

Умножение многочленов
Умножение многочленов эквивалентно операции свертки их векторов
коэффициентов — конволюции, выполняемой с помощью функции:
c = conv(a,b)
где:
a,b — коэффициенты многочленов сомножителей в порядке убывания степеней —
векторы длиной ( m + 1) и ( n + 1) соответственно;
c — коэффициенты многочлена произведения в порядке убывания степеней —
вектор длиной [ ( m + 1) + ( n + 1) − 1] .
Найдем произведение многочленов:

p1 ( x) = x3 + 3 x 2 + 5 x + 7 — порядок m = 3 — вектор p1 длиной (m + 1) = 4 ;


2

p2 ( x) = 4 x5 + 2 x 4 + 7 x3 + x 2 + 8 x + 9 — порядок n = 5 — вектор p2 длиной


(n + 1) = 6 .
Определим коэффициенты многочлена-произведения — вектор c
>> p1 = [1 3 5 7]; p2 = [4 2 7 1 8 9];
>> c = conv(p1,p2)
c =
4 14 33 60 60 87 74 101 63

Вектор коэффициентов c имеет длину [(m + 1) + (n + 1) − 1] = 4 + 6 − 1 = 9 , а


многочлен — порядок ( m + n) = 8 :

c( x) = 4 x8 + 14 x 7 + 33x 6 + 60 x5 + 60 x 4 + 87 x3 + 74 x 2 + 101x + 63 .

Результат легко проверить (показать на примере и старшего порядка 4x8 и


свободного члена 63 ).
Деление многочленов
Деление многочленов выполняется с помощью функции:
[a,b] = deconv(p,q)
где:
p,q — коэффициенты многочленов делимого и делителя в порядке убывания
степеней — векторы длиной (m + 1) и (n + 1) соответственно;
a,b — коэффициенты многочленов частного и остатка в порядке убывания
степеней: при m ≥ n — соответственно векторы длиной [ (m + 1) − (n + 1) + 1] и
(m + 1) , а при m < n — соответственно скаляр, равный 0 (целая часть равна нулю), и
вектор коэффициентов делимого длиной (m + 1) .

Разделим многочлен c( x) на многочлен p1 ( x) :


>> c = [4 14 33 60 60 87 74 101 63]; p1 = [1 3 5 7];
>> [a,b] = deconv(c,p1)
a =
4 2 7 1 8 9
b =
0 0 0 0 0 0 0 0 0
В данном случае вектор коэффициентов c делимого имеет длину ( m + 1) = 9 , а
вектор коэффициентов p1 делителя — длину ( n + 1) = 4 , т. е. m > n , следовательно:

• вектор a коэффициентов частного длиной [ ( m + 1) − ( n + 1) + 1] = 9 − 4 + 1 = 6


соответствуют многочлену p2 ( x) ;
3

• вектор b коэффициентов многочлена остатка длиной ( m + 1) = 9 соответствуют


нулевому остатку, т. е. многочлены поделены нацело.
Разделим многочлен p1 ( x) на многочлен p2 ( x) :
>> p1 = [1 3 5 7 9]; p2=[4 2 7 1 8 9];
>> [a,b] = deconv(p1,p2)
a =
0
b =
1 3 5 7 9
В данном случае вектор коэффициентов p1 делимого имеет длину ( m + 1) = 5 , а
вектор коэффициентов p2 делителя — длину ( n + 1) = 6 , т. е. m < n , следовательно:
• вектор a коэффициентов частного равен скаляру 0 (целая часть равна нулю);
• вектор b коэффициентов многочлена остатка длиной ( m + 1) = 5 соответствуют
многочлену делимого — x 4 + 3 x3 + 5 x 2 + 7 x + 9 ⇒ p1 ( x) .
Вычисление корней многочлена
Корни многочлена (в общем случае комплексно сопряженные) определяются с
помощью функции:
c = roots(p)
где:
p — коэффициенты многочлена в порядке убывания степеней — вектор длиной
(n + 1) ;
c — корни многочлена — вектор-столбец длиной n.

Найдем корни квадратного уравнения x 2 − x + 4 = 0 :


>> p = [1 -1 4];
>> c = roots(p)
c =
0.5000 + 1.9365i
0.5000 - 1.9365i

1 1
Проверим: x1,2 = ± − 4 ≈ 0,5 ± 1,9365i .
2 4
Найдем корни уравнения x7 + 2 x 6 + 0,5 x5 + x 4 + 3 x3 + x 2 + 7 x − 3 = 0 :
>> p = [1 2 0.5 1 3 1 7 -3];
>> c = roots(p)
c =
4

-1.7705 + 0.5886i
-1.7705 - 0.5886i
-0.2834 + 1.1722i
-0.2834 - 1.1722i
0.8640 + 0.9018i
0.8640 - 0.9018i
0.3799
Получены три пары комплексно сопряженных корней и один вещественный.
Восстановление многочлена по его корням
Обратная процедура — восстановление коэффициентов многочлена по его корням
выполняется с помощью функции:
p = poly(c)
где:
c — корни многочлена — вектор-столбец длиной n;
p — коэффициенты многочлена в порядке убывания степеней — вектор длины
(n + 1) .

Восстановим коэффициенты уравнения x 2 − x + 4 = 0 по его корням:


>> c = [0.5+1.9365i;0.5-1.9365i];
>> p = poly(c)
p =
1.0000 -1.0000 4.0000
Вычисление значений многочлена
Значение многочлена вычисляются с помощью функции:
y = polyval(p,x)
где:
p — коэффициенты многочлена в порядке убывания степеней — вектор длиной
(n + 1) ;
x — значения аргумента — скаляр, вектор или матрица;
y — значения многочлена при заданном x.

Определим значение многочлена p( x) = x 6 + 3x5 + 6 x 4 + 2 x3 + 4 x 2 + 9 x + 7 в точке


x = 0, 725 :
>> p = [1 3 6 2 4 9 7];
>> y = polyval(p,0.725)
y =
18.7935
5

Значения многочлена y можно определить сразу в нескольких точках, заданных


вектором или матрицей x. Например, для значений x, заданных вектором:
>> p = [1 3 6 2 4 9 7];
>> x = [1 2 3]
x =
1 2 3
>> y = polyval(p,x)
y =
32 313 2068
Если значения x заданы матрицей, то значения многочлена y определяются
относительно столбцов матрицы x:
>> p = [1 3 6 2 4 9 7]; x = [1 0 0;0 1 0;0 0 1]
x =
1 0 0
0 1 0
0 0 1
>> y = polyval(p,x)
y =
32 7 7
7 32 7
7 7 32
Определение производной многочлена
Производная многочлена является, в свою очередь, многочленом, коэффициенты
которого определяются с помощью функции:
dp = polyder(p)
где:
p — коэффициенты исходного многочлена в порядке убывания степеней — вектор
длиной ( n + 1) ;
dp — коэффициенты производной многочлена — вектор длиной n.
Найдем производную многочлена x7 + 2 x 6 + 0,5 x5 + x 4 + 3x 3 + x 2 + 7 x − 3 :
>> p = [1 2 0.5 1 3 1 7 -3];
>> c = polyder(p)
c =
7.0000 12.0000 2.5000 4.0000 9.0000 2.0000 7.0000

Получили многочлен 7 x 6 + 12 x5 + 2,5 x 4 + 4 x3 + 9 x 2 + 2 x + 7 .


Представление дробно-рациональной функции в виде суммы простых дробей
6

Дробно-рациональная функция порядка m может быть представлена в виде суммы


простых дробей:
r1 r r
+ 2 + ... + m + k ( x)
x − p1 x − p2 x − pm
с помощью функции:
[r,p,k] = residue(a,b)
где:
a,b — коэффициенты многочленов числителя и знаменателя дробно-рациональной
функции в порядке убывания степеней — векторы;
r — коэффициенты разложения ri при полюсах pi — вектор-столбец;
p — полюсы pi — вектор-столбец;
k — коэффициенты многочлена целой части — вектор; если порядок многочлена
числителя меньше порядка знаменателя, будет выведена "пустая" матрица k = [].
2x −1
Разложим на простые дроби дробно-рациональную функцию 2
:
x + 8 x + 12
>> a = [2 -1]; b = [1 8 12];
>> [r,p,k] = residue(a,b)
r =
3.2500
-1.2500
p =
-6
-2
k =
[]
Получили сумму простых дробей:
3, 25 −1, 25
+ .
x − (−6) x − (−2)
Обратная процедура — представление суммы простых дробей в виде дробно-
рациональной функции выполняется с помощью той же функции:
[a,b] = residue(r,p,k)
Решим обратную задачу. Представим сумму простых дробей в виде дробно-
рациональной функции:
>> r = [3.25 -1.25];
>> p=[-6 -2];
>> k=[];
7

>> [a,b] = residue(r,p,k)


a = 2 -1
b = 1 8 12
Получили коэффициенты исходной дробно-рациональной функции.
5.2. Вычисление корней уравнения
Корни уравнения:
f ( x) = 0 ,
где f ( x) — любая функция на заданном интервале, ищутся в два этапа:
1. Первый этап — отделение корней.
Определяются области (в общем случае их несколько), внутри которых
существует один и только один корень, т. е. области, в которых функция f ( x)
меняет знак один и только один раз. Отделение корней удобно производить с
помощью графика функции f ( x) .
2. Второй этап — уточнение корней.
Вычисление корней с помощью функции:
xi = fzero('fun',x0,tol)
где:
fun — имя внешней функции f ( x) либо непосредственно функция f ( x) в
апострофах; в последнем случае аргумент обязательно должен иметь имя x,
иначе будет выдано сообщение об ошибке;
x0 — точка, в окрестности которой вычисляется корень, слева от него — начало
итерационной процедуры вычисления корня; если корень отсутствует, выдается
NaN;
xi — i-й корень уравнения
tol — необязательный параметр, задающий точность вычисления корня, по
умолчанию равен eps.

Определим корни уравнения ecos( x ) − 1 = 0 на интервале [ 0; 2π ] .

На первом этапе построим график функции y ( x) = ecos( x ) − 1 на интервале


[0; 2π ] :
>> x = 0:pi/32:2*pi; y = sqrt(exp(cos(x)))-1;
>> plot(x,y), grid, gtext('x1'), gtext('x2')
Функция gtext позволяет поместить текст в поле графика на произвольном месте
(рис. 1). В заданной области [ 0; 2π ] функция имеет два корня — x1 и x2.
8

0.8

0.6

0.4

0.2

0
x1 x2

-0.2

-0.4
0 1 2 3 4 5 6 7

Рис. 1. График функции для отделения корней


На втором этапе найдем корни: сначала x1, задавая начальную точку x0 = 1:
>> x1 = fzero('sqrt(exp(cos(x)))-1',1)
Zero found in the interval: [0.36, 1.64].
x1 =
1.5708
затем — x2, задавая начальную точку x0 = 4:
>> x2 = fzero('sqrt(exp(cos(x)))-1',4)
Zero found in the interval: [3.0949, 4.9051].

x2 =

4.7124

5.3. Аппроксимация и интерполяция


Во многих приложениях возникает задача приближения функций, решаемая с
помощью аппроксимации и интерполяции.
Аппроксимация — это способ приближения функций, при котором одна функция
(аппроксимируемая), заданная в узлах сетки, заменяется другой — функцией
9

наилучшего приближения (аппроксимирующей) по заданному критерию


аппроксимации.
Интерполяция — это способ приближения функций, при котором одна функция
(интерполируемая), заданная в узлах редкой сетки (узлах интерполяции), заменяется
другой (интерполирующей), совпадающей с интерполируемой в узлах интерполяции
и известной в любой промежуточной точке между ними, т. е. на частой сетке.
Аппроксимация многочленом
В MATLAB в качестве аппроксимирующей функции используются многочлен n-го
порядка и среднеквадратичный критерий аппроксимации — минимум среднего
квадрата ошибки аппроксимации на интервале аппроксимации.
Аппроксимируемая функция задается в узлах равномерной или неравномерной сетки,
а коэффициенты аппроксимирующей функции — многочлена n-го порядка —
определяются с помощью функции:
p = polyfit(x,y,n)
где:
x,y — значения аргумента и аппроксимируемой функции в узлах равномерной или
неравномерной сетки — векторы;
n — порядок аппроксимирующего многочлена;
p — вектор коэффициентов аппроксимирующего многочлена.
sin( x)
Аппроксимируем функцию y ( x) = , заданную на равномерной сетке —
x
π  π
интервале  8 ; 4 π  с шагом , многочленом 5-го порядка. Коэффициенты
  8
многочлена вычислим с помощью функции polyfit, а его значения в узлах сетки —
с помощью функции polyval. Выведем графики аппроксимируемой функции y,
аппроксимирующего многочлена p и ошибки аппроксимации error в узлах заданной
сетки (рис. 2):
>> x = pi/8:pi/8:4*pi; y = sin(x)./x;
>> p = polyfit(x,y,5); fa = polyval(p,x);
>> plot(x,y,'-or', x,fa,'-ob','LineWidth',2.5,...
'MarkerFaceColor','w','MarkerSize',4), grid, hold on
>> error = abs(fa-y);
>> stem(x,error,'fill','-k','MarkerSize',4)
>> legend('sin(x)/x','Polinomial degree 5','Error')
10

1.2
sin(x)/x
1 Polinomial degree 5
Error

0.8

0.6

0.4

0.2

-0.2

-0.4
0 2 4 6 8 10 12 14

Рис. 2. Аппроксимация функции, заданной на равномерной сетке


Аппроксимируем ту же функцию, заданную на интервале [0,1; 4,5] , многочленом 2-
го порядка на неравномерной сетке (рис. 3):
>> x = [0.1 0.3 0.5 0.75 0.9 1.1 1.3 1.75 2.2 2.5 2.8 3.1...
3.5 4.2 4.5];
>> y = sin(x)./x; p = polyfit(x,y,2); fa = polyval(p,x);
>> plot(x,y,'-or', x,fa,'-ob','LineWidth',2.5,...
'MarkerFaceColor','w','MarkerSize',4), grid, hold on
>> error = abs(fa-y);
>> stem(x,error,'fill','-k','MarkerSize',4)
>> legend('sin(x)/x','Polinomial degree 2','Error')
11

1.2
sin(x)/x
1 Polinomial degree 2
Error

0.8

0.6

0.4

0.2

-0.2

-0.4
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5

Рис. 3. Аппроксимация функции, заданной на неравномерной сетке


Интерполяция функции одной переменной
Интерполяция функции одной переменной выполняется с помощью функции:
fi = interp1(x,y,xi[,'<метод>'])
где:
x — вектор, формирующий равномерную или неравномерную редкую сетку (узлы
интерполяции);
y — значения интерполируемой функции в узлах интерполяции;
xi — вектор, формирующий равномерную частую сетку; включает узлы
интерполяции; шаг не превосходит минимального расстояния между ними;
fi — значения интерполирующей функции в узлах частой сетки;
'<метод>' — вид интерполирующей функции:
'nearest' — многочлен 0-го порядка;
'linear' — многочлен 1-го порядка (линейная интерполяция по умолчанию);
'cubic' — многочлен 3-го порядка (кубический многочлен);
'spline' — кубический сплайн;
Разница между кубическим многочленом и кубическим сплайном заключается в том,
что коэффициенты кубического многочлена находятся из условия его непрерывности
12

в узлах интерполяции, а кубического сплайна, тоже кубического многочлена, — из


условия его непрерывности и непрерывности первой и второй производных в узлах
интерполяции.
Выполним интерполяцию кубическим многочленом и кубическим сплайном
sin( x)
функции y ( x) = , заданной в узлах интерполяции на равномерной редкой
x
π  π  π
сетке — интервале  ;  4π+   с шагом . Зададим частую сетку xi на том же
8  2  2
π
интервале с шагом . Выведем графики интерполируемой функции y с узлами
16
интерполяции и интерполирующих функций fi1 и fi2 (рис. 4):
>> x = pi/8:pi/2:(4*pi+pi/2); y = sin(x)./x;
>> xi = pi/8:pi/16:(4*pi+pi/16);
>> fi1 = interp1(x,y,xi,'cubic');
>> fi2 = interp1(x,y,xi,'spline');
>> plot(x,y,'-or','LineWidth',3,...
'MarkerFaceColor','w','MarkerSize',7), grid, hold on
>> plot(xi,fi1,'-b', xi,fi2,'-g','LineWidth',2)
>> legend('sin(x)/x','cubic','spline')
13

1
sin(x)/x
cubic
0.8
spline

0.6

0.4

0.2

-0.2

-0.4
0 2 4 6 8 10 12 14

Рис. 4. Интерполяция функции одной переменной, заданной в узлах на равномерной


редкой сетке, кубическим многочленом и кубическим сплайном
Интерполяция функции двух переменных на равномерной сетке выполняется с
помощью функции:
zi = interp2(x,y,z,xi,yi[,'<метод>'])
где:
x,y — векторы, на основе которых с помощью функции meshgrid формируются
узлы равномерной редкой сетки на плоскости (узлы интерполяции);
z — интерполируемая функция в узлах редкой сетки;
xi,yi — векторы, на основе которых с помощью функции meshgrid формируются
узлы равномерной частой сетки на плоскости; включают узлы интерполяции, шаг
частой сетки по xi и yi не превосходит минимального расстояния между узлами
интерполяции по x и y;
zi — значения интерполирующей функции в узлах частой сетки;
'<метод>' — виды интерполирующей функции двух переменных, к основным из
которых относятся:
'nearest' — многочлен 0-го порядка;
'linear' — многочлен 1-го порядка (линейная интерполяция по умолчанию);
14

'cubic' — многочлен 3-го порядка (кубический многочлен).


Выполним интерполяцию кубическим многочленом стандартной функции z =
x и y,
peaks(x,y), заданной на равномерной редкой сетке — интервалах по осям
равном [ −4; 4] , с одинаковым шагом 0,5 . Зададим частую сетку xi на том же
интервале с шагом 0,1 . Выведем графики интерполируемой функции z и
интерполирующей функции zi (рис. 5):
>> [x,y] = meshgrid(-4:0.5:4); z = peaks(x,y);
>> [xi,yi] = meshgrid(-4:0.1:4);
>> zi = interp2(x,y,z,xi,yi,'cubic');
>> mesh(x,y,z), hold on
>> mesh(xi,yi,zi+30)
>> legend('z = peaks(x,y)','cubic')

z = peaks(x,y)
cubic

40

30

20

10

-10
4
2 5
0
0
-2
-4 -5

Рис. 5. Интерполяция функции двух переменных, заданной на равномерной сетке,


кубическим многочленом
5.4. Минимизация функций
Задача минимизации функции сводится к поиску ее локального минимума на
заданном интервале, в предположении, что такой минимум существует и он
15

единственный. (Это эквивалентно поиску локального максимума функции с


противоположным знаком).
Минимизация функции одной переменной, т. е. поиск значения аргумента, при
котором функция достигает локального минимума на заданном интервале,
выполняется с помощью функции:
[xmin,f] = fminbnd('fun',x1,x2[,options])
где:
fun — имя внешней функции f ( x) в апострофах, либо непосредственно функция
f ( x) в апострофах; в последнем случае аргумент обязательно должен иметь имя x,
иначе будет выдано сообщение об ошибке;
x1,x2 — границы интервала, внутри которого ищется локальный минимум; если в
указанных границах имеется не один минимум, то определяется ближайший к левой
границе — x1;
xmin,f — значения аргумента и локального минимума функции;
options — необязательный параметр — массив записей (структура), поля которого
отображают контрольные параметры итерационного процесса минимизации. Список
полей можно вывести по команде optimset (посмотреть самостоятельно).
sin( x) π  π
Построим график функции на интервале  ; 4π  с шагом и отметим
x 8  8
приблизительно местоположение ее локального минимума внутри интервала
π 
 8 ; 2π  (рис. 6). Определим локальный минимум с помощью функции fminbnd:
 
>> x = pi/8:pi/8:4*pi;
>> plot(x, sin(x)./x,'LineWidth',2.5), grid, gtext('Local minimum')
>> [xmin,f] = fminbnd('sin(x)./x',pi/8,2*pi)
xmin =
4.4934
f =
-0.2172
16

0.8

0.6

0.4

0.2

-0.2
Local minimum
-0.4
0 2 4 6 8 10 12 14

Рис. 6. График функции одной переменной для визуализации локального минимума


Минимизация функции нескольких переменных, т. е. поиск значений аргументов, при
которых функция достигает локального минимума вблизи заданной точки,
выполняется с помощью функции:
[xmin,f] = fminsearch('fun',x0[,options])
где:
fun — имя внешней функции f ( x1 , x2 , ...) в апострофах либо непосредственно
функция f ( x1 , x2 , ...) в апострофах; в последнем случае аргументы обязательно
должны иметь имя x с индексами — x(1), x(2) и т. д., иначе будет выдано
сообщение об ошибке;
x0 — вектор-столбец, задающий точку в n-мерном пространстве, в окрестности
которой ищется локальный минимум;
xmin — вектор-столбец аргументов в n-мерном пространстве, определяющий точку
локального минимума;
f — локальный минимум в точке xmin.

Построим график функции z ( x, y ) = x 2 + y 2 + 10 на одинаковых интервалах по осям


x и y , равном [−3; 3] с одинаковыми шагами ∆x = ∆y = 0, 25 (рис. 7). Определим
17

локальный минимум функции z ( x, y ) вблизи точки [1;1] с помощью функции


fminsearch:
>> [X,Y] = meshgrid(-3:0.25:3);
>> Z = X.^2+Y.^2+10;
>> surf (X,Y,Z), colormap(cool)
>> [xmin,f] = fminsearch('x(1).^2+x(2).^2+10',[1;1])
xmin =
1.0e-004 *
-0.2102
0.2548
f =
10.0000

30

25

20

15

10
4
2 4
0 2
0
-2 -2
-4 -4

Рис. 7. График функции двух переменных для визуализации локального минимума


5.5. Численное интегрирование
Вычисление определенного интеграла:

b
∫ y( x)dx
a
18

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

Известны различные методы численного интегрирования, каждый из которых


является принципиально неточным — содержит методическую погрешность.

Рассмотрим наиболее простой и распространенный метод трапеций, в котором


значение интеграла определяется с помощью функции:
z = trapz(x,y)
где:
x,y — значения аргумента и подынтегральной функции — векторы или матрицы;
z — значение интеграла.
Размерности и размеры переменных x и y должны совпадать. Если x, y —
матрицы, то интегралы вычисляются относительно столбцов.
Название метода связано с тем, что между узлами интерполяции по умолчанию
выполняется линейная интерполяция, поэтому вычисление интеграла сводится к
вычислению суммы площадей трапеций.

Вычислим определенный интеграл функции y ( x) = x 2 на интервале [ a; b ] = [ 0;10] .


Аргумент x зададим равномерной сеткой с шагом ∆x = 0,1 :
>> x = 0:0.1:10; y = x.^2;

>> int = trapz(x,y)

int =
333.3500
Вычислим интеграл аналитически:
10
10
2 x3 103 1000
∫ x dx =
3
=
3
=
3
≈ 333,3333 .
0 0

Методическая погрешность равна 0,0167 . Для ее уменьшения следует уменьшить


шаг ∆x , что, очевидно, приведет к увеличению объема вычислений.