2. Приложение интерполяции к вычислительным задачам
2.1. Численное решение уравнений. Пусть на отрезке [a, b] надо найти корень уравнения f(x) = 0. Если функция f(x) монотонна на [a, b], то одним из эффективных методов решения является обратная интерполяция. Предлагается следующий алгоритм.
1. Выбираем некоторый шаг h и просчитываем значения у = f(х) с этим шагом на [a, b].
2. Задаемся некоторым значением n и выбираем на [a, b] (n + 1) точку. Для повышения точности рекомендуется выбирать точки так, чтобы примерно половина из них была с одной стороны от корня (в них f(xi) < 0), а другая половина была с другой стороны от корня (в них f(xi) > 0). Тогда корень будет близок к середине отрезка интерполяции, т.е. там, где точность максимальна.
3. Строим Qn (y) и вычисляем х* = Qn (0). Это и будет приближенным корнем уравнения.
4. Для повышения точности можно применить итерационный вариант метода. Для этого задаемся некоторым > 0 и проверяем, достигнута ли заданная точность. В качестве критерия можно использовать неравенства | xn – x0 | < или | f(x*) | < . Первое условие (оценка по аргументу) означает, что интервал интерполяции, на котором находится корень, достаточно мал. Второе (оценка по функции) – что в найденной точке функция приблизительно равна 0. Если выбранный критерий точности удовлетворен, то стоп.
5. Если точность не достигнута, то к имеющимся узлам интерполяции добавляем новый – (х*, f(x*)). Можно применять одну из двух стратегий модификации набора узлов:
а) стратегия добавления – не менять старые узлы; при этом общее число узлов и степень многочлена возрастает на 1.
б) стратегия замены – исключить один из старых узлов, общее число узлов и степень многочлена не изменяется; при этом можно
- б1) заменить тот узел, в котором значение |уi| максимально (т.е. наиболее отлично от 0);.
- б2) заменить тот узел, в котором знак функции совпадает со знаком функции в новом узле (чтобы оставшиеся узлы снова имели чередующиеся знаки).
6. Вернуться к пункту 3.
В качестве аппроксимирующей функции можно использовать многочлены от 0 до 3-й степени.
В качестве многочлена 0-й степени используют функцию
Y(x)
=
= sign(f(x)).
В этом случае мы получим метод, известный как метод половинного деления. При n = 1 получим метод секущих. В обоих случаях рекомендуется использовать стратегию б2). При n > 1 можно применять любую стратегию модификации узлов.
Пример 3.2. Найти корень уравнения f(x) cos(x) – x = 0 на интервале [–1, 2.5] с точностью по функции 10–5.
Положим h = 0.5 и составим таблицу значений у(х) (таблица 3.2):
Таблица 3.2. |
||||||||
x |
– 1.0 |
– 0.5 |
0 |
0.5 |
1.0 |
1.5 |
2.0 |
2.5 |
y |
1.54 |
1.38 |
1.0 |
0.38 |
– 0.46 |
– 1.43 |
– 2.42 |
– 3.30 |
1. В качестве узлов интерполяции будем использовать точки при х = 0; 0.5; 1.0; 1.5, т.е. положим n = 3. Строим матрицу D1 для обратных разделенных разностей:
D1 = |
yi |
xi |
1 |
2 |
3 |
1 |
0.0 |
0 |
0 |
0 |
|
0.3775826 |
0.5 |
– 0.8033194 |
0 |
0 |
|
– 0.4596977 |
1.0 |
– 0.6850734 |
– 0.1412264 |
0 |
|
–1.4292628 |
1.5 |
– 0.6174713 |
– 0.1028578 |
– 0.039573 |
Получаем многочлен
Q3 (y) = 0 – 0.8033194 (у – 1) – 0.1412264 (у – 1) (у – 0.3775826) –
– 0.039573 (у – 1) (у – 0.3775826) (у + 0.4596977).
Рис. 3.1. Графики функции f –1(y) (красный) и Q(y) (зелёный)
Отсюда Q3 (0) = х* = 0.74312596; f(x*) = – 0.006769 – точность не достигнута, т.к. | f(x*) | > . Заменяем новой точкой (0.74312596; – 0.006769) старый узел (1.5; –1.429263), в котором значение функции наиболее отличается от 0. Получаем новую матрицу D2
D2 = |
yi |
xi |
1 |
2 |
3 |
1 |
0.0 |
0 |
0 |
0 |
|
0.3775826 |
0.5 |
– 0.8033194 |
0 |
0 |
|
– 0.4596977 |
1.0 |
– 0.6850734 |
– 0.1412264 |
0 |
|
– 0.006769 |
0.743126 |
– 0.7381297 |
– 0.1696096 |
– 0.0626661 |
и новый многочлен
Q3 (y) = 0 – 0.8033194 (у – 1) – 0.1412264 (у – 1) (у – 0.3775826) –
– 0.0626661 (у – 1) (у – 0.3775826) (у + 0.4596977)
D3 = |
yi |
xi |
1 |
2 |
3 |
– 0.000054 |
0.7391176 |
0 |
0 |
0 |
|
0.3775826 |
0.5 |
– 0.6331945 |
0 |
0 |
|
– 0.4596977 |
1.0 |
– 0.5675757 |
– 0.0783713 |
0 |
|
– 0.006769 |
0.743126 |
– 0.5969738 |
– 0.0942385 |
– 0.0350323 |
Q3 (0) = х* = 0.7391176; f(x*) = – 0.000054 – точность не достигнута. Заменяем на новую точку (0.7391176; – 0.000054) старый узел (0; 1). Получаем новую матрицу D3
Q3 (y) = 0.7391176 – 0.6331945 (у – 0.000054) – 0.0783713 (у – 0.000054) (у – 0.3775826) –
– 0.0350323 (у – 0.000054) (у – 0.377583) (у + 0.4596977)
Q3 (0) = х* = 0.73908513; f(x*) = 1.488 10 – 9 – точность достигнута.
2. Положим n = 1, выбрав точки х = 0.5; 1.0.
Имеем X(y) = x0 + (y – y0) 1[x0, x1]. Отсюда X = x0 – y0 1[x0, x1].
= –
0.5971716. Следовательно, X =
0.5 + 0.3775826 0.5971716
= 0.7254816.
f(X) = 0.0226984 > 0, следовательно, отбрасываем узел (0.5; 0,38).
2-я итерация. 1 = – 0.5690726, X = 0.7254816 + 0.02269840.5690726 = 0.7383986. f(X) = 1.148782310– 3 > 0, следовательно, отбрасываем узел (0.7254816; 0.0226984). И т.д.
После 4-й итерации получаем Х = 0.7390834, f(X) = 2.88417210– 6 – точность достигнута.
3.
Положим n = 0, выбрав точки
х = 0.5; 1.0. Полагаем всякий
раз Х =
.
1-я итерация. Имеем: X = 0.75, f(x) = – 0.0183 < 0, отбрасываем узел (1, – 0.46).
2-я итерация. X = 0.625, f(x) = 0.186 > 0, отбрасываем узел (0.5, 0.38).
3-я итерация. X = 0.6875, f(x) = 0.085335 > 0, отбрасываем узел (0.625, 0.186). И т.д.
После 10-й итерации получаем Х = 0.7390812, f(X) = 6.58310– 6 – точность достигнута.
Резюме. Как видим, скорость сходимости, и сложность вычислений в описанных методах значительно отличаются.
Сходимость существенно зависит от близости исходной функции к аппроксимирующей. В том случае, когда вид исходной функции неизвестен, лучше использовать метод половинного деления, т.к. он за k итераций гарантированно сужает исходный отрезок в 2k раз, и можно заранее рассчитать достигаемую точность по аргументу. Метод секущих хорошо работает, когда функция близка к прямой. Если известно, что функция f(x) гладкая (не имеет разрывов и резких скачков), но отличается от прямой, лучше использовать обратную интерполяцию при n = 2 или 3.
2.2. Поиск минимума функции одной переменной. Пусть даны три точки на плоскости: A = (x0, y0); B = (x1, y1); С = (x2, y2); x0 < x1 < x2.
Def. Три точки на плоскости (x0, y0), (x1, y1), (x2, y2) образуют выпуклую тройку, если при x0 < x1 < x2 выполнены также неравенства у1 < у0, у1 < у2.
Ставится задача:
найти приближенно точку минимума функции
у(х) по трем точкам, образующим выпуклую
тройку. Эта задача решается с помощью
параболической
интерполяции. Согласно этому
методу строят многочлен Ньютона 2-й
степени Р2 (х)
(параболу) и находят точку его минимума,
т.е. точку, в которой
.
Имеем: P2 (x) = y0 + (х – x0) 1[x0, x1] + (х – x0) (х – x1) 2[x0, x1, x2]. Найдем производную, приравняем ее к нулю и решим полученное линейное уравнение. Получим:
.
(3.1)
Свойство. Если узлы интерполяции образуют выпуклую тройку, то хmin [x0, x2], т.е. точка минимума, получаемая методом параболической интерполяции, устойчива.
Если минимизируемая функция у(х) задана аналитически, то решение можно получить с любой заданной точностью. Для этого используют итерационный вариант метода параболической интерполяции. Cтроят новую точку F = (хmin , у(хmin )) и проверяют, достигнута ли требуемая точность. Если да, то хmin – решение задачи, СТОП. В противном случае заменяют точкой F один из старых узлов, например тот, в котором значение уi максимально, и повторяют интерполяцию.
Рис. 3.2. График
функции f(x)
= 0.5 x2
– sin(x)
В качестве критерия точности по функции можно использовать условие max { уi } – min { уi } < , т.е. значения функции в узлах совпадают с заданной точностью. В качестве критерия точности по аргументу можно использовать условие max { хi } – min { хi } < , т.е. значения аргумента лежат в достаточно малом интервале.
Перед применением метода выбирают некоторый шаг h и просчитывают значения у(х) с этим шагом на [a, b] для обнаружения выпуклой тройки.
Замечание 1. Так как на последних итерациях значения функции очень близки, то вычисления надо проводить с большим числом значащих цифр.
Замечание 2. Если требуется найти максимум функции, то для того, чтобы не менять все выкладки и формулу (3.1), удобнее поменять знак функции и искать min (– y(x)).
Пример 3.3. Найти минимум функции f(x) = 0.5 x2 – sin(x) на отрезке [–1, 2.5] с точностью по аргументу 10–3.
Положим h = 0.5 и составим таблицу значений у = f(х) (таблица 3.3). График функции – на рис. 3.2.
Таблица 3.3. |
||||||||
x |
– 1.0 |
– 0.5 |
0 |
0.5 |
1.0 |
1.5 |
2.0 |
2.5 |
y |
1.34 |
0.60 |
0.0 |
–0.35 |
– 0.34 |
0.13 |
1.09 |
2.53 |
В качестве узлов интерполяции будем использовать точки при х = 0; 0.5; 1.0, т.к. они образуют выпуклую тройку. Строим матрицу D для разделенных разностей:
D = |
xi |
yi |
1 |
2 |
0.0 |
0 |
0 |
0 |
|
0.5 |
– 0.3544255 |
– 0.708851 |
0 |
|
1.0 |
– 0.341471 |
– 0.341471 |
0.73476 |
Отсюда по формуле (3.1) F = (хmin , у(хmin )) = (0.732369; –0.4004509).
Рис. 3.3. Применение
параболической интерполяции, 1-я итерация
минимизируемая
функция f(x)
узлы интерполяции
парабола
точка (хmin
, f(хmin
))
После 1-й итерации точность не достигнута, следовательно, заменяем точкой F узел при х = 0, т.к. у(0) = 0 = max. Получаем новую матрицу D:
D = |
xi |
yi |
1 |
2 |
0.732369 |
– 0.4004509 |
0 |
0 |
|
0.5 |
– 0.3544255 |
– 0.1980703 |
0 |
|
1.0 |
– 0.341471 |
0.2203777 |
0.836896 |
F= (хmin , у(хmin )) = (0.7345207095; -0.4004712). Точность не достигнута, следовательно, заменяем точкой F узел при х = 1, т.к. у(1) = -0.341470985 = max, и т.д.
После пятой итерации получаем следующую таблицу узлов:
Таблица 3.4. |
|||
х |
0.7390872156 |
0.7393051349 |
0.7390850585 |
у |
-0.400488612 |
-0.400488572 |
-0.400488612 |
(хmin , у(хmin )) = (0.7390851332; -0.400488572); max { хi } – min { хi } = 2.20110– 4 – точность достигнута.
