我使用二分法实现了寻根功能。我不会在这里解释它的本质——代码被实现了,而且非常正确。但是,这里有问题。
该函数dichotomy()包含计算方程根的逻辑,我需要以人类可读的形式获取它们的输出。现在,当我输入 时print(root),我会在一列中得到输出。我还需要一个字符串列表,并在小数点后包含所需的位数。
另外,这是实现的:
import numpy as np
import timeit
start_time = time.time()
res = list(dichotomy(0.0001,184,10000, 0.000001)) # написанная нами функция с заданными пользователем аргументами
print('Корни по методу дихотомии находятся в точках:')
print(', '.join(map(lambda x: f'{x:.4f}', res)))
print(f'Время счета по модулю timeit: ', timeit.timeit('dichotomy(0.0001,184,10000, 0.000001)', 'from __main__ import dichotomy'), 'seconds')
但是,不能将输出代码输入到函数体中。这是第一个困难。
第二:如果我在函数外部声明计数时间timeit.timeit(),那么该方法在内部 - 不再有效。一般来说,现在这段代码在最后几行中失败了:
import numpy as np
import timeit
def f(x):
return 1.2-np.log(x)-4*np.cos(2*x)
def dichotomy (a,b,n, eps): # отрезок от a до b делим на n частей, погрешность eps
"""
Функция отделения и уточнения корня
"""
assert a!=0, 'a равно 0'
assert b!=0, 'b равно 0'
# сначала отделим корни
grid=np.linspace(a, b, n)
# далее уточним корни
for x,y in zip(grid, grid[1:]):
if f(x) * f(y) > 0:
continue
root = None
while ( abs(f(y)-f(x)) )>eps:
mid = (y+x)/2
if f(mid) == 0 or f(mid)<eps:
root = mid
break
elif (f(mid) * f(x)) < 0:
y = mid
else:
x = mid
if root:
yield root
# print(root) # дает вывод столбиком - неудобно, потому пробуем ниже:
res = list(root) # ОШИБКА здесь!
print(', '.join(map(lambda x: f'{x:.4f}', res)))
print(f'Время счета по модулю timeit: ', timeit.timeit('dichotomy(0.0001,184,10000, 0.000001)', 'from __main__ import dichotomy'), 'seconds')
print(list(dichotomy(0.0001,184,10000, 0.000001))) # здесь юзер пытается подставить в функцию значения своих аргументов и получить распечатку корней
输出现在是一个错误,指示res = list(root):
TypeError:“numpy.float64”对象不可迭代
好吧,有不同的选择。但是如果你正在制作一个生成器,那么最好在生成器运行后显示结果:
yield root从生成器中,只需删除.之后的两行。如果你想在生成器中精确打印,那么它不会很漂亮 - 你必须遵循逗号,否则最后会有一个额外的逗号。例如,您可以在函数末尾执行以下操作: