Решение уравнений методом перебора

GGbydet

Новичок
Пользователь
Апр 22, 2020
1
0
1
Windows
Python 3.8

Напишите программу, которая находит все решения заданного вам уравнения на интервале [-5; 5]. Программа должна выполнить следующие действия:
  1. Определяет и выводит на экран интервалы, на которых расположены корни уравнения.
  2. На каждом интервале, используя метод перебора, ищет решение с точностью 0,001 и выводит полученные решения на экран.
  3. Вычисление функции, стоящей в левой части уравнения, оформите в виде подпрограммы.
Уровень B. Составить две программы (можно одну), одна из которых выделяет все интервалы, на которых находятся корни, а вторая запрашивает левую границу очередного интервала и выводит найденный корень уравнения.

ГЛАВНОЕ, ЧТОБЫ РАБОТАЛО СЛЕДУЮЩИЕ:
Программа может быть не универсальной, можно не вводить уравнение, а уже работать с этим!


Уровнение: Корни:
x * x * x + 2 * x * x - 8 * x + 1 + 2 * math.sin(x) + 15 * math.cos(x)​
-3.123 1.493 2.638​

Я смог сделать только это, но и то корни выводит неверно.

Python:
import math


def f(x):
    return x * x * x + 2 * x * x - 8 * x + 1 + 2 * math.sin(x) + 15 * math.cos(x)


a = -5
b = 5
delta = 0.001
h = 0.05
x = a
while x <= b:
    if f(x) * f(x * delta) <= 0:
        print(x + delta / 2)
    x += h
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример для данного уравнения (для других он не подойдет из-за проблем с точностью расчетов):
Python:
import math


def f(x):
    # возвращаем результат функции, округленный до двух знаков после запятой
    # это нужно для того чтобы получить ответ
    # без округления таким способом вычислить не получится   
    return round(x * x * x + 2 * x * x - 8 * x + 1 + 2 * math.sin(x) + 15 * math.cos(x), 2)


def main():

    # интервал от -5 до 5 с шагом 0.001
    interval = [x / 1000.0 for x in range(-5000, 5001, 1)]

    # проход в цикле по интервалу
    for i, item in enumerate(interval):
        # первый элемент
        if i == 0:
            # если подходит - выводит в консоль
            if round(f(item), 2) == 0:
                print(item)

        # остальные элементы
        # если предыдущий не был ответом, то выводим в консоль
        # это проверка нужна для того чтобы не выводило лишние
        # результаты, вызванные округлением
        elif round(f(item), 2) == 0 and round(f(interval[i - 1]), 2):
            print(item)



if __name__ == '__main__':
    main()
 
  • Мне нравится
Реакции: Student

Форум IT Специалистов