Метод половинного деления и метод итераций

Добрейшего времени суток. Имеется программа для нахождения уравнения на отрезке [a;b] с погрешностью e

from math import *

    print("Введите исходные данные: ")
    print("a = ", end='')
    a = float(input())
    print("b = ", end='')
    b = float(input())
    print("eps = ", end='')
    e = float(input())
    print("Вы ввели: ")
    print("a = %.2f  b = %.2f  eps = %.2e" % (a, b, e))

    y = log(a) - a + 1.8 

    while b-a >= e:
        x = (a+b)/2
        z = log(x) - x + 1.8
        if y*z < 0:
            b = x
        else:
            a = x
            y = z

    print("x =", x, "z =",z)

Для этого уравнения,которое дано в программе,нужно определить число повторений цикла при методе половинного деления и методе итераций и сравнить эффективность этих методов.

Исходные данные: e = 0.00001
a = 2
b = 3

Объясните пожалуйста,как это сделать?


Ответы (1 шт):

Автор решения: Sergio

В цикле while требуется сравнивать разницу отрезков по модулю. Решение методом половинного деления, чтобы цикл не вошел в бесконечность на всякий, я добавил ограничение цикла в 200 шагов, измените в функции func(x) формулу на свою.

"""
Используем метод половинного деления для 
нахождения корней уравнения.
"""

import math


def half_interval(a, b):
    """Метод делит интервал по полам"""
    return (a + b) / 2


def get_parametr():
    """Получить данные от пользователя"""
    a = int(input("Введите точку a :"))
    b = int(input("Введите точку b :"))
    E = float(input("Введите точность E:"))

    print('a = {a} Тип:{a1}\nb = {b} Тип {b1}\nE = {E} Тип:{E1}'
      .format(a=a, a1=type(a), b=b, b1=type(b), E=E, E1=type(E))
      )
    return a, b, E


def func(x):
    """
    Вычисляем значение функции, в качестве примера
    2 cos x -7x = 0
    """
    return 2 * math.cos(x) - 7 * x


def start():
    """
    Старт программы
    """
    a, b, E = get_parametr()
    counter = 0
    max_counter = 200

    while abs(b - a) > E:

        counter += 1
        if counter >= max_counter:
            print('Слишком много шагов')
            break

        if abs(b - a) <= E:
            print('Значение math.abs(b-a) стало меньше чем E')
            break

        print('\n\nШаг №{counter}'.format(counter=counter))

        fa = func(a)
        c = half_interval(a, b)
        fc = func(c)
        if fa * fc >= 0:
            a = c
        else:
            b = c
        print('fa = {f_a} fc = {f_c} fa * fc = {res}'.format(f_a=fa, f_c=fc, res=fa * fc))
        print('a = {a} b = {b}'.format(a=a, b=b))


# Запуск программы
start()
→ Ссылка