Почему получаю при расчете в скрипте Python только одну итерацию?

Рейтинг: 0Ответов: 1Опубликовано: 29.04.2023

При решении уравнения с одной переменной методом дихотомии мне, по условиям задачи, требуется рассчитать количество итераций при нахождении корней. За итерацию, как прочитал, можно принять количество делений отрезка пополам. Как минимум для каждого корня по одному разу отрезок делится. То есть количество итераций явно не будет меньше количества корней. Однако мой счетчик показывает лишь одно деление, то есть одну итерацию. Что не так?

Код:

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)

Ответы

▲ 2Принят

В вашем коде вы используете глобальную переменную iter_count для подсчета количества итераций. Однако в строке iter_count =+ 1 вы используете оператор =+, который присваивает значение 1 переменной iter_count, а не увеличивает ее на 1. Измените на iter_count += 1