Найти значение функции используя ряд Тейлора - Turbo Pascal
Формулировка задачи:
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от значения х нач до х кон с шагом дх с точностью Экспоненты. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.
есть код, но неправильный
пожалуйста, помогите!
Листинг программы
- Program lab33;
- var f,x,eps,s,a:real;
- x1,x2,dx:real;
- i,n: integer;
- begin
- write('x=');readln(x);
- write('x2=');readln(x2);
- write('dx=');readln(dx);
- write('eps=');readln(eps);
- writeln('*******************************************');
- writeln('* n * f * s * a * x *');
- writeln('*******************************************');
- while x<=x2 do
- begin
- if (abs(x)>1) then
- begin
- n:=1; a:=1/x; s:=a;
- while (abs(a)>eps) do
- begin
- a:=((2*n+1))/((2*n+3)*x*x)*a;
- s:=s+a;
- n:=n+1;
- end;
- writeln('* ',n:3,' * ',ln((x+1)/(x-1)):7:4,' * ',(2*s):7:4,' * ',a:7:4,' *',x:5:1,'*');
- end
- else
- writeln('no');
- x:=x+dx;
- end;
- writeln('*******************************************');
- readln;
- end.
Решение задачи: «Найти значение функции используя ряд Тейлора»
textual
Листинг программы
- function GetPrecision(eps: Double): Byte;
- var
- Result: Byte;
- begin
- Result := 0; eps := Abs(eps);
- while (eps < 1) do
- begin
- eps := eps * 10;
- Inc(Result);
- end;
- GetPrecision := Result;
- end;
- procedure PrintLine(const n: Byte);
- var
- i: Byte;
- begin
- for i := 1 to n do
- Write('-');
- WriteLn;
- end;
- var
- xa, xb, xh, s, si, eps: Double;
- i: Word;
- precision: Byte;
- begin
- Write('Input Xa='); ReadLn(xa);
- repeat
- Write('Input Xb='); ReadLn(xb);
- until (xb >= xa);
- Write('Input Xh='); ReadLn(xh);
- Write('Input eps='); ReadLn(eps);
- precision := GetPrecision(eps);
- PrintLine(34 + 2 * precision); //WriteLn(LINE);
- WriteLn('| x | ', 'f(x)':(4 + precision), ' | ', 'sum':(4 + precision), ' | n |');
- PrintLine(34 + 2 * precision); //WriteLn(LINE);
- while (xa <= xb) do
- begin
- if (Abs(xa) > 1)
- then
- begin
- s := 0; i := 0; si := 1 / xa;
- while (Abs(si) > EPS) do
- begin
- s := s + si / (2 * i + 1);
- Inc(i);
- si := si / Sqr(xa);
- end;
- WriteLn('| ', xa:8:2, ' | ', Ln((xa + 1) / (xa - 1)):(4 + precision):precision, ' | ', (2 * s):(4 + precision):precision, ' | ', (i + 1):5, ' |');
- end
- else
- WriteLn('| ', xa:8:2, ' | ', 'inf':(4 + precision), ' | ', 'inf':(4 + precision), ' | - |');
- xa := xa + xh;
- end;
- PrintLine(34 + 2 * precision); //WriteLn(LINE);
- end.
Объяснение кода листинга программы
- Функция GetPrecision принимает аргумент eps типа Double и возвращает тип Byte. Она использует цикл while для увеличения значения Byte в соответствии с увеличением eps до тех пор, пока eps меньше 1.
- Простой цикл for используется в процедуре PrintLine для вывода ряда из 34 точек (-) через пробел.
- Переменные xa, xb, xh, s, si и eps объявлены как Double, а i как Word. Переменная precision инициализируется значением, возвращаемым функцией GetPrecision.
- В блоке while переменная s инициализируется как 0, а i и si инициализируются как 0 и 1/xa соответственно. Цикл while выполняется, пока abs(si) больше или равен EPS.
- Внутри цикла while переменная s обновляется как сумма si / (2 * i + 1). Индекс i увеличивается на 1, а si делится на 2.
- После завершения цикла while выводится строка с xa, Ln((xa + 1) / (xa - 1)) и (4 + precision):precision. Если xa больше или равно 1, то выводится
inf
вместо значений xa и Ln. - После вывода строки с xa выводится ряд из 34 точек (-) через пробел.
- Переменная xa обновляется как xa + xh.
- Выводится последняя строка с xa, Ln((xa + 1) / (xa - 1)) и (4 + precision):precision. Если xa больше или равно 1, то выводится
inf
вместо значений xa и Ln.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д