Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/88: Рейтинг темы: голосов - 88, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 62

Алгоритм бинарного поиска для решения кубического уравнения с одним корнем

23.11.2019, 00:16. Показов 19137. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый день, пытался написать алгоритм бинарного поиска для решения кубического уравнения с одним корнем( Ax^3 + Bx^2 + Cx + D = 0)
На вход подаются коэффициенты A, B, C, D и нужно вывести ответ с минимум 4 знаками после запятой.
Вот моя тщетная попытка. О, гроссмейстеры codeforces'a и просто добрые люди, помогите разобраться новичку
Python
1
2
3
4
5
6
7
8
9
10
a, b, c, d = map(int, input().split())
l = -1000000
r = 10001000
for i in range(100):
    m = (r + l)/2
    if a * m**3 + b*m**2 + c*m + d > 0:
        r = m
    else:
        l = m
print(f"{m:.{4}f}")
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2019, 00:16
Ответы с готовыми решениями:

Программа для решения кубического уравнения
Программа для решения кубического уравнения,помогите ,пожалуйста

Подскажите метод для численного решения кубического уравнения на С++
Подскажите, пожалуйста, метод для численного решения кубического уравнения на С++.

Комплексные числа для решения кубического уравнения по Кардано
Здравствуйте! У меня задание подготовить программу для решения куб уравнений по формуле Кардано, при этом как работать в Си с...

10
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
23.11.2019, 07:04
Python
1
2
>>> '{:.4f}'.format(m)
'0.1235'
https://pyformat.info/

Добавлено через 31 секунду
Или вопрос был не про вывод?
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
23.11.2019, 16:55
Chelick, ну это не бин. поиск, а итеративное "нечто": за 100 итераций не нашли - ничего страшного, выведем m .
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
23.11.2019, 17:04
Ну 35-36 шагов уже дадут необходимую точность в 4 знака
Code
1
2
3
4
33 0.000640342477709055
34 0.0003201712388545275
35 0.00016008561942726374
36 8.004280971363187e-05
0
23.11.2019, 17:13

Не по теме:

Рыжий Лис, но это неточно :) - упираемся в точность двоичного логарифма от ОДЗ. Например, при 31-значных числах точность будет значительно "хромать".

0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
23.11.2019, 17:17
Расчёт делался для диапазона [-1000000; 10001000].

Я согласен, что не нужно делать фиксированное число итераций, а лучше сравнивать с e=0.0001.

Добавлено через 1 минуту
Или я что-то путаю…
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
23.11.2019, 17:22
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Расчёт делался для диапазона [-1000000; 10001000].
все верно, точности на этих данных хватает. Скорее всего там проблема с округлением - слишком "точно" считаем, а тестирующая система на это не рассчитывала.
0
2 / 2 / 0
Регистрация: 28.09.2018
Сообщений: 18
30.10.2020, 00:42
Вы не сможете решить кубическое уравнение одним бинпоиском, потому что функция кубического уравнения не всегда убывает или возрастает, у нее есть локальный минимум и максимум, из-за этого вы не сможете найти корни (корень) уравнения. То же самое относится к квадратному уравнению, его тоже нельзя решить одним бинпоиском, хотя его можно решить тернарным поиском (но это другая песня) И тернарный поиск тоже не подходит для кубического уравнения.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38194 / 21127 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
30.10.2020, 12:18
Skybi, у полинома степени 3 с вещественными коэффициентами есть хотя один вещественный корень. Что вполне очевидно. Для поиска корней полиномов бинарный поиск хорошо подходит.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#
# Уточнение корня уравнения f(x)=0 на отрезке [a,b] с точностью eps
#
def root(f,a,b,eps=1.0e-8):
    fa=f(a)
    fb=f(b)
    if fa*fb>0:
        return None
    while(True):
        c=(a+b)*0.5
        if abs(a-b)<eps:
            return c
        fc=f(c)    
        if abs(fc)<eps:
            return c
        if fc*fa<0:
            b=c
            fb=fc
        else:
            a=c
            fa=fc
 
#
# Поиск всех корней уравнения f(x)=0 на большом отрезке [a,b] с шагом h и точностью eps
#
def all_roots(f,a,b,h,eps=1.0e-8):
    res=[]
    x1=a
    f1=f(x1)
    while(x1<b):
        x2=x1+h
        f2=f(x2)
        if f1*f2<0:
            r=root(f,x1,x2,eps)
            res.append(r)
        x1=x2
        f1=f2
    return res
 
r=all_roots(lambda x: (x-5)*(x+7)*(x-12)*(x+5.6789)*(x-34)*(x+99),-100,100,0.1,1.0e-15)
print(r)
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
30.10.2020, 14:27
Skybi, всегда можно найти участки (решив квадратное уравнение), где полином третьей степени ведет себя монотонно. А дальше можно и бинпоиск.
1
2 / 2 / 0
Регистрация: 28.09.2018
Сообщений: 18
30.10.2020, 14:31
Ну знаете, это не бинпоиск, а перебор скорее. Откуда мы знаем какого шага будет достаточно чтобы не забрать в диапазон лишнее, а также чтобы мы по времени не упали. Вот вы ищите ответ в диапазоне -100 100, а если ответ лежит в диапозоне -10**9 10**9 ? Что тогда делать будем?

Добавлено через 4 минуты
Здесь да, согласна. Я бы решала так: находим производную данного кубического уравнения (это будет парабола 3ax^2+2bx+c=0) ее корни -- это места где у кубического изгибы (если таковы есть). В таком случае, у нас будет 3 монотонной функции (l - какая-то граница ответа, и r) [l, min(x1, x2)] [min(x1, x2), max(x1, x2)], [max(x1, x2), r] . Я хотела сказать, что тупым бинпоиском не решить задачу. Вы правильно подметили, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.10.2020, 14:31
Помогаю со студенческими работами здесь

Функция для решения кубического уравнения с комплексными коэффициентами
Помогите пожалуйста написать функцию для решения кубического уравнения a*z^3+b*z^2+c*z+d=0 с комплексными коэффициентами. Подстановской...

Составить алгоритм решения биквадратного уравнения используя при этом вспомогательный алгоритм решения квадратного уравнения (процедуры и функции)
Составить алгоритм решения биквадратного уравнения ax4+bx2+c=0 используя при этом вспомогательный алгоритм решения квадратного уравнения...

отделение отрезков в одним корнем уравнения
нужна программа для отделения корней уравнения вида a0*x^n + a1*x^n-1 + .+an-1*x + an = 0 методом Лангранжа. Где а0, a1, an-1, a -...

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

Дополнить программу, что бы заработал алгоритм поиска в линейных структурах с барьером и алгоритм бинарного поиска
Всем привет, помогите пожалуйста закончить код, что бы в результате выводился элемент(ключ), который мы указали, и который мы будем искать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru