Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460

Найти значение корня методом половинного деления

02.09.2015, 21:28. Показов 1002. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
у меня довольно странная проблема.

Я написал тривиальную программу, которая вычисляет значение корня методом половинного деления на заданном интервале и я не могу понять одну вещь, которая сводит меня с ума:

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

Уравнение вида x*x-9*x+14;
У него два корня х1=2 и х2=7

Если ввести в программу интервал a=3 и b=10, то точно находит x=7
А если ввести a=6 и b=8, то выдает х=7.998

Почему так, убей не могу понять!

Код

C++ (Qt)
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
42
43
44
45
46
#include <iostream>
#include <cmath>
using namespace std;
 
 
class dissection{
public:
    float a,b,eps,c;
    float f(float x)
    {
        return  x*x-9*x+14; // Здесь вводим ту функцию, которую будем эксплуатировать
    }
 
    //не могу понять, почему если ввести большой интервал, то работать будет
    //а если маленький, то нет...
    float  mdissect(){
        for(;;){
            c=(a+b)/2;
            if (f(a)*f(c)<0){
                b=c;
            }
            else {
                a=c;
            }
            if((b-a)<eps) break;
        }
        return c;
    }
};
 
class Secant{
 
};
 
int main()
{
    dissection W;
    cout<<"Enter a= ";
    cin>> W.a;
    cout<<"Enter b= ";
    cin>>W.b;
    cout<<"Enter eps= ";
    cin>>W.eps;
    cout<< W.mdissect();
    return 0;
}
Может кто-нибудь знает, в чем тут загвоздка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.09.2015, 21:28
Ответы с готовыми решениями:

Нахождение корня уравнения методом половинного деления
Вообщем дорогие друзья спасайте. Препод сказал сделать программу которая решает методом половинного деления функции, вот только загвоздка...

Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения
Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения x3 + 12x – 2 = 0 на интервале . Абсолютная...

Приближённое значение корня уравнения методом деления отрезка пополам и методом итерации
Методом деления отрезка пополам и методом итераций найти приближённое значение корня уравнения {x}^{3}-{2x}^{2}+x-3=0 на интервале ....

4
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
02.09.2015, 22:29
C++
1
2
3
4
5
6
7
if (f(a)*f(c)>0)
{
a=c;
}
else {
b=c;
}
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
03.09.2015, 07:54
C++
1
2
3
if(fabs(b-a)<eps) break;
//хотя на мой взгляд
if(fabs(f(c))<eps) break;
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
03.09.2015, 13:14
Все же if(fabs(b-a))<eps поскольку ищется корень с определенной точностью, а не значение функции. Убедиться можно на y=x3.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
07.09.2015, 21:27  [ТС]
А вот только сейчас, когда сел и задумался после того, как прошло время, понял.

Фу-ух...

В общем, все дело в том, что когда я ввожу 6 и 8, то в первой итерации получается, что с=7 и соответственно, (так как это корень) само выражение f(a)*f(c) тоже равно нулю и происходит муть.

Проблема решается, если задать, например, а=6.1 и b=7.1


Камень с души...)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2015, 21:27
Помогаю со студенческими работами здесь

Найти корни уравнения методом половинного деления
Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления, указать число разбиений отрезка.

Найти корни уравнения методом половинного деления
Здравствуйте!!! Найти корни уравнения методом половинного деления на интервале от a до b c точностью ε. В случае их отсутствия...

Найти корень уравнения методом половинного деления
Найти корень уравнения методом половинного деления x^2-1/2=0

Методом половинного деления найти решение нелинейных уравнений
Методом половинного деления найти решение следующих нелинейных

Где тут в коде происходит нахождение корня? (метод половинного деления)
не пойму где в коде происходит вычисление корня по методу половинного деления #include &lt;stdio.h&gt; #include &lt;windows.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru