Форум программистов, компьютерный форум CyberForum.ru

Кубическое уравнение методом половинного деления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Abortmaher007
 Аватар для Abortmaher007
9 / 9 / 0
Регистрация: 22.01.2010
Сообщений: 67
24.01.2010, 23:32     Кубическое уравнение методом половинного деления #1
Дано кубическое уравнение x^3 + a*x^2 + b*x + c = 0 имеющие три действительных корня на отрезке (-10; 10). Найти корни уравнения с точностью до 1/1000 методом половинного деления. Проверить полученное уравнение корней подставив
a = - 2,52 b= - 27,342 c= 25, 952

С графиком

Язык ТУРБО СИ

Добавлено через 21 минуту
Глухо пока
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
24.01.2010, 23:48     Кубическое уравнение методом половинного деления #2
Сначала надо исходный отрезок разбить на 3 части, в каждой из которых только один корень
Для этого надо решить уравнение 3* x^2 + 2*a*x + b = 0;
Это ур-е решаем просто, как в школе учили. x1 и x2 - точки максимума и минимума исходной функции
(Нарисуй!)
Получаем массив double mm[4] = { -10, x1, x2, 10 };
for (i=0; i<3; i++) {
// решаем уравнение на отрезке mm[i], mm[i+1]
}
на картинке все будет видно
Abortmaher007
 Аватар для Abortmaher007
9 / 9 / 0
Регистрация: 22.01.2010
Сообщений: 67
25.01.2010, 13:45  [ТС]     Кубическое уравнение методом половинного деления #3
Про написание программы можно подробней немного?
BigMax
3 / 2 / 1
Регистрация: 18.09.2009
Сообщений: 10
25.01.2010, 15:51     Кубическое уравнение методом половинного деления #4
Цитата Сообщение от Abortmaher007 Посмотреть сообщение
Про написание программы можно подробней немного?
C++
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
void CuttingHalfMethod(Data *data)
        {
            double a = data->a;
            double b = data->b;
            double eps = data->eps;
            double c = 0;
            int n = 0;
            int maxN = data->maxN;
 
            if (f(a) * f(b) < 0)
            {
                while (fabs(a - b) > eps && n < maxN)
                {
                    c = (a + b) / 2;
 
                    if (f(a) * f(c) < 0)
                        b = c;
                    else
                        a = c;
                    n++;
                }
                if (n == maxN)
                    data->isMaxIterDone = true;
                else
                    c = (a + b) / 2;
                data->rez = c;
            }
            else
                data->isCansel = true;
        }
struct Data
{
double a;
double b;
double eps;
double maxN;
bool isMaxIterDone;
bool isCansel;
double rez;
};
Здесь a b это границы интервала на котором должен быть корень.
eps это погрешность.
maxN максимально возможное число итераций (на случай бесконечного цикла);
isMaxIterDone флаг было ли достигнуто maxN (т.е. по какому условию был выход из цикла: по погрешности или по итерациям)
isCansel флаг того что на интервале нет корней
rez - результат
Тоесть создаешь структуру Data. Инициализируешь входные данные. После работы функции проверяешь флаги и делаешь вывод был ли найден корень и по какому условию найден.
Yandex
Объявления
25.01.2010, 15:51     Кубическое уравнение методом половинного деления
Ответ Создать тему
Опции темы

Текущее время: 12:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru