在用二分法求解一个变量的方程时,根据问题的条件,我需要计算求根时的迭代次数。对于一次迭代,正如我所读,您可以将段的划分数减半。对于每个根至少一次,段被划分。即迭代次数显然不会少于根数。但是,我的计数器只显示一个分区,即一次迭代。怎么了?
代码:
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)
在您的代码中,您使用 iter_count 全局变量来计算迭代次数。
iter_count =+ 1但是,在您使用 =+ 运算符的行中,它将值 1 分配给 iter_count 而不是将其递增 1。更改为iter_count += 1