1. Главная
  2. Библиотека
  3. Высшая математика
  4. Решить квадратное уравнение на языке Python тремя числе...
Решение задачи

Решить квадратное уравнение на языке Python тремя численными методами (бисекции, секущих и Ньютона), а затем проанализировать скорость сходимости каждого метода, сравнивая ошибки на каждой итерации с теоретическими ожиданиями. Каждый метод вычисляет

  • Высшая математика

Условие:

Решить квадратное уравнение на языке Python тремя численными методами (бисекции, секущих и Ньютона), а затем проанализировать скорость сходимости каждого метода, сравнивая ошибки на каждой итерации с теоретическими ожиданиями. Каждый метод вычисляет решение, количество итераций и ошибку

Решение:

Ниже приведён пошаговый алгоритм решения квадратного уравнения на примере уравнения   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. АНАЛИЗ СКОРОСТИ СХОДНОСТИ 1. Метод Бисекции:  – Ошибка на каждой итерации уменьшается приблизительно в 2 раза. Теоретически, если начать с интервала длины L, то после n итераций ошибка ≤ L/2ⁿ.  – Из вывода в консоли видно, что ошибка уменьшается экспоненциально, но с линейным коэффициентом сходимости. 2. Метод Секущих:  – Из теории известно, что метод секущих обладает суперлинейной сходимостью с порядком примерно 1.618 (золотое сечение).  – Ошибка на итерациях будет уменьшаться быстрее, чем у бисекции, но может быть менее предсказуемой при неподходящем выборе начальных приближений (если f(x) «плохо себя ведёт»). 3. Метод Ньютона:  – При условии достаточно хорошего начального приближения сходимость квадратичная – то есть примерно количество корректных знаков удваивается на каждой итерации.  – В идеальном случае ошибка следующей итерации приблизительно пропорциональна квадрату предыдущей ошибки. Из печати видно, что метод Ньютона сходится значительно быстрее, чем метод бисекции. Таким образом, при достаточно гладкой функции и подходящем выборе начального приближения метод Ньютона является наиболее быстрым; метод секущих уступает Ньютонам в сходимости, но требует вычисления только функции, а не её производной; метод бисекции гарантированно сходится, но скорость сходимости у него ниже (линейная). ------------------------------------------------------------ ШАГ 4. ЗАКЛЮЧЕНИЕ Мы реализовали на Python три метода для решения квадратного уравнения x² – 5·x + 6 = 0. Каждый метод возвращает приближённое значение корня, число итераций и конечную ошибку, при этом на каждой итерации печатается текущая ошибка. Проведённый анализ показывает:  – Метод Ньютона демонстрирует квадратичную сходимость (наилучшая скорость, если можно вычислить производную).  – Метод секущих имеет суперлинейную сходимость, уступающую Ньютона, но не требует аналитического вида производной.  – Метод бисекции обеспечивает гарантированную сходимость, но с линейной скоростью уменьшения ошибки (каждая итерация уменьшает ошибку примерно в 2 раза). Данный подход позволяет не только найти корень, но и сопоставить экспериментальные результаты с теоретическими ожиданиями по сходимости каждого метода.

Не нашел нужную задачу?

Воспользуйся поиском

Выбери предмет