ВВЕРХ
ВНИЗ
  • Home
  • Proc
  • Proc 40 - 45

Proc 40 - 45

Здесь решаем примеры Proc40 - Proc45 из задачника Абрамяна, где с помощью процедур (подпрограмм) вычисляем значения функций  ex, sin(x), cos(x), ln(1 + x), arctg(x), (1 + x)a,  используя разложения последних в ряд Тейлора.

Proc40. Описать функцию Exp1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции exp(x):

exp(x) = 1 + x + x2/(2!) + x3/(3!) + … + xn/(n!) + …


(n! = 1·2·…·n). В сумме учитывать все слагаемые, большие ε. С помощью Exp1 найти приближенное значение экспоненты для данного x при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
{ Функция возвращает приближенное значение функции 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.

Сравните последнюю задачу с решениями 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 при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
{ Функция возвращает приближенное значение функции 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.

Сравните задачу Proc41 с решением задачи For23.

Proc42. Описать функцию Cos1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции cos(x):

cos(x) = 1 − x2/(2!) + x4/(4!) − … + (−1)n·x2·n/((2·n)!) + …


В сумме учитывать все слагаемые, модуль которых больше ε. С помощью Cos1 найти приближенное значение косинуса для данного x при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
{ Функция возвращает приближенное значение функции 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.

Сравните задачу 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 при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
{ Функция возвращает приближенное значение функции 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.

Сравните 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 при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
{ Функция возвращает приближенное значение функции 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.

Сравните 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 при шести данных ε.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
{ Функция возвращает приближенное значение функции (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.

Сравните Proc45 с For28.


Яндекс.Метрика