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.
б) стратегия замены – исключить один из старых узлов, например, тот, в котором значение |уi| максимально (т.е. наиболее отлично от 0); общее число узлов и степень многочлена не изменяется.
После этого вернуться к пункту 3.
Пример 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 |
В качестве узлов интерполяции будем использовать точки при х = 0; 0.5; 1.0; 1.5. Строим матрицу D для обратных разделенных разностей:
0 0 0 0
0.5 -0.8033194 0 0
D = 1 -0.6850734 -0.1412264 0
1.5 -0.6174713 -0.1028578 -0.039573
Получаем многочлен
Q3 (y) = 0 – 0.8033194 (у – 1) – 0.1412264 (у – 1) (у – 0.377583) –
– 0.039573 (у – 1) (у – 0.377583) (у + 0.459698).
Отсюда Q3 (0) = х* = 0.74312596; f(x*) = – 0.006769 – точность не достигнута. Заменяем новой точкой (0.74312596; – 0.006769) старый узел (1.5; –1.429263), в котором значение функции наиболее отличается от 0. Получаем новую матрицу D
0 0 0 0
0.5 -0.8033194 0 0
D = 1 -0.6850734 -0.1412264 0
0.743126 -0.7381297 -0.1696096 -0.0626661
и новый многочлен
Q3 (y) = 0 – 0.8033194 (у – 1) – 0.1412264 (у – 1) (у – 0.377583) –
– 0.0626661 (у – 1) (у – 0.377583) (у + 0.459698)
Q3 (0) = х* = 0.7391176; f(x*) = – 0.000054 – точность не достигнута. Заменяем на новую точку (0.7391176; – 0.000054) старый узел (0; 1). Получаем новую матрицу D
0.7391176 0 0 0
0.5 -0.6331945 0 0
D = 1 -0.5675757 -0.0783713 0
0.743126 -0.5969738 -0.0942385 -0.0350323
Q3 (y) = 0.7391176 – 0.6331945 (у – 0.000054) – 0.0783713 (у – 0.000054) (у – 0.377583) –
– 0.0350323 (у – 0.000054) (у – 0.377583) (у + 0.459698)
Q3 (0) = х* = 0.73908513; f(x*) = 1.488 10 – 9 – точность достигнута.
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 максимально, и повторяют интерполяцию.
В качестве критерия точности по функции можно использовать условие 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.1.
Рис. 3.1. График
функции f(x)
= 0.5 x2
– sin(x)
Таблица 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 для разделенных разностей:
0 0 0
D = -0.35443 -0.70885 0
-0.34147 -0.34147 0.73476
Отсюда F = (хmin , у(хmin )) = (0.732369; –0.4004509).
Рис. 3.2. Применение
параболической интерполяции, 1-я итерация
минимизируемая
функция f(x)
узлы интерполяции
парабола
точка (хmin
, f(хmin
))
После 1-й итерации точность не достигнута, следовательно, заменяем точкой F узел при х = 0, т.к. у(0) = 0 = max. Получаем новую матрицу D:
-0.40045 0 0
D = -0.35443 -0.19807 0
-0.34147 0.22038 0.8369
(х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 – точность достигнута.
