цикл с использованием while stop на первой итерации - PullRequest
1 голос
/ 30 мая 2020

Я сделал расчет деления пополам, используя python с условием al oop. l oop останавливается с двумя условиями, достигая максимальной итерации или максимальной ошибки.

но когда я запускаю, он всегда заканчивается двумя итерациями.

когда я удаляю максимальное требование ошибки, итерация выполняется до максимальной итерации, но когда я удаляю требование итерации, повторяется только 2 раза.

Пожалуйста, помогите мне. Спасибо.

def bisection(f, Xl, Xu, max_eA, iteration):
    x_l = Xl
    x_u = Xu
    eA = 0
    Xr = (x_l + x_u)/2
    total_iter = 0

    if f(Xl)*f(Xu) >= 0:
        print("Bisection method fails.")
        return None

    while eA < max_eA and total_iter < iteration+1:
        print("iteration", total_iter+1)
        xr_old = Xr
        print("xr old",xr_old)
        Xr = (x_l + x_u)/2
        print("Xr now", Xr)
        f_xr = f(Xr)
        if     f_xr == 0:
            print("Found exact solution.")
            print("Xr fix", Xr)
            return Xr
        elif f(x_l)*f_xr < 0:
            x_l = x_l
            x_u = Xr
            print("x_l use",x_l)
            print("x_u use",x_u)
        elif f(x_l)*f_xr > 0:
            x_l = Xr
            x_u = x_u
        else:
            print("Bisection method fails.")
            return None
        xr_new = Xr
        print("xr new",xr_new)
        print("xr old 2", xr_old)
        print("ea use",eA)
        eA = abs((xr_new-xr_old)/xr_new)
        print("max ea",max_eA)
        print("eA after calculate", eA)
        total_iter=total_iter+1
    return (x_l + x_u)/2

f = lambda x:  ((10000000 * (1.2 ** x)) / ((1.2 ** x) - 1))\
           +\
           ((-10000000*x) / ((1.2 ** x) - 1))\
           +\
           10000000
bisection(f,5,10,0.0001,20)

1 Ответ

1 голос
/ 30 мая 2020

Код повторяется только два раза, потому что на второй итерации значение eA становится больше max_eA, и это очевидно. После удаления условия eA из while l oop вы получите желаемый результат для 21 итераций.

Результатом вашего кода будет

iteration 1
xr old 7.5
Xr now 7.5
xr new 7.5
xr old 2 7.5
ea use 0
max ea 0.0001
eA after calculate 0.0
iteration 2
xr old 7.5
Xr now 8.75
x_l use 7.5
x_u use 8.75
xr new 8.75
xr old 2 7.5
ea use 0.0
max ea 0.0001
eA after calculate 0.14285714285714285

Как видите из вывода на второй итерации значение eA равно 0.14285714285714285, а значение max_ea равно 0.0001. Итак, while l oop не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...