Ниже приведён простой и понятный код на языке Python, который решает задачу методом простой итерации для уравнения
–0.8·x³ + 2.3·x² + 14.1·x – 3.7 = 0
с точностью E = 1e–13 на трёх отрезках локализации корней. Код не использует сложных конструкций, а для наглядности снабжён комментариями и пошаговыми расчётами, включая подсчёт количества итераций и вывод диапазона изменения производной (то есть phi′(x)) на каждом отрезке.
Общая идея такова. Чтобы применить метод простой итерации, мы приводим уравнение к виду
x = φ(x)
например, записывая
φ(x) = x + c·f(x),
где f(x)= –0.8·x³+2.3·x²+...
def f(x):
return -0.8x**3 + 2.3x**2 + 14.1*x - 3.7
def frime(x):
return -2.4x**2 + 4.6x + 14.1
def simpleteration(a, b, c, E):
Функция phi(x) = x + c * f(x)
def phi(x):
return x + c * f(x)
Начальное приближение выбираем как середину отрезка
xrev = (a + b) / 2.0
iterations = 0
while True:
xprev)
iterations += 1
if abs(xprev) E: # условие останова
break
xnext
return xext, iterations
def derivativeange(a, b, c):
φ(x) = 1 + c * f(x)
def phirime(x):
return 1 + c * frime(x)
Вычисляем значения на концах отрезка
values = [phiprime(b)]
Для поиска экстремума внутри отрезка рассмотрим вершину функции f(x)
f(x) = -2.4x + 14.1
Вершина x = -B/(2A), где A = -2.4, B = 4.6
xertex = -4.6 / (2 * -2.4) # = 4.6/4.8
if a = xertex = b:
values.append(phivertex))
return min(values), max(values)
E = 1e-13 # требуемая точность
a1, b1 = -10, -2
c1 = 0.007 # подобрано вручную для сходимости
root1, iter1 = simpleteration(a1, b1, c1, E)
derivmax1 = derivativeange(a1, b1, c1)
print(Интервал [{}, {}]:.format(a1, b1))
print( Найденный корень: {:.15f}.format(root1))
print( Количество итераций: {}.format(iter1))
print( Диапазон значений phi(x): от {:.6f} до {:.6f}.format(derivmax1))
print()
a2, b2 = 0, 1
c2 = -0.06 # для положительного f(x) подбираем отрицательное c
root2, iter2 = simpleteration(a2, b2, c2, E)
derivmax2 = derivativeange(a2, b2, c2)
print(Интервал [{}, {}]:.format(a2, b2))
print( Найденный корень: {:.15f}.format(root2))
print( Количество итераций: {}.format(iter2))
print( Диапазон значений phi(x): от {:.6f} до {:.6f}.format(derivmax2))
print()
a3, b3 = 5, 10
c3 = 0.005 # аналогично, подобрано для сходимости
root3, iter3 = simpleteration(a3, b3, c3, E)
derivmax3 = derivativeange(a3, b3, c3)
print(Интервал [{}, {}]:.format(a3, b3))
print( Найденный корень: {:.15f}.format(root3))
print( Количество итераций: {}.format(iter3))
print( Диапазон значений phi(x): от {:.6f} до {:.6f}.format(derivmax3))
print()
Пояснение пошагово:
- Задаём функцию f(x) и её производную f(x) для исходного уравнения.
- Преобразуем уравнение к виду x = φ(x) = x + c·f(x). Константа c выбирается отдельно для каждого отрезка, чтобы
выполнялось условие сходимости (|φ(x)| 1 на всём отрезке).
- Функция simpleteration(a, b, c, E) начинает итерационный процесс с начального приближения (середина отрезка)
и продолжает, пока разность между последовательными приближениями не станет меньше E. При этом считается число итераций.
- Функция derivativeange(a, b, c) вычисляет φ(x) = 1 + c·f(x) на концах отрезка и, если вершина функции f(x)
(которая для квадратичной функции находится по формуле x = –B/(2A)) попадает в отрезок, то и там.
- Далее для каждого из трёх отрезков ([-10,-2], [0,1], [5,10]) запускается метод с соответствующим значением c,
и выводятся найденный корень, число итераций и диапазон изменения φ(x).
Код использует только базовые конструкции Python, что делает его понятным для начинающих.
Запустив этот код, вы получите решение задачи методом простой итерации с отображением всей необходимой информации.