Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
yuliyayuliya28
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
#1

Метод половинного деления

06.10.2012, 13:23. Просмотров 1693. Ответов 6
Метки нет (Все метки)

Метод половинного деления для функции x^2-3*sin(x)=0;
Корнями должны быть -1.7 и 0...на промежутке от -2 до -1 работает и находит -1.7.а 0 не находит(
Никто не знает в чём ошибка?
вот реализация в функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double half_div(double A,double B,double E)
{
    double x=A;
    double xx=B;
    int k=0;
    while (fabs(x-xx)>E)
    {
        xx=x;
        x=(A+B)/2;
        k++;
        if ((A*A+3*sin(A))*(x*x+3*sin(x))<0)//f(a)*f(x)<0
        {
            B=x;
        }
        else
        {
            A=x;
        }
    }
    cout<<"Корень: "<<x<<endl;
    cout<<"Количество итераций: "<<k<<endl;
    return x;
}
для нуля брала промежуток [-0.5;0,5] выводит просто непонятное число(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 13:23
Ответы с готовыми решениями:

Нахождения корней уравнения: метод половинного деления (бисекции) или метод хорд
Разработать программу нахождения корней уравнения f(x) =0 на интервале с...

Метод половинного деления
Здравствуйте, многоуважаемая аудитория данного форума. И не сосчитать сколько...

Метод половинного деления.
Нужно написать программу вводишь любые цифры она их сортирует по...

Метод половинного деления
Дана функция с промежутком. Нужно найти все корни на этом промежутке методом...

Метод половинного деления
Добрый вечер! значит так господа, помогите реализовать этакий метод вот в таком...

6
Байт
Эксперт C
17936 / 11927 / 2478
Регистрация: 24.12.2010
Сообщений: 24,017
06.10.2012, 13:49 #2
Цитата Сообщение от yuliyayuliya28 Посмотреть сообщение
if ((A*A+3*sin(A))*(x*x+3*sin(x))<0)
При первой же иттерации (x=0) твое условие не выполняется (выражение = 0)
Надо отдельно рассмотреть случаи ==0 и будет тебе счастье...
1
yuliyayuliya28
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
06.10.2012, 14:13  [ТС] #3
Цитата Сообщение от Байт Посмотреть сообщение
При первой же иттерации (x=0) твое условие не выполняется (выражение = 0)
Надо отдельно рассмотреть случаи ==0 и будет тебе счастье...
Т.е. если ((A*A+3*sin(A))*(x*x+3*sin(x))=0) то сразу корень x=0?
0
Байт
Эксперт C
17936 / 11927 / 2478
Регистрация: 24.12.2010
Сообщений: 24,017
06.10.2012, 14:19 #4
Цитата Сообщение от yuliyayuliya28 Посмотреть сообщение
Т.е. если ((A*A+3*sin(A))*(x*x+3*sin(x))=0) то сразу корень x=0?
Корень или x или A (мб и оба)
1
yuliyayuliya28
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
06.10.2012, 14:29  [ТС] #5
Цитата Сообщение от Байт Посмотреть сообщение
Корень или x или A (мб и оба)
а как это проверить?
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
06.10.2012, 16:31 #6
yuliyayuliya28,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double f(double x)
{
 return x*x+3*sin(x);
} 
 
double half_div(double A,double B,double E)
{
    double x;
    int k=0;
    while (fabs(B-A)>E)
    {
       x=(A+B)/2;  
        if ( f(A)*f(x)<0 )//f(a)*f(x)<0
           B=x;
        else
           A=x;     
        k++;
    }
    cout<<"Корень: "<<x<<endl;
    cout<<"Количество итераций: "<<k<<endl;
    return x;
}
Ведь проще вынести свою функцию в отдельный блок?)
1
yuliyayuliya28
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
06.10.2012, 21:28  [ТС] #7
Цитата Сообщение от BumerangSP Посмотреть сообщение
yuliyayuliya28,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double f(double x)
{
 return x*x+3*sin(x);
} 
 
double half_div(double A,double B,double E)
{
    double x;
    int k=0;
    while (fabs(B-A)>E)
    {
       x=(A+B)/2;  
        if ( f(A)*f(x)<0 )//f(a)*f(x)<0
           B=x;
        else
           A=x;     
        k++;
    }
    cout<<"Корень: "<<x<<endl;
    cout<<"Количество итераций: "<<k<<endl;
    return x;
}
Ведь проще вынести свою функцию в отдельный блок?)
Спасибо я и не подумала)
0
06.10.2012, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2012, 21:28

Метод половинного деления
Вопрос по поводу половинного деления. Для реализации этого метода нужно знать 2...

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

Метод половинного деления
Скажите почему не выводит &quot;c&quot; #include &lt;stdafx.h&gt; #define _USE_MATH_DEFINES...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru