Построить таблицу зависимости длины ряда n, чтобы обеспечить точность функции ln(x) не меньше заданной - PascalABC.NET
Формулировка задачи:
1. Построить таблицу зависимости длины ряда n, что обеспечивает точность функции ln(x) не меньше заданное значение eps в точке x = (b + a) / 2, от eps:
Значение eps меняется о 10-2 до 10-14 с шагом 10-3
Разложение в ряд ln(x):
2. Для n (длина ряда фиксированная и равна n), полученного в п.1 при eps = 10-8, в точках xi = a + hi, h = (b – a)/10, i = 0, ..., 10 вычислить абсолютную погрешность и остаточный член ряда. Результаты представить в виде таблицы:
Закомментированы строки, при которых работает программа для гиперболического синуса sh(x) функция (при этом условии всё работает нормально).
Помогите решить проблему: при выводе на экран не меняется значения Абсолютной погрешности в 1-й таблице и соответственно остаточный член остаётся равен нулю! Где-то что-то нужно поправить, но не могу найти где...
eps | n | Абсолютная погрешность
|
Остаточный член
|
10-2 | 4 | 0.005 | 0.001 |
... | ... | ... | ... |
xi | Абсолютная погрешность
|
Остаточный член
|
10-2 | 0.005 | 0.001 |
... | ... | ... |
Решение задачи: «Построить таблицу зависимости длины ряда n, чтобы обеспечить точность функции ln(x) не меньше заданной»
textual
Листинг программы
program lnx; //uses crt; var x, e, s, a, i, b: real; n: integer; begin //clrscr; i := 0.98; // начало отрезка b := 5.5; // конец отрезка x := (i + b) / 2; e := 0.001; // точность writeln('<br>'); Write('Точность |');write('n |');Write(' Абсолютная ошибка |');writeln(' Остаточный член ряда |'); writeln('<br>'); while e >= power(10, -14) do // продолжаем пока "e" >= 10 в -14 begin s := 0; n := 1; a := 1; repeat //a := a * (x - 1) / x; a := power(-1,n-1)* power(x-1, n)/n; //s := s + a / n; s:= s + a; n := n + 1; until a / n < e; write(e, ' |'); write(n, ' |'); //writeln('Сумма ряда',s:25:15); //writeln('ln(',x:6:5,')=',Ln(x):25:15); write(abs(ln(x) - s):18:15, ' |'); //Абсолютная ошибка //a := a * (x - 1) / x; a := power(-1,n-1)* power(x-1, n)/n; //s := s + a / n; s:= s + a; writeln(s:18:15, ' |'); // Остаточный член ряда e := e / 1000; end; writeln('<br>'); readln; end.
Объяснение кода листинга программы
- Ввод начальных значений переменных: i := 0.98; b := 5.5; x := (i + b) / 2; e := 0.001;
- Цикл while для построения ряда: Счетчик n инициализируется единицей. Переменная a инициализируется единицей. Переменная s инициализируется нулем. Цикл выполняется до тех пор, пока остаток от деления абсолютной ошибки на 10 в степени -14 не станет меньше или равным заданной точности e.
- В цикле: a := a (x - 1) / x; a := power(-1,n-1) power(x-1, n)/n; s := s + a / n; n := n + 1;
- После цикла: Вывод значений n, абсолютной ошибки и остаточного члена ряда.
- Ввод-вывод заголовок цикла while: writeln(''); Write('Точность |');write('n |');Write(' Абсолютная ошибка |');writeln(' Остаточный член ряда |'); writeln('');
- После цикла while: e := e / 1000;
- Ввод-вывод заголовок цикла while: writeln('___'); readln;
- Ввод-вывод окончание программы: end.