Почему получаю при расчете в скрипте Python только одну итерацию?
При решении уравнения с одной переменной методом дихотомии мне, по условиям задачи, требуется рассчитать количество итераций при нахождении корней. За итерацию, как прочитал, можно принять количество делений отрезка пополам. Как минимум для каждого корня по одному разу отрезок делится. То есть количество итераций явно не будет меньше количества корней. Однако мой счетчик показывает лишь одно деление, то есть одну итерацию. Что не так?
Код:
import numpy as np
from decimal import *
import pandas as pd
def print_dichotomy(funcs):
def wrapper(a,b, eps_func, eps_arg):
*res, func, eps_list = list(funcs(a,b, eps_func, eps_arg))
result_table = pd.DataFrame()
result_table['Корни'] = pd.Series(res)
print('Количество итераций: ', iter_count)
print(result_table)
return wrapper
def f(x):
return 1.2-np.log(x)-4*np.cos(2*x)
@print_dichotomy
def dichotomy(a, b, eps_func, eps_arg):
# 1. определим глобальную переменную (расчет количества итераций)
global iter_count
# 2. определим ограничения на границы отрезка
assert a != 0, 'a равно 0'
assert b != 0, 'b равно 0'
# 3. запросим количество частей n, на которые будет дробиться отрезок
n = int( input('Введите параметр n (целое число): ') )
# 5. отделим корни
# для этого разделим заданный отрезок на n частей
grid = np.linspace(a, b, n)
# 6. создадим счетчик для количества итераций
iter_count = 0
# 7. уточним наличие корней на каждом отрезке
for x, y in zip(grid, grid[1:]):
# 7.1. если на отрезке нет корня, смотрим следующий отрезок
if f(x) * f(y) > 0:
continue
root = None
# 7.2. уточним корни
while abs(f((x+y)/2)) > eps_func and ((y - x)/2) > eps_arg:
if y != x:
# 7.2.1.1. получаем середину отрезка
mid = (y + x) / 2
# 7.2.1.2. пополним счетчик итераций на один (было одно деление пополам)
iter_count =+ 1
# 7.2.1.3. корень примем равным серединному значению:
root = mid
break
# 7.2.1.5. иначе если произведение функции в середине отрезка на функцию в т. а <= 0:
if Decimal(f(mid) * f(x)) <= 0:
# 7.2.1.5.1. серединой отрезка признаем точку b:
y = mid
else:
# 7.2.1.5.3. в другом случае — точку а:
x = mid
# 8. возвращаем рассчитанный корень
if root:
yield root
dichotomy(0.0001, 50, 0.000001, 0.000001)
Источник: Stack Overflow на русском