Метод половинного деления и метод итераций
Добрейшего времени суток. Имеется программа для нахождения уравнения на отрезке [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()