На заданном отрезке найти все корни уравнения с заданной точностью - Free Pascal
Формулировка задачи:
На заданном отрезке найти все корни уравнения f(x)=0 с точностью . . Вот код, но при вводе "" программа виснет. Помогите исправить.
Листинг программы
- const h=0.1;
- var a,b,C,D,e,XN,XK,S: real;
- K : integer;
- function F(x: real): real;
- begin
- F:= exp(x)- cos(x)*cos(x)-0.1
- end;
- begin
- repeat
- write('a=');
- readln(A);
- write('b>a b=');
- readln(B);
- readln(E)
- until (A<B);
- K:=0; C:=A;
- repeat
- D:=C+H;
- if F(C)*F(D)<=0 then
- begin
- XN:=C; XK:=D; K:=1;
- while ABS(XK-XN)>E do
- begin S:=(XN+XK)/2;
- if F(XN)*F(S)<=0 then XK:=S
- else XN:=S
- end;
- write((XK+XN)/2:10:6);
- end;
- C:=D
- until C+H>B;
- if K=0 then writeln('korney net') ;
- readln
- end.
Решение задачи: «На заданном отрезке найти все корни уравнения с заданной точностью»
textual
Листинг программы
- const h=0.1;
- var a,b,C,D,e,XN,XK,S: extended;
- K : integer;
- function F(x: extended): extended;
- begin
- F:= exp(x)- cos(x)*cos(x)-0.1
- end;
- begin
- repeat
- write('a=');
- readln(A);
- write('b>a b=');
- readln(B);
- write('epsilon=');
- readln(E)
- until (A<B);
- K:=0; C:=A;
- repeat
- D:=C+H;
- if F(C)*F(D)<=(1e-32) then
- begin
- XN:=C; XK:=D; K:=1;
- while ABS(XK-XN)>E do
- begin S:=(XN+XK)/2;
- if F(XN)*F(S)<=(1e-32) then XK:=S
- else XN:=S
- end;
- write((XK+XN)/2:10:6);
- end;
- C:=D
- until C+H>B;
- if K<(1e-32) then writeln('korney net') ;
- readln
- end.
Объяснение кода листинга программы
- Объявлены константы и переменные:
- h = 0.1 (поиск корней осуществляется с точностью 0.1)
- a, b, C, D, e, XN, XK, S: extended (это тип данных, подобный float, но с большей точностью)
- K: integer (счетчик, увеличиваемый на 1 при каждом найденном корне)
- F(x): extended (функция, значение которой будет приближенно равно 0 при нахождении корня)
- Задаются начальные значения a и b (с помощью функции readln вводится значение a, затем с помощью функции readln вводится значение b)
- Задается точность e (с помощью функции readln вводится значение e)
- Пока a < b выполняется цикл:
- Задаются значения C и D (C = a, D = a + h)
- Если значение функции F(C) * F(D) меньше или равно 1e-32 (это очень маленькое число, близкое к нулю), то это означает, что между точками C и D находится корень, и цикл изменяет значения C и D, чтобы они стали равными XN и XK соответственно
- Если значение функции F(C) * F(D) больше 1e-32, то значение C заменяется на значение D, и цикл продолжает работу с новыми значениями C и D
- Если корни не найдены (т.е. K < 1e-32), то выводится сообщение
korney net
- Ввод/вывод осуществляется с помощью функции readln (для ввода) и функции writeln (для вывода)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д