Root /ArchiveAbout
()

Proc 40 - 45

Proc 40 - 45

Здесь решаем примеры 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.