Ниже приведён пошаговый алгоритм решения квадратного уравнения на примере уравнения
x² – 5·x + 6 = 0 (решения – x=2 и x=3)
с использованием трёх численных методов – бисекции, секущих и Ньютона. В конце будет проведён анализ скорости сходимости методов, сравнивая полученные на каждой итерации ошибки с теоретическими оценками.
ШАГ 1. ФОРМУЛИРОВКА ЗАДАЧИ
Пусть функция f(x)=x² – 5·x +6. Для нахождения её корня можно использовать:
1. Метод бисекции. Теоретическая оценка ошибки после n...
def f(x):
return x**2 - 5*x + 6
def df(x):
return 2*x - 5
Метод Бисекции:
Мы выбираем интервал [a, b] такой, что f(a)·f(b) 0. Для нашего корня x≈2 можно взять, например, a = 1.0, b = 2.5 (так как f(1)=2 и f(2.5)≈ -0.25).
Алгоритм:
1. Рассчитываем середину c = (a+b)/2.
2. Если f(c)==0 или (b–a)/2 меньше заданной точности, прекращаем.
3. Если знак f(a) совпадает со знаком f(c), делаем a=c, иначе b=c.
4. Считаем ошибку как (b–a)/2.
Код метода бисекции:
def bisectioniter=100):
iterations = 0
error = b - a
while error tol and iterations maxter:
c = (a + b) / 2.0
Обновляем интервал, где функция меняет знак
if f(a) * f(c) 0:
b = c
else:
a = c
error = (b - a) / 2.0
iterations += 1
Для анализа сходимости можно распечатывать error на каждой итерации
print(Бисекция итерация, iterations, ошибка:, error)
return (a + b) / 2.0, iterations, error
rootbisec, errmethod(1.0, 2.5)
print(Метод бисекции: корень =, rootbisec, конечная ошибка =, errisec)
Метод Секущих:
Необходимы два начальных приближения. Для поиска корня x≈2 можно взять, например, x0 = 1.0 и x1 = 2.5.
Алгоритм:
1. Вычисляем новое приближение по формуле:
xew = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0))
2. Ошибка – абсолютная разница между xew и x1.
3. Обновляем: x0 ← x1, x1 ← xew, проверяем условие останова.
Код метода секущих:
def secantiter=100):
iterations = 0
error = abs(x1 - x0)
while error tol and iterations maxter:
f0 = f(x0)
f1 = f(x1)
Формула секущих
xx1 * (x1 - x0) / (fx0)
error = abs(xew - x1)
x0, x1 = x1, xew
iterations += 1
print(Секущих итерация, iterations, ошибка:, error)
return x1, iterations, error
rootsecant, errmethod(1.0, 2.5)
print(Метод секущих: корень =, rootsecant, конечная ошибка =, errecant)
Метод Ньютона:
Требуется начальное приближение, допустим x0 = 1.5 для стремления к корню около 2.
Алгоритм:
1. Вычисляем новый x по формуле:
xew = x - f(x) / df(x)
2. Ошибка – абсолютная разница |xew - x|.
3. Обновляем значение x и повторяем до достижения точности.
Код метода Ньютона:
def newtoniter=100):
iterations = 0
error = float(inf)
x = x0
while error tol and iterations maxter:
f = f(x)
dfx = df(x)
Предотвращаем деление на ноль
if dfx == 0:
break
xx/dfx
error = abs(xew - x)
x = xew
iterations += 1
print(Ньютон итерация, iterations, ошибка:, error)
return x, iterations, error
rootnewton, errmethod(1.5)
print(Метод Ньютона: корень =, rootnewton, конечная ошибка =, errewton)
ШАГ 3. АНАЛИЗ СКОРОСТИ СХОДНОСТИ
-
Метод Бисекции:
– Ошибка на каждой итерации уменьшается приблизительно в 2 раза. Теоретически, если начать с интервала длины L, то после n итераций ошибка ≤ L/2ⁿ.
– Из вывода в консоли видно, что ошибка уменьшается экспоненциально, но с линейным коэффициентом сходимости.
-
Метод Секущих:
– Из теории известно, что метод секущих обладает суперлинейной сходимостью с порядком примерно 1.618 (золотое сечение).
– Ошибка на итерациях будет уменьшаться быстрее, чем у бисекции, но может быть менее предсказуемой при неподходящем выборе начальных приближений (если f(x) «плохо себя ведёт»).
-
Метод Ньютона:
– При условии достаточно хорошего начального приближения сходимость квадратичная – то есть примерно количество корректных знаков удваивается на каждой итерации.
– В идеальном случае ошибка следующей итерации приблизительно пропорциональна квадрату предыдущей ошибки. Из печати видно, что метод Ньютона сходится значительно быстрее, чем метод бисекции.
Таким образом, при достаточно гладкой функции и подходящем выборе начального приближения метод Ньютона является наиболее быстрым; метод секущих уступает Ньютонам в сходимости, но требует вычисления только функции, а не её производной; метод бисекции гарантированно сходится, но скорость сходимости у него ниже (линейная).
ШАГ 4. ЗАКЛЮЧЕНИЕ
Мы реализовали на Python три метода для решения квадратного уравнения x² – 5·x + 6 = 0. Каждый метод возвращает приближённое значение корня, число итераций и конечную ошибку, при этом на каждой итерации печатается текущая ошибка. Проведённый анализ показывает:
– Метод Ньютона демонстрирует квадратичную сходимость (наилучшая скорость, если можно вычислить производную).
– Метод секущих имеет суперлинейную сходимость, уступающую Ньютона, но не требует аналитического вида производной.
– Метод бисекции обеспечивает гарантированную сходимость, но с линейной скоростью уменьшения ошибки (каждая итерация уменьшает ошибку примерно в 2 раза).
Данный подход позволяет не только найти корень, но и сопоставить экспериментальные результаты с теоретическими ожиданиями по сходимости каждого метода.