Суть метода:
Этот метод является особенно надёжным при нахождении корня уравнения 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 <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();
}
Результаты:
Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.