Здесь решаем примеры Proc40 - Proc45 из задачника Абрамяна, где с помощью процедур (подпрограмм) вычисляем значения функций e<sup>x</sup>, sin(x), cos(x), ln(1 + x), arctg(x), (1 + x)<sup>a</sup>
, используя разложения последних в ряд Тейлора.
Proc40. Описать функцию Exp1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции exp(x):
exp(x) = 1 + x + x2/(2!) + x3/(3!) + … + xn/(n!) + …
(n! = 1·2·…·n). В сумме учитывать все слагаемые, большие ε. С помощью Exp1 найти приближенное значение экспоненты для данного x при шести данных ε.
{ Функция возвращает приближенное значение функции exp(x):
exp(x) = 1 + x + x2/(2!) + x3/(3!) + … + xn/(n!) + …
(n! = 1·2·…·n). В сумме учитываются все слагаемые, большие ε. }
function Exp1(x, e: real): real;
var
a: real;
j: byte;
f: real;
begin
f := 1; //начальная сумма равна 1
j := 1; //начальный показатель степени x
a := 1; //первое слагаемое в данной сумме
while a > e do begin
a := a * x / j; //находим очередное слагаемое
f := f + a; //находим сумму
inc(j) //показатель степени увеличиваем на 1
end;
Exp1 := f
end;
{ Основная программа }
const
n = 6;
var
e, x: real;
i: byte;
begin
write('x = ');
readln(x);
if x <> 0 then //проверяем только для x ≠ 0
for i := 1 to n do begin //количество вычислений = n
write('e = ');
readln(e); //вводим точность вычисления
{ Вызываем функцию, если ε > 0: }
if e > 0 then writeln(' результат: ', Exp1(x, e))
else writeln(' Ошибка: ε должно быть больше 0!');
writeln
end
else writeln(' результат: ', 1)
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**procedure** Inc(**var** i: integer);
: Увеличивает значение переменной i на 1**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните последнюю задачу с решениями For21 и For22 на странице Функции с использованием факториала.
Proc41. Описать функцию Sin1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции sin(x):
sin(x) = x − x3/(3!) + x5/(5!) − … + (−1)n·x2·n+1/((2·n+1)!) + …
В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Sin1 найти приближенное значение синуса для данного x при шести данных ε.
{ Функция возвращает приближенное значение функции sin(x):
sin(x) = x − x3/(3!) + x5/(5!) − x7/(7!) + … .
В сумме учитываются все слагаемые, по модулю большие ε }
function Sin1(x, e: real): real;
var
i: byte;
a, S: real;
begin
a := x; //начальное значение слагаемого
i := 1; //начальный показатель степени x
S := 0; //начальное значение функции
while abs(a) > e do begin //условие входа в цикл
S := S + a; //увеличиваем сумму
i := i + 2; //увеличиваем показатель степени на 2
//вычисляем очередное значение слагаемого:
a := -a * sqr(x) / (i * (i - 1))
end;
Sin1 := S
end;
var
x, e: real;
i: byte;
begin
write(' x = ');
readln(x); //вводим x
if x <> 0 then //проверяем только для x ≠ 0
for i := 1 to 6 do begin //количество вычислений = 6
write(i, ')e = ');
readln(e); //вводим точность вычисления
{ Выводим результат, вызывая при этом функцию, если ε > 0: }
if e > 0 then writeln(' sin(', x, ') с точностью ', e,
' равен ', Sin1(x, e))
else writeln(' Ошибка: ε должно быть больше 0!');
writeln
end
else writeln(' результат: ', 0) //ответ при x = 0
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Abs(x: real): real;
: Возвращает модуль числа x.**function** Sqr(x: real): real;
: Возвращает квадрат числа x.**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните задачу Proc41 с решением задачи For23.
Proc42. Описать функцию Cos1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции cos(x):
cos(x) = 1 − x2/(2!) + x4/(4!) − … + (−1)n·x2·n/((2·n)!) + …
В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Cos1 найти приближенное значение косинуса для данного x при шести данных ε.
{ Функция возвращает приближенное значение функции cos(x):
cos(x) = 1 − x2/(2!) + x4/(4!) − x6/(6!) + … .
В сумме учитываются все слагаемые, по модулю большие ε }
function Cos1(x, e: real): real;
var
i: byte;
a, C: real;
begin
a := 1; //начальное значение слагаемого
i := 0; //начальный показатель степени x
C := 0; //начальное значение функции
while abs(a) > e do begin
C := C + a; //увеличиваем сумму
i := i + 2; //увеличиваем показатель степени на 2
//вычисляем очередное значение слагаемого:
a := -a * sqr(x) / (i * (i - 1))
end; //условие выхода из цикла
Cos1 := C
end;
var
x, e: real;
i: byte;
begin
write(' x = ');
readln(x); //вводим x
if x <> 0 then //имеет смысл проверять только для x ≠ 0
for i := 1 to 6 do begin //количество вычислений = 6
write(i, ')e = ');
readln(e); //вводим точность вычисления
{ Выводим результат, вызывая при этом функцию: }
if e > 0 then writeln(' cos(', x, ') с точностью ', e,
' равен ', Cos1(x, e))
else writeln(' Ошибка: ε должно быть больше 0!');
writeln
end
else writeln(' результат: ', 1) //ответ при x = 0
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Abs(x: real): real;
: Возвращает модуль числа x.**function** Sqr(x: real): real;
: Возвращает квадрат числа x.**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните задачу Proc42 с решением задачи For24.
Proc43. Описать функцию Ln1(x, ε) вещественного типа (параметры x, ε — вещественные, -1 < X ≤ 1, ε > 0), находящую приближенное значение функции ln(1 + x):
ln(1 + x) = x − x2/2 + x3/3 − … + (−1)n·xn+1/(n+1) + … .
В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Ln1 найти приближенное значение ln(1 + x) для данного x при шести данных ε.
{ Функция возвращает приближенное значение функции ln(1 + x):
ln(1 + x) = x − x2/2 + x3/3 − … + (−1)n·xn+1/(n+1) + … .
В сумме учитываются все слагаемые, по модулю большие ε }
function Ln1(x, e: real): real;
var
i: integer;
a, L: real;
begin
a := x; //начальное значение слагаемого
i := 1; //начальный показатель степени x
L := 0; //начальное значение функции
while abs(a / i) > e do begin //условие входа в цикл
L := L + a / i; //увеличиваем сумму
inc(i); //увеличиваем показатель степени на 1
a := -a * x //вычисляем очередное значение слагаемого
end;
Ln1 := L
end;
var
x, e: real;
i: byte;
begin
write(' x = ');
readln(x); //вводим x
if x <> 0 then //проверяем только для x ≠ 0
for i := 1 to 6 do begin //количество вычислений = 6
write(i, ')e = ');
readln(e); //вводим точность вычисления
{ Выводим результат, вызывая при этом функцию, если ε > 0: }
if e > 0 then writeln(' ln(', 1 + x, ') с точностью ', e,
' равен ', Ln1(x, e))
else writeln(' Ошибка: ε должно быть больше 0!');
writeln
end
else writeln(' результат: ', 0) //ответ при x = 0
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Abs(x: real): real;
: Возвращает модуль числа x.**procedure** Inc(**var** i: integer);
: Увеличивает значение переменной i на 1**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните Proc43 с For25.
Proc44. Описать функцию Arctg1(x, ε) вещественного типа (параметры x, ε — вещественные, -1 < X ≤ 1, ε > 0), находящую приближенное значение функции arctg(x):
arctg(x) = x − x3/3 + x5/5 − … + (−1)n·x2·n+1/(2·n+1) + … .
В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Arctg1 найти приближенное значение arctg(x) для данного x при шести данных ε.
{ Функция возвращает приближенное значение функции arctg(x):
arctg(x) = x − x3/3 + x5/5 − x7/7 + … .
В сумме учитываются все слагаемые, по модулю большие ε }
function Arctg1(x, e: real): real;
var
i: integer;
a, Ar: real;
begin
a := x; //начальное значение слагаемого
i := 1; //начальный показатель степени x
Ar := 0; //начальное значение функции
while abs(a / i) > e do begin //условие входа в цикл
Ar := Ar + a / i; //увеличиваем сумму
i := i + 2; //увеличиваем показатель степени на 2
a := -a * x * x //вычисляем очередное значение слагаемого
end;
Arctg1 := Ar
end;
var
x, e: real;
i: byte;
begin
write(' x = ');
readln(x); //вводим x
if x <> 0 then //проверяем только для x ≠ 0
for i := 1 to 6 do begin //количество вычислений = 6
write(i, ')e = ');
readln(e); //вводим точность вычисления
{ Выводим результат, вызывая при этом функцию, если ε > 0: }
if e > 0 then writeln(' arctg(', x, ') с точностью ', e,
' равен ', Arctg1(x, e))
else writeln(' Ошибка: ε должно быть больше 0!');
writeln
end
else writeln(' результат: ', 0) //ответ при x = 0
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Abs(x: real): real;
: Возвращает модуль числа x.**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните Proc44 с For26.
Proc45. Описать функцию Power4(x, a, ε) вещественного типа (параметры x, a, ε — вещественные, |x| < 1; a, ε > 0), находящую приближенное значение функции (1 + x)a:
(1 + x)a = 1 + a·x + … + a·(a−1)·…·(a−n+1)·xn/(n!) + … .
В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Power4 найти приближенное значение (1 + x)a для данных x и a при шести данных ε.
{ Функция возвращает приближенное значение функции (1 + x)^a:
(1 + x)^a = 1+a·x+a·(a−1)·x^2/(2!)+a·(a−1)·(a−2)·x^3/(3!) + …
В сумме учитываются все слагаемые, по модулю большие ε }
function Power4(x, a, e: real): real;
var
i: byte;
d: real;
pow: real;
begin
d := 1; //начальное значение слагаемого
i := 0; //начальный показатель степени x
pow := 0; //начальное значение функции
while abs(d) > e do begin
pow := pow + d; //увеличиваем сумму
inc(i); //увеличиваем показатель степени на 2
//вычисляем очередное значение слагаемого:
d := d * (a - i + 1) * x / i
end; //условие выхода из цикла
Power4 := pow
end;
var
x, a, e: real;
i: byte;
begin
write(' x = ');
readln(x); //вводим x
write(' a = ');
readln(a); //вводим показатель степени a
if x <> 0 then //имеет смысл проверять только для x ≠ 0
for i := 1 to 6 do begin //количество вычислений = 6
write(i, ')e = ');
readln(e); //вводим точность вычисления
{ Выводим результат, вызывая при этом функцию: }
if (e > 0) and (a > 0) then
writeln(' (', 1 + x, ')^', a, ' с точностью ', e,
' равен ', Power4(x, a, e))
else writeln(' Ошибка: ε и a должны быть больше 0!');
writeln
end
else writeln(' результат: ', 1) //ответ при x = 0
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Abs(x: real): real;
: Возвращает модуль числа x.**procedure** Inc(**var** i: integer);
: Увеличивает значение переменной i на 1**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните Proc45 с For28.