Пусть решается уравнение 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;
label 10;
x1=a
var
x2 =x1 + h
a,b,x1,x2,y1,y2,h,d:real;
function f(x:real):real;
y1=f(x1)
begin
f:=2.2*x-exp(x*ln(2));
y2=f(x2)
end;
Нет
begin
Да
writeln(‘введите a,b,h’);
readln(a,b,h);
x1:=a;x2:=x1+h;
x1=x2
x2=x1+h
y1=y2
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
Уточнение корней
Метод половинного деления
|
label 2, 10;
|
|
| |||
|
|
f:= 2.2*x-exp(x*ln(2));
| ||||
| ||||
end;
begin
|
readln(a,b,e);
|
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
Метод хорд
|
label 10;
|
|
begin
f:= 2.2*x-exp(x*ln(2));
Да
|
end;
|
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