Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2021, 13:53   #1
buk_bear
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 10
По умолчанию Метод деления отрезка пополам C++

Здравствуйте дорогие форумчане, нужна ваша помощь. Необходимо реализовать нахождение корней уравнения методом деления отрезка пополам.
Я составил код нахождение корней уравнения методом Ньютона. Как его изменить, чтобы получился методом деления отрезка пополам? Помогите пожалуйста .
Язык программирования C++. Компилятор Dev-C++

Код нахождение корней уравнения методом Ньютона:
Код:
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;
 
const double eps = 1e-5;
 
// функция 
double f(const double x)
{
    return x*x*x - 8*x*x + 11*x + 20;
}
 
// производная функции
double df(const double x)
{
    return (f(x+eps)-f(x-eps))/(2*eps); // численное вычисление производной
    //return 3*x*x - 16*x + 11; // аналитическое вычисление производной
}
 
// поиск корня
double getRoot(double x)
{
   double x1  = x - f(x)/df(x);
   double x0 = x;
   while(fabs(x0-x1) > eps)
   {
      x0 = x1;
      x1 = x1 - f(x1)/df(x1);
   }
   return x1;
}
 
int main()
{
    cout <<"Roots"<< endl;
    cout << setprecision(8) << getRoot(-4) << endl;
    cout << setprecision(8) << getRoot(2) << endl;
    cout << setprecision(8) << getRoot(6) << endl;
}
buk_bear вне форума Ответить с цитированием
Старый 09.12.2021, 15:49   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от buk_bear Посмотреть сообщение
Я составил код нахождение корней уравнения
Слукавил "Я нашёл в сети (сдул у одногрупника)" .... На мой взгляд, метод дихотомического деления - самый простой метод нахождения корней.
Вернусь из гастромона - так и быть, помогу. Но наверно найдутся раньше.
Предварительно должен быть найден интервал локадизации корня (корней) .

Последний раз редактировалось digitalis; 09.12.2021 в 15:51.
digitalis вне форума Ответить с цитированием
Старый 09.12.2021, 16:30   #3
buk_bear
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 10
По умолчанию

digitalis, Да, признаюсь, мне немного помогли. Так же у меня есть код реализованный с помощью метода деления отрезка пополам, но мне нужен точно такой же вид как при реализации метода Ньютона.
Вот код:
Код:
#include <iostream>
#include <cmath>

using namespace std;
 
double f(double x)
{
    return x*x*x-8*x*x+11*x+20;
}
 
int main()
{
    double a,b,c;
    double eps = 1e-7;
    cout <<"a = ";
    cin>>a;
    cout <<"b = ";
    cin>>b;
    
    do
    {
        c = (a+b)/2;
        if(f(c)*f(a) <= 0)
        {
        	b = c;
		}
        else
        {
        	a = c;
		}  
    }
    while(fabs(a-b) >= eps);
    cout <<"Root"<< endl;
    cout<<c;
    return 0;
}
buk_bear вне форума Ответить с цитированием
Старый 09.12.2021, 20:02   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Я не понимаю, что значит
Цитата:
такой же вид
Вид может быть только один: правильно или неправильно.
Другой вопрос: тут уже задан интервал локализации корня. Обычно такого подарка задача юзверю не делает. Интервал ищут перебором по сетке или "вручную", обдумывая заданную функцию. А если интервал задан неверно? Будет искать до опупения. А если корней >1 ? Найдёт один, а там - гори оно гаром?
В данном случае - везёт: корень один х=-1.0
digitalis вне форума Ответить с цитированием
Старый 09.12.2021, 22:50   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

buk_bear, возьмите второй код, практически весь код из main вынесите в функцию "double getRoot2(double a, double b)" и по аналогии с вызовом getRoot из первого кода вызывайте с желаемыми интервалами.
Цитата:
Сообщение от digitalis Посмотреть сообщение
В данном случае - везёт: корень один
А wolframalpha еще два корня нашел
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.12.2021, 23:00   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Странно. Мы с Ёкселем прошерстили от -10 до 10 - дальше уходит в бесконечность. Мой кот Мурзик заинтересовался: а что это за корни?
digitalis вне форума Ответить с цитированием
Старый 09.12.2021, 23:11   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

digitalis, -1, 4, 5.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.12.2021, 11:40   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Действительно. Проморгали 2 корня на плоской части кривой.
Ёксель поставлен в угол и лишён воскресной чарки. Кот предупреждён о неполном служебном соответствии.
digitalis вне форума Ответить с цитированием
Старый 14.12.2021, 15:42   #9
buk_bear
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 10
По умолчанию

Спасибо всем кто принимал участие в решении моего вопроса. Я нашёл решение
buk_bear вне форума Ответить с цитированием
Старый 14.12.2021, 16:17   #10
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от buk_bear Посмотреть сообщение
Я нашёл решение
И что не выложить бы его?
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ - Метод деления отрезка пополам (работа с массивами) Fazer77777 Помощь студентам 0 21.02.2015 14:34
метод деления отрезка пополам relyativus Помощь студентам 1 09.12.2011 21:16
Метод деления отрезка пополам Витяака Помощь студентам 2 23.12.2010 11:42
Метод деления отрезка пополам Delphi lordve Помощь студентам 0 06.12.2009 23:57
Вычисление корня уравнения методом деления отрезка пополам Absent Помощь студентам 12 25.11.2007 17:54