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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
06.10.2012, 13:23     Метод половинного деления #1
Метод половинного деления для функции 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] выводит просто непонятное число(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 13:23     Метод половинного деления
Посмотрите здесь:

Метод половинного деления. C++
C++ Метод половинного деления в си++
C++ метод половинного деления
Метод половинного деления C++
C++ Метод половинного деления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
06.10.2012, 13:49     Метод половинного деления #2
Цитата Сообщение от yuliyayuliya28 Посмотреть сообщение
if ((A*A+3*sin(A))*(x*x+3*sin(x))<0)
При первой же иттерации (x=0) твое условие не выполняется (выражение = 0)
Надо отдельно рассмотреть случаи ==0 и будет тебе счастье...
yuliyayuliya28
3 / 3 / 0
Регистрация: 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?
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
06.10.2012, 14:19     Метод половинного деления #4
Цитата Сообщение от yuliyayuliya28 Посмотреть сообщение
Т.е. если ((A*A+3*sin(A))*(x*x+3*sin(x))=0) то сразу корень x=0?
Корень или x или A (мб и оба)
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
06.10.2012, 14:29  [ТС]     Метод половинного деления #5
Цитата Сообщение от Байт Посмотреть сообщение
Корень или x или A (мб и оба)
а как это проверить?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 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;
}
Ведь проще вынести свою функцию в отдельный блок?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2012, 21:28     Метод половинного деления
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
yuliyayuliya28
3 / 3 / 0
Регистрация: 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;
}
Ведь проще вынести свою функцию в отдельный блок?)
Спасибо я и не подумала)
Yandex
Объявления
06.10.2012, 21:28     Метод половинного деления
Ответ Создать тему
Опции темы

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