Уточнение корня по методу половинного деления

 

Пусть решается уравнение f(x)=0 и функция f(x) непрерывна на отрезке [a,b] =[x1,x2].

Отрезок [a,b] содержит корень, т.е. f(a)*f(b)<0.

Делим отрезок [a,b] пополам, т.е. выбираем начальное уравнение корня x= , если f(x)=0, то х является корнем уравнения, если f(x) не равно нулю, то выбираем тот из отрезков [a,x] или [x,b], на концах которого функция f(x) имеет противоположные знаки. Выбранный отрезок снова делим пополам и проводим те же рассуждения. Процесс деления отрезков пополам продолжается до тех пор, пока длина отрезка на концах которого функция имеет разные знаки не станет < e

 

[b-a]< e =10-5.

 

 

 


Схема реализации алгоритма имеет вид: [a,b]=[x1,x2] e=10-5

 


Уточнение корня по методу Хорд

 

По методу Хорд выбирается произвольное начальное значение корня из отрезка [a,b] на котором корень существует xÎ[a,b]=[x1,x2].

Затем по методу Хорд корень уточняется. Найденное новое значение корня подставляется в правую часть уравнения и т.д. пока разность между двумя приближениями не станет меньше < e = 10-5. Расчётная формула метода Хорд имеет вид:

xn+1=xn- (b-x).

Графический метод Хорд имеет вид:

 

 

 

Отделение корней

 


program otd;

x1=a        
label 10;

x2 =x1 + h
var

a,b,x1,x2,y1,y2,h,d:real;

y1=f(x1)
function f(x:real):real;

begin

y2=f(x2)
f:=2.2*x-exp(x*ln(2));

Нет
end;

Да
begin

writeln(‘введите a,b,h’);

readln(a,b,h); 

x1=x2 x2=x1+h y1=y2
x1:=a;x2:=x1+h;

y1:=f(x1);

10: y2:=f(x2);

Да
if y1*y2<0 then writeln(x1:8:5,' ',x2:8:5);

x1:=x2;x2:=x1+h;

Нет
y1:=y2;

if x2<=b then goto 10;

readln;


End.

 

ввод:

0.1,10,1e-4

ответ:

х1=0.10000

х2=1.10000



Уточнение корней

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

 

 


x =(a+b)/2
program del;

label 2, 10;

z=f(x)
var a,b,e,x,y,z:real;

Да
function f(x:real):real;

     
 
Нет


Нет
Да
begin

f:= 2.2*x-exp(x*ln(2));

     
a=x y=z
b=x


end;

begin

Да
writeln(‘введите a,b,e’);

 

readln(a,b,e);

Нет
y:=f(a);

10:x:=(a+b)/2;

z:=f(x);

if z=0 then goto 2;

if y*z<0 then b:=x;

 begin a:=x; y:=f(b); end;

if b-a>e then goto 10;

2:writeln('x=',x:8:5);

readln;

end.

ввод:

0.1, 1.1, 1е-5

ответ:

х=0.78111







Метод хорд


y=f(x)/(f(b)-f(x))*(b-x)        
program horda;

label 10;

d=|y-x|
var e,x,b,y,d:real;

x=y
function f(x:real):real;

begin

Да
f:= 2.2*x-exp(x*ln(2));

Нет
 

end;

y=f(x)
begin

writeln(‘введите x,b,e’);

readln(x,b,e);

10: y:=x-f(x)/(f(b)-f(x))*(b-x);

d:=abs(y-x);

x:=y;

if d>e then goto 10;

y:=f(x);

writeln('x=',x:8:5);

end.

ввод:

0.1, 1.1, 1е-5

ответ:

х=0.78110  

 

Проверка уравнения в ППП "Eureka"

Ввод:

2.2*x-exp(x*ln(2))=0

Ответ:

X=0.78091254

Maximum error is 3.5465456e-7

 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: