Решение нелинейного уравнения методом половинного деления - Pascal ABC
Формулировка задачи:
Задание следующее: "вычислить первый положительный корень уравнения F(x)=0 с заданной погрешностью e (e=10^(-3)/10^(-6)) на интервале [c;d]."
У меня F(x)=sin(x)+x-1, интервал [0;8]. Как было сказано в заголовке, данное уравнение я решал методом половинного деления:
Программа то работает, вот только мне приходится вбивать +100500 значений "е" (и это я говорю на полном серьезе). Почему так происходит, я понятия не имею. Заранее спасибо.
Решение задачи: «Решение нелинейного уравнения методом половинного деления»
textual
Листинг программы
const xn=0; xk=8; function f(x:real):real; begin f:=sin(x)+x-1; end; var e,x,h,a,b,c:real; k:byte; begin repeat write('0.000001<e<0.001 e='); readln(e); until(e>0.000001)and(e<0.001); //ищем интервал x:=xn; h:=0.1; k:=0; while(x<xk)and(k=0) do if f(x)*f(x+h)<0 then k:=1 else x:=x+h; if k=0 then writeln('Корней в интервале [0;8] нет') else //если нашли, уточняем корень begin a:=x; b:=x+h; repeat c:=(a+b)/2; if F(x)*F(c)<=0 then b:=c else a:=c; until abs(b-a)<e; x:=(a+b)/2; writeln('Первый положительный корень=',x:0:6); end; end.
Объяснение кода листинга программы
- const xn=0;
- const xk=8;
- function f(x:real):real;
- begin
- f:=sin(x)+x-1;
- end;
- var e,x,h,a,b,c:real;
- k:byte;
- begin
- repeat
- write('0.000001<e<0.001 e=');
- readln(e);
- until(e>0.000001)and(e<0.001);
- //ищем интервал
- x:=xn;
- h:=0.1;
- k:=0;
- while(x<xk)and(k=0) do
- if f(x)*f(x+h)<0 then k:=1
- else x:=x+h;
- if k=0 then writeln('Корней в интервале [0;8] нет')
- else
- //если нашли, уточняем корень
- a:=x;
- b:=x+h;
- repeat
- c:=(a+b)/2;
- if F(x)*F(c)<=0 then b:=c
- else a:=c;
- until abs(b-a)<e;
- x:=(a+b)/2;
- writeln('Первый положительный корень=',x:0:6);
- end;
- end.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д