На заданном отрезке найти все корни уравнения f(x)=0 с точностью e - Free Pascal
Формулировка задачи:
на заданном отрезке найти все корни уравнения f(x)=0 с точностью e
Решение задачи: «На заданном отрезке найти все корни уравнения f(x)=0 с точностью e»
textual
Листинг программы
function F(x:real):real;
begin
F:=1/sin(x)-exp(ln(2)*x)+0.5;
end;
{нахождение корня методом бисекции}
function Bisec(a,b,e:real):real;
var x,c:real;
begin
repeat
c:=(a+b)/2;
if F(a)*F(c)<0 then b:=c
else a:=c;
until b-a<e;
Bisec:=(a+b)/2;
end;
var x,x1,x2,dx,x11,x12,eps:real;
i:integer;
begin
repeat
writeln('Введите начало и конец отрезка');
readln(x1,x2);
until x2>x1;
repeat
write('Введите точность 0<eps<1 eps=');
readln(eps);
until(eps>0)and(eps<1);
dx:=0.1;
x:=x1;
i:=0;
while x<=x2 do
begin
x11:=x;
x12:=x+dx;
if(sin(x11)*sin(x12)>0) and(F(x11)*F(x12)<0) then
begin
i:=i+1;
writeln('X',i,'=',Bisec(x11,x12,eps):8:5);
end;
x:=x+dx;
end;
if i=0 then write('На данном интервале корней нет');
readln
end.
Объяснение кода листинга программы
- Введенные пользователем значения функции F(x) хранятся в переменных типа real: F(x) = 1/sin(x) - exp(ln(2)*x) + 0.5
- Функция Bisec(a, b, e) используется для нахождения корня методом бисекции. Она принимает на вход значения a и b, обозначающие начало и конец интервала, в котором ищется корень, а также точность e.
- Логика работы функции Bisec следующая:
- Если значения функций F(a) и F(c) имеют разные знаки, то новое значение интервала равно половине старого интервала.
- Если значения функций F(a) и F(c) имеют одинаковый знак, то новое значение интервала равно середине старого интервала.
- Этот процесс продолжается до тех пор, пока новое интервал не станет меньше заданной точности e.
- В основной программе введены следующие переменные:
- x1, x2 - начало и конец интервала, в котором ищется корень;
- eps - заданная точность;
- dx - шаг интервала;
- x - текущее значение интервала;
- i - счетчик найденных корней;
- x11, x12 - ближайшие точки интервала, значение функции в которых проверяется на наличие корня.
- В цикле while происходит перебор значений интервала от x1 до x2 с шагом dx.
- Для каждой пары соседних точек интервала проверяется условие (sin(x11)sin(x12)>0) and(F(x11)F(x12)<0), которое означает, что точка x11 является левым корнем, а точка x12 - правым корнем.
- Если это условие выполняется, то значение интервала заменяется на середину между x11 и x12, а счетчик i увеличивается на 1.
- В конце программы выводится сообщение о количестве найденных корней или об их отсутствии.