Сделать домашней|Добавить в избранное
 

Сайт, посвящен программированию,
исходникам разных программ и
известным алгоритмам

 
на правах рекламы

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

Автор: admin от 28-03-2012, 10:37

Суть метода:
Этот метод является особенно надёжным при нахождении корня уравнения f(x)=0, когда о поведении функции f(x) мало, что известно. Пусть f(x) – функция действительной переменной x и пусть известен интервал (a; b), на котором функция меняет знак. Следовательно, между a и b существует точка, в которой функция обращается в ноль. Если разделить интервал пополам и определить, положительна или отрицательна функция в точке деления, то тем самым найдем подынтервал, в котором функция меняет знак.

При заданной абсолютной погрешности Е алгоритм метода деления пополам состоит из следующих шагов:
1) вычислить f(a) и f(b)
2) положить c=(a+b)/2, вычислить f(c) 
3) если f(c) = f(a), то заменить a на с, в противном случае заменить b на с
4) если b-a>E, перейти к шагу 2; в противном случае прекратить вычисления, поскольку достигнута требуемая точность.
 Любой из концов отрезка или их полусумма может быть использован в качестве корня уравнения: f(x)=0.

Поставленная задача:
1) Y=3*cos(2*x-4); точность: 0,001; интервал: [1; 3]
2) Y=x-cos(x); точность: 0,001; интервал: [0; 1]
3) Y=x-ln(x); точность: 0,001; интервал: [0; 1]

Листинг

#include <iostream.h>
#include <math.h>
#include <conio.h>

float mpd1(float x) // functions mpd - "metod polovinnogo deleniya"
{
  return (3*cos(2*x+4));
}

float mpd2(float x)
{
  return (x-cos(x));
}

float mpd3(float x)
{
   return (x-log(x));
}

void main()
{
float a,b,c,e;
int i=1, number;
clrscr();
  cout<<"1. y=3*cos(2*x+4)\n"<<"2. y=x-cos(x)\n"<<"3. y=x-ln(x)\n\n";
  cout<<"Enter number: ";
  cin>>number;
  cout<<"Start a=";
  cin>>a;
  cout<<"End b=";
  cin>>b;
  cout<<"Enter accuracy e=";
  cin>>e;
  c=(a+b)/2;
  cout<<"\nc="<<c;

switch(number)
{
  case 1:
          while((fabs(b-a)>e)&&(mpd1(c)!=0))
                      {
                      if (mpd1(a)*mpd1(c)<0)
                         b=c;
                      else
                         a=c;
                         c=(a+b)/2;
                         cout<<"c="<<c<<endl;
                         i++;
                      }
  break;
  
  case 2:
          while((fabs(b-a)>e)&&(mpd2(c)!=0))
                      {
                      if (mpd2(a)*mpd2(c)<0)
                         b=c;
                      else
                         a=c;
                         c=(a+b)/2;
                         cout<<"c="<<c<<endl;
                         i++;
                      }
  break;
  
case 3:
           while((fabs(b-a)>e)&&(mpd3(c)!=0))
                      {
                      if (mpd3(a)*mpd3(c)<0)
                         b=c;
                      else
                         a=c;
                         c=(a+b)/2;
                         cout<<"c="<<c<<endl;
                         i++;
                      }
  break;
  default: "invalid number";
  }
cout<<"\nSought number c="<<c<<endl;
cout<<"it is found for i="<<i<<" steps";
getch();
}


Результаты:
Метод половинного деления C++

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

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

 

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

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Группа: Гости
  • ICQ: --
  • Регистрация: --
  • Комментариев: 0
  • Публикаций: 0
^
Метод хорд можно применить в качестве "последнего штриха" после того, как метод половинного деления гарантирует требуемую точность - это не улучшит существенно гарантируемой точности, но, скорее всего, на несколько порядков повысит точность решения.