Паскаль. Основы программирования


Числовые последовательности


Начнем с определения последовательности. Определений числовой последовательности дается много, причем самых разных и достаточно понятных, но, по моим соображениям, самое лучшее с точки зрения и математической строгости и доступности дается в книге: "Курс дифференциального и интегрального исчисления", т. 1 Г.М. Фихтенгольца. Я привожу его с незначительными изменениями.

Представим себе натуральный ряд:

1, 2, 3, ..., n, ..., n', ...,

в котором числа расположены в порядке возрастания, так что большее число n' следует за меньшим числом n (или меньшее n предшествует большему числу n'). Если теперь заменить в этом ряде, по какому-нибудь закону каждое натуральное число n некоторым вещественным числом xn , то получится числовая последовательность:

x1, x2, x3, ..., xn, ..., xn', ...,

члены или элементы которой xn занумерованы всеми натуральными числами и расположены в порядке возрастания номеров. При n'>n, член xn' следует за членом xn (xn предшествует  xn' ), независимо от того, будет ли само число xn' больше, меньше или даже равно числу xn.

В школьном курсе математики вы уже знакомились с последовательностями вида

Числовые последовательности
 - арифметическая прогрессия;

или вида

Числовые последовательности
 - геометрическая прогрессия.

В связи с определением длины окружности обычно рассматривается переменный периметр правильного вписанного в окружность многоугольника, получаемого из шестиугольника последовательным удвоением числа сторон; таким образом, получается следующая последовательность:

Числовые последовательности

Упомянем еще о десятичном приближении (скажем, по недостатку) к

Числовые последовательности
, со всё возрастающей точностью; оно принимает последовательность значений:

Числовые последовательности

Иногда последовательность задается тем, что указывается непосредственно

выражение для xn; так, в случае арифметической или геометрической прогрессии имеем, соответственно,

Числовые последовательности
 или
Числовые последовательности
 Пользуясь этим выражением, можно сразу вычислять любое значение элемента последовательности по заданному его номеру, не вычисляя предыдущих значений.

В других случаях нам может быть неизвестно выражение для общего члена xn последовательности.


Тем не менее, последовательность считается заданной, если мы владеем правилом, по которому может быть вычислен любой ее член, лишь только известен его номер.
Поэтому-то, зная правило для приближенного вычисления корней, мы можем считать заданной всю последовательность десятичных приближений к
Числовые последовательности
, хотя выражения для его общего члена мы не знаем. Можно сказать, что в этом случае последовательность задается "словесным описанием".
Если последовательность - в указанном смысле - задана, то этим не только охарактеризовано все множество принимаемых ею значений в целом, но и определен порядок, в котором эти значения принимаются; каждому номеру отвечает свое значение элемента последовательности, и из двух значений то считается следующим, номер которого больше.
Еще подчеркнем, что значения элементов последовательности не должны быть обязательно различными. Например, если задать последовательность одной из формул:
Числовые последовательности

то соответствующие последовательности будут:
Числовые последовательности

В первом
случае мы имеем просто постоянную величину, всё "множество" принимаемых ею значений сводится к одному.
Во втором
- это множество состоит из двух значений, 1 или -1, принимаемых поочередно. Наконец, в третьем случае множество значений бесконечно, но это не мешает значениям элементов через одно равняться 0; и мы считаем, что значение 0 на пятом месте следует не только за 1 на втором месте, но и за значением 0 на первом месте.
Еще один способ задания последовательности - это рекуррентная формула. Вспомним, что это такое.
Формулу, выражающую любой член последовательности, начиная с некоторого, через предыдущие (один или несколько), называют рекуррентной
(от латинского слова recurro - возвращаться).
Подводя итог вышеизложенного можно назвать три основных способа задания последовательности.
1. Аналитический
- последовательность задается формулой общего (или n-го) члена.
2. Рекуррентный
- любой член последовательности, начиная с некоторого, выражается через предшествующие члены. При этом способе задания последовательности указывают ее первый член или несколько начальных членов и формулу, позволяющую определить любой член последовательности по известным предшествующим членам.


3. Словесный
- задание последовательности описанием.
Надо сразу заметить, что для составления программ чаще нам придется использовать рекуррентное соотношение. Покажем это на примере.
Пример 1. Составить программу вывода на экран членов последовательности, заданной следующей формулой: 
Числовые последовательности

Для составления программы необходимо перейти от формулы n-го члена, которым задана последовательность к рекуррентному соотношению, связывающему предыдущий член с последующим и указать начальное значение для первого или "нулевого" элемента. Как это сделать?  Оказывается очень просто!
1. Запишем, чему будет равен член последовательности предыдущий к n - му, т. е. n-1 - й элемент последовательности: 
Числовые последовательности

2. Теперь разделим n - й элемент на n-1 - й, получим:
Числовые последовательности

3. Отсюда выразим, чему будет равен n-й член:
Числовые последовательности
 
4. Найдем начальное значение
Числовые последовательности
 
Числовые последовательности

Процедуру можно построить из одного цикла с параметром, в котором каждый раз при выполнении цикла предыдущее значение будет умножаться на 10 и делится на значение переменной цикла, которая обозначена  n.
     Procedure Create_succession(k : integer);
           var
               n : integer;
               a : real;
           begin
               a := 1;
               writeln('Искомая последовательность');
               for n := 1 to k do
                  begin
                     a := a*10/n;
                     write(a:6:6, ' ')
                  end;
               writeln
           end;
Программа
Program Problem1; {Вывод членов последовательности}
     uses WinCrt;
     var
         k : integer;
{---------------------------------------------------------------------------------------}
     Procedure Create_succession(k : integer);
           var
               n : integer;
               a : real;
           begin
               a := 1;
               writeln('Искомая последовательность');
               for n := 1 to k do
                  begin
                     a := a*10/n;
                     write(a:6:6, ' ')


                  end;
               writeln
           end;
{---------------------------------------------------------------------------------------}
     begin
        write('Введите число элементов '); readln(k);
        Create_succession(k);
     end.
Пример 2. Составим программу вывода на экран членов последовательности, описываемой словесно, в частности, десятичных приближений числа
Числовые последовательности
 с недостатком.
Вот здесь дело обстоит сложнее. Закон, по которому строится последовательность указан словесно. Надо от словесного задания правила перейти к рекуррентной формуле.
А есть ли формула для вычисления квадратных корней? Оказывается есть и достаточно простая.
Рассмотрим бесконечную последовательность x1, x2, x3, ..., образованную по следующему закону:
Числовые последовательности

Оказывается, что члены этой последовательности с увеличением номера i всё меньше и меньше отличается от
Числовые последовательности
(этот факт был известен Герону Александрийскому в 1 веке н. э.). Пусть, например, u = 2. Вычисление первых членов последовательности x1, x2, x3, ... дает нам
Числовые последовательности

Числовые последовательности

Числовые последовательности

Числовые последовательности

Напомним, что
Числовые последовательности
= 1.4142135...
Мы можем, используя данное рекуррентное соотношение, составить процедуру и программу
вычисления квадратных корней для любого действительного подкоренного выражения, а не только 2.
Program Problem2;
      uses WinCrt;
      var
         n :  integer;
         u : real;
{----------------------------------------------------------------------------------------}
      Procedure Square_root(n : integer; u : real);
            var
                i : integer;
                x : real;
            begin  
                writeln('Десятичные приближ. с недост. кв. корня из ', u);
                x := (u + 1)/2;
                for i := 1 to n do
                   begin
                       x := (1/2)*(x + u/x);
                       write(x:3:i, ' ')
                   end;
                writeln
            end;
{---------------------------------------------------------------------------------------}


      begin
         write('Введите подкоренное выражение '); readln(u);
         write('Введите число членов последовательн. '); readln(n);
         Square_root(n, u);
      end.
Вычислим приближенное значение квадратного корня из заданного числа с указанной точностью eps. Теперь нам не надо выводить на экран все члены последовательности, а выдать только одно значение удовлетворяющее указанной точности.
Например, поставлена задача получить квадратный корень из 2 с точностью до 0.01. На экран должно быть выдано значение этого корня (причем совсем не обязательно, чтобы в его записи было два знака после запятой, их может быть больше, но мы будем заведомо знать, что знаки после сотых долей не являются точными).
Такие программы
можно составить двумя способами.
Способ первый состоит в том, что цикл будет продолжаться до тех пор, пока разность между квадратом получаемого результата и подкоренным выражением по абсолютной величине не станет меньше или равна указанной точности eps. Тогда цикл заканчивается и выдается результат.
1-й способ
 
Program
Problem2a;
     uses WinCrt;
     var
        u        :  longint;
        x, eps :  real;
{----------------------------------------------------------------------------------------}
     Procedure Square_root1(eps, u : real; var x : real);
            begin
                 x := (u + 1)/2;
                 repeat
                    x := (1/2)*(x + u/x)
                 until abs(x*x - u) <= eps
            end;
{---------------------------------------------------------------------------------------}
     begin
        write('Введите подкоренное выражение '); readln(u);
        write('Задайте точность вычисления '); readln(eps);
        Square_root1(eps, u, x);
        writeln('Квадратный корень из ', u, ' равен ', x:12:12);
        writeln(' с точностью до ', eps:3:12)
      end.
Во втором способе вычисляются два члена последовательности и их разность по абсолютной величине сравнивается с заданной точностью.


Как только эта разность станет равна или меньше указанной точности eps цикл заканчивается.
2-й способ
Program Problem2b;
     uses WinCrt;
     var
        u         :  longint;
        x,  eps :  real;
{----------------------------------------------------------------------------------------}
     Procedure Square_root2(eps, u : real; var x : real);
           var
               x1, x2 : real;
           begin
               x1 := 1;
               repeat
                  x1 := (1/2)*(x1 + u/x1);
                  x2 := (1/2)*(x1 + u/x1)
               until abs(x2 - x1) <= eps;
               x := x2
           end;
{---------------------------------------------------------------------------------------}
     begin
        write('Введите подкоренное выражение '); readln(u);
        write('Задайте точность вычисления '); readln(eps);
        Square_root2(eps, u , x );
        writeln('Квадратный корень из ', u, ' равен ', x:12:12);
        writeln('с точностью до ', eps:3:12)
     end.
Разберите содержание этих программ и выполните их на компьютере. В чем отличие этих двух способов? Какой из них вы считаете более рациональным и почему?
Измените каждую из этих программ так, чтобы на экран выдавались последовательно десятичные приближения корней с недостатком? С избытком?
Если вы внимательно разобрались в составлении и работе предыдущих программ, то могли заметить, что в программе примера 2, несмотря на то, что математически последовательность задана формулой n-го члена, используется рекуррентное соотношение. Указывается начальное значение a := 1, а затем каждый цикл предыдущее значение умножается на постоянный множитель: 
Числовые последовательности
 
Таким образом, при составлении программ чаще всего будет использоваться рекуррентное соотношение. Возникает закономерный вопрос. Как перейти от задания последовательности формулой n-го члена к рекуррентному соотношению?
Разберем этот процесс на частном примере.
Пример..
Пусть задана последовательность с помощью формулы n-го члена, например:
Числовые последовательности
 Находим с ее помощью (n - 1)-й член:


Числовые последовательности

Разделим  n-й  член  на (n-1)-й, получим:
Числовые последовательности

Отсюда легко получить рекуррентную формулу:
Числовые последовательности

Одной формулы недостаточно, еще необходимо задать некоторые начальные значения, первые члены последовательности, желательно нулевой член.  
Получаем:
Числовые последовательности
 и
Числовые последовательности

 Итак, если последовательность задана формулой n-го члена,  тогда, чтобы задать ее рекуррентной формулой, необходимо  найти частное от деления n-го члена на (n - 1)-й, а затем  умножить (n - 1)-й член на частное. Это произведение будет  равно n-му члену и мы получаем нужную формулу. К ней необходимо добавить значение некоторых первых членов и, таким образом, последовательность будет задана. Коротко этот процесс можно записать так:
Числовые последовательности

После выполнения программы вы, конечно, обратили внимание на то, что независимо от того какую точность вы указываете значение результата будут выдаваться с 12-ю знаками после запятой (такой формат задан в программе). И нам трудно определить сколько десятичных знаков являются верными.
Было бы очень удобно, указав точность, получать в результате только требуемое количество десятичных знаков, например, указав 0.001, мы получали бы в результате 3 знака после запятой и не более.
Это можно сделать с помощью следующей функции:
{ Функция вычисления порядка - кол-во знаков после запятой }
   Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
                eps := eps*10;
                 k := k + 1
            until eps > 1;
            t := k
         end;
Ее работа проста. Введенное значение точности (eps) последовательно умножается на 10 до тех пор, пока ее значение не станет больше 1.
Например, для значения eps = 0.001 процесс определения порядка будет проходить так:
Числовые последовательности
 
Переменная k подсчитывает число выполняемых циклов. Но число циклов будет на 1 больше, чем количество знаков после запятой. Почему? Да потому, что цикл выполняется до тех пор пока, пока значение eps станет больше 1. Это сделано из тех соображений, что значение eps никогда не станет точно равно 1, ибо для этой переменной установлен вещественный тип real, а это значит, что eps не будет равно целому числу, хотя в примере кажется, что
Числовые последовательности
 но это не так.


Фактическое значение в этом случае может выражаться числом 0.99999999... . Чтобы устранить неудобства, первоначальному значению k задано значение -1, а останов цикла выполняется после eps > 1.
Добавляя эту функцию в программу, легко использовать ее для вывода результата с требуемым числом десятичных знаков.
Тогда, две вышеприведенные программы могут быть построены так:
Program Problem2a;
     uses WinCrt;
     var
        u        :  longint;
        x, eps :  real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
   Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
                eps := eps*10;
                 k := k + 1
            until eps > 1;
            t := k
         end;
{---------------------------------------------------------------------------------------}
     Procedure Square_root(eps, u : real; var x : real);
           begin
               x := (u + 1)/2;
               repeat
                   x := (1/2)*(x + u/x)
               until abs(x*x - u) <= eps
           end;
{---------------------------------------------------------------------------------------}
     begin
        write('Введите подкоренное выражение '); readln(u);
        write('Задайте точность вычисления '); readln(eps);
        Square_root(eps, u, x);
        writeln('Квадратный корень из ', u, ' равен ', x:6:t(eps));
        writeln('С точностью до ', eps:1:t(eps))
      end.
Program Problem2b;
     uses WinCrt;
     var
        u         :  longint;
        x,  eps :  real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
   Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;


            repeat
                eps := eps*10;
                 k := k + 1
            until eps > 1;
            t := k
         end;
{---------------------------------------------------------------------------------------}
     Procedure Square_root(eps, u : real; var x : real);
           var
               x1, x2 : real;
           begin
               x1 := 1;
               repeat
                   x1 := (1/2)*(x1 + u/x1);
                   x2 := (1/2)*(x1 + u/x1)
               until abs(x2 - x1) <= eps;
               x := x2
           end;
{----------------------------------------------------------------------------------------}
{ Основная программа }
     begin
        write('Введите подкоренное выражение '); readln(u);
        write('Задайте точность вычисления '); readln(eps);
        Square_root(eps, u, x);
        writeln('Квадратный корень из ', u, ' равен ', x:6:t(eps));
        writeln('С точностью до ', eps:1:t(eps))
     end.
Задание 1
1. Составьте программы вывода на экран членов последовательности, задаваемых следующими способами:
1)
Числовые последовательности
 
3) последовательность состоит из десятичных приближений с избытком частного
Числовые последовательности
 
Пример 3. Рассмотрим бесконечную последовательность x1, x2,..., образованную по следующему закону:
Числовые последовательности
,
Числовые последовательности
 
где u - данное неотрицательное действительное число, n - натуральное число.
Эта последовательность позволяет получить сколь  угодно точные приближения числа
Числовые последовательности
. По аналогии с программой для
Числовые последовательности
  составить программу для приближённого вычисления
Числовые последовательности
 и проверьте ее для  а)
Числовые последовательности
,  б) 
Числовые последовательности
.
{ Вычисление корня с любым натур. показат. действит. числа }
Program Problem3;
   uses WinCrt;
   var
      u, n, eps, x : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
   Function t(eps : real) : integer;
      var
        k : integer;
      begin
        k := -1;
        repeat
          eps := eps*10;


          k := k + 1
        until eps > 1;
        t := k
      end;
{----------------------------------------------------------------------------------------}
    Procedure Root(u, n, eps : real; var
x : real);
         var
            x1, x2, xn : real;
            i               : integer;
         begin
             x1 := (u + n - 1)/2;
             repeat
                xn := 1;
                for i := 1 to trunc(n) - 1 do
xn := xn*x1;
                x1 := ((n - 1)*x1 + u/xn)/n;
                x2 := ((n - 1)*x1 + u/xn)/n
             until abs(x1 - x2) <= eps;
             x := x2
         end;
{--------------------------------------------------------------------------------------}
   begin
     write('Введите подкоренное выражение '); readln(u);
     write('Введите показатель корня '); readln(n);
     write('Введите точность вычисления '); readln(eps);
     Root(u, n, eps, x);
     writeln('Значение корня равно ', x:8:t(eps));
     writeln('С точностью до ', eps:1:t(eps))
   end.
Рассмотрим несколько последовательностей, заданных формулами n-го члена:
Числовые последовательности

3)
Числовые последовательности
 все три последовательности имеют место при любом значении x;
4)
Числовые последовательности
 , где m - вещественное число, отличное от 0 и от всех натуральных чисел при 
Числовые последовательности
 
5)
Числовые последовательности
 при |x| < 1 и x = 1;  6)
Числовые последовательности
 при  |x|
Числовые последовательности
 1.
Нам еще придется на следующем занятии иметь дело с этими последовательностями, но уже при постановке несколько иной задаче. А теперь составим программы вычисления членов последовательности, причем вычисления вести до того члена, который по абсолютной величине станет равным или меньше заданной точности. Выполним это задание для последовательностей 2-й и 4-й.
Пример 4.
Последовательность задана формулой
Числовые последовательности

Вывести на экран члены последовательности до члена, меньшего заданного положительного числа eps. Желательно принять 0 < eps < 1.
Самое важное - это перейти от формулы n-го члена к рекурретному соотношению, которое впоследствии надо использовать при составлении программы.


Запишем формулу n-1 -го члена:
Числовые последовательности
 
Разделим un
на un-1, получим:
Числовые последовательности
 
тогда
Числовые последовательности
 
Надо заметить, что первый член равен: u1 = x.
После этого нетрудно составить программу. Организуем цикл с предусловием "пока", пока |u| > eps. Почему для этой задачи удобно устроить именно такой цикл?
В нашем примере, в качестве начального значения берется первый элемент последовательности. Может случиться, что пользователь задал такое значение eps, что уже первый член меньше этого числа. И тогда вычислений выполнять не следует, т.е цикл не выполняется, а значит необходимо сразу проверить условие. Такое делается в цикле с предусловием. Цикл repeat ... until будет обязательно выполняться хотя бы один раз, а этого нам не нужно.
Программа
 
Program Problem4;
     uses
WinCrt;
     var
        x,  eps : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
     Function t(eps : real) : integer;
          var
             k : integer;
          begin
             k := -1;
             repeat
                eps := eps*10;
                k := k + 1
             until eps > 1;
             t := k
          end;
{----------------------------------------------------------------------------------------}
     Procedure
Create_succession(x, eps : real);
           var
              u : real;
              n : integer;
           begin
              u := x;
              n := 1;
              while abs(u) > eps do
                  begin
                     n := n + 1;
                     write(u:6:t(eps), '; ');
                     u := (-1)*u*x*x/((2*n - 2)*(2*n - 1))
                  end;
              writeln
           end;
{----------------------------------------------------------------------------------------}
     begin
        write('Введите значения |x| <= 1 '); readln(x);
        write('Задайте положит. число eps '); readln(eps);


        writeln('Члены последовательности');
        Create_succession(x, eps);
     end.
 
Пример 5. Последовательность задана формулой:
Числовые последовательности

где m - вещественное число, отличное от 0 и от всех натуральных чисел, при
Числовые последовательности
 
Вывести на экран члены последовательности до члена, меньшего наперед заданного положительного числа eps, 0 < eps < 1.
Из формулы n-го члена составьте рекуррентную формулу, установите каким должно быть первоначальное значение, составьте программу и сравните ее с приведенной ниже программой.
Program Problem5;
     uses WinCrt;
     var
         x,  m, eps : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
     Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
               eps := eps*10;
               k := k + 1
            until eps > 1;
            t := k
         end;
{----------------------------------------------------------------------------------------}
      Procedure
Create_succession(x, m, eps : real);
           var
               n : integer;
               u : real;
           begin
               u := 1;
               n := 1;
               repeat
                  u := u*(m - n + 1)*x/n;
                  write(u:3:t(eps), '  ');
                  n := n + 1
               until abs(u) <= eps;
               writeln
           end;
{----------------------------------------------------------------------------------------}
{ Основная программа }
     begin
        write('Введите значения x, |x| < 1 '); readln(x);
        writeln('Введите вещественное положительное m, отличное от');
        write('натуральных чисел '); readln(m);
        write('Задайте положительное число eps '); readln(eps);
        writeln('Члены последовательности');
        Create_succession(x, m, eps)
     end.


Задание 2
Составьте программы вывода на экран членов последовательности до члена, меньшего заданного положительного числа eps,  0 < eps < 1. Возьмите для задания примеры 1, 3, 6:
1) 
Числовые последовательности
 где x - любое действительное число,
3)
Числовые последовательности
 где x - любое действительное число,
6)
Числовые последовательности
Числовые последовательности
 при
Числовые последовательности
 
Усложним задачи и разберем следующий пример.
Пример 6. Дано положительное число eps. Последовательность a1, a2, a3,... образована по следующему закону: 
Числовые последовательности

Найти первый член an последовательности, для которого выполнено условие:
Числовые последовательности

Составить программу выполнения этого задания.
Алгритм
1. Содержание.
а) Переменные и их типы. Переменная i принимает целые значения:
Числовые последовательности
 Переменные ap, an и eps принимают вещественные значения.
2. Основная часть.
а) Ввод значения eps.
б) Установить первоначальные значения переменных i, ap и an:
i := 1, ap := 1, an := 1 - 1/2.
в) Цикл "пока" с условием: abs(an - ap) >= eps.
Команды в цикле. Значения i каждый раз в цикле должны увеличиваться на единицу; значения ap := 1 - 1/i; значения an := ap*(1 - 1/(i + 1)).
г) После завершения работы цикла, вывод значения an на экран. Можно вывести и номер i этого члена последовательности.
3. Конец.
Составим процедуру и программу, используя алгоритм.
Программа
Program Problem6;
     uses
WinCrt;
     var
        i         : integer;
        a, eps : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
     Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
               eps := eps*10;
               k := k + 1
            until
eps > 1;
            t := k
         end;
{----------------------------------------------------------------------------------------}
     Procedure
Create_succession(eps : real; var i : integer; var a : real);
           var
               i : integer;
               an, ap : real;


           begin
               i := 1; ap := 1; an := 1 - 1/2;
               while abs(an - ap) >= eps do
                   begin
                       i := i + 1;
                       ap := ap*(1 - 1/i);
                       an := ap*(1 - 1/(i + 1))
                   end;
                   a := an
           end;
{---------------------------------------------------------------------------------------}
{ Основная программа }
     begin
        write(' Введите любое положительное число eps '); readln(eps);
        Create_succession(eps, i, a);
        writeln('Искомый член последовательности ', a:6:t(eps));
        writeln('Находится на ', i, '-ом месте в последовательности')
     end.
 
Задание 3
Последовательность задана формулой:
Числовые последовательности
 Составьте программу, показывающую, что для любого положительного числа eps, найдется член последовательности yN, для которого будет выполняться неравенство
Числовые последовательности
 
Если Вы составили программу и выполнили ее несколько раз, то смогли убедиться в том, что для любого положительного числа eps найдется член последовательности yN, такой, что модуль разности (yN- 2) меньше eps.
Дополним программу так, чтобы она показывала, что неравенство
Числовые последовательности
 выполняется для членов этой последовательности с номерами
Числовые последовательности
 
Но перед этим, вспомним определение предела последовательности.
Определение предела последовательности
Число A называется пределом последовательности xn, если для любого положительного числа
Числовые последовательности
 найдется такой номер последовательности N, что для всех номеров n > N, будет выполняться неравенство
Числовые последовательности

Последнее неравенство равносильно следующему:
Числовые последовательности

Числовые последовательности
Если изобразить числа A,
Числовые последовательности
 и значения последовательности xn на числовой оси, то получится наглядное геометрическое истолкование предела последовательности:
Рис. 42
Какой бы малый отрезок (длиной
Числовые последовательности
) с центром в точке A (см. рис. 42) ни взять, все точки xn, начиная с некоторой из них, должны попасть внутрь этого отрезка (так что вне его может остаться разве лишь конечное число точек).


Точка, изображающая предел A, является как бы средоточением сгустка точек, изображающих значения членов последовательности.
Возвращаясь к примеру 5, можно сказать, что по сути дела мы показывали, что число 2 является пределом последовательности
Числовые последовательности
 
Если эту программу немного изменить, то она станет такой.
Пример 7. Программа, показывающая, что пределом последовательности
Числовые последовательности
 является число 2.
Program Problem7;
     uses
WinCrt;
     var
         i, n, k         :  longint;
         eps, yn, yp : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
     Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
               eps := eps*10;
               k := k + 1
            until
eps > 1;
            t := k
         end;
{----------------------------------------------------------------------------------------}
{ Основная программа }
     begin
        writeln('Введите произвольное положительное число, ');
        write('можно даже очень малое '); readln(eps);
         i := 1; k := -1; yn := 1;
          while
abs(yn - 2) >= eps do
              begin
                  i := i + 1; k := k*(-1);
                  yn := 2 + k/i
              end;
         writeln('Условию abs(yn-2)<', eps:1:t(eps), ' удовлетворяет');
         writeln('член последовательности yn = ', yn:6:t(eps), ',');
         writeln('находящийся под номером ', i);  writeln;
         write('Введите номер члена последовательности больше ',i,' ');
         readln(n);
          if
n mod 2 = 0 then yn := 2 + 1/n else yn := 2 - 1/n;
          if
abs(2 - yn) < eps
             then 
                begin
                   write('Неравенство abs(2 - ', yn:6:t(eps), ') < ', eps:1:t(eps));
                   writeln( ' выполняется ')
                end
             else
                begin


                   write('Неравенство abs(2 - ', yn:6:t(eps), ') < ', eps:1:t(eps));
                   writeln(' не выполняется')
                end
     end.
Задание 4
Составьте программу, показывающую, что число 1 является пределом последовательности
Числовые последовательности
 
Продолжим составление программ на последовательности и немного усложним задачу. Если в двух предыдущих примерах заведомо было известно число, которое является пределом последовательности, то в следующем примере надо будет определить существует ли вообще предел и если существует, тогда найти его и показать, что оно действительно является пределом заданной последовательности.
Таким образом, задача имеет две части:
1) установить существование
предела и,
2) если таковой существует, то показать чему он равен.
Перед выполнением такого задания обратимся к курсу математического анализа, в котором есть теорема, которая принадлежит чешскому математику Больцано и французскому математику Коши, ее часто называют принципом сходимости. Она выражает общий
Признак существования конечного предела последовательности
Пусть задана последовательность xn, пробегающая значения x1, x2, ..., xn, ..., xm, ... Для того, чтобы последовательность xn имела конечный предел, необходимо и достаточно, чтобы для каждого числа 
Числовые последовательности
 существовал такой номер N, чтобы неравенство 
Числовые последовательности
 выполнялось, лишь только
Числовые последовательности
 и
Числовые последовательности
. Как видите, суть дела здесь в том, чтобы значения переменной xn и xm
между собой безгранично сближались по мере возрастания их номеров.
Этот признак допускает простую геометрическую иллюстрацию (рисунок 43).
Числовые последовательности

Рис. 43
Пример 8. Выяснить имеет ли предел последовательность, заданная формулой:
Числовые последовательности
 Если имеет, то найти его.
Алгоритм решения основывается на признаке существования предела последовательности. Нам необходимо установить, что члены последовательности по мере увеличения номера сближаются друг с другом. Перекладывая это на язык математики, нам надо задать положительное число eps, которое может быть сколь угодно малым и найти такие два члена последовательности, разность между которыми по абсолютной величине будет меньше этого наперед заданного, может быть даже, очень малого числа eps.


Идея становится понятной. Остается продумать, как находить члены последовательности в зависимости от их номеров?
Конечно, можно составить рекуррентное соотношение, но это будет немного трудным делом чисто в математическом отношении.
Возникает другая мысль. Составить подпрограмму возведения в степень и из основной программы каждый раз обращаться к ней для вычисления степени с изменением номера n. Тем более, что опыт составления подпрограмм у нас уже есть. Мы достаточно много составляли на прошедших занятиях подпрограмм в форме процедур и функций.
Основная программа. Вначале попросим пользователя задать точность вычисления (так мы назвали число eps).
Затем задается начальное значение переменной n (n := 1). Организуется цикл с последующим условием (repeat ... until...), в котором переменной x - члену последовательности присваивается значение, вычисляющее значение функции
Числовые последовательности
 для данного значения n. Далее значение n увеличивается на 1
Числовые последовательности
и вычисляется следующий член последовательности x1, который также будет равен значению функции
Числовые последовательности
, - помните, что значение n уже увеличилось на 1.
Проверяется условие abs(x1 - x) < eps. Как только условие выполнится, цикл закончится и в качестве значения предела последовательности мы можем брать любое из значений x или x1 и оно укажет нам значение предела последовательности с заданной точностью eps.
Если кто-нибудь из вас раньше встречался с такой последовательностью, то он сразу был уверен, что ее предел существует и равен числу e - основанию натурального логарифма.
Проверьте это, выполнив программу
 
Program
Problem8;
     uses WinCrt;
     var
        n  : integer;  x, x1, eps : real;
{----------------------------------------------------------------------------------------}
{ Функция вычисления порядка - кол-во знаков после запятой }
     Function t(eps : real) : integer;
         var
            k : integer;
         begin
            k := -1;
            repeat
               eps := eps*10;
               k := k + 1


            until eps > 1;
            t := k
         end;
{----------------------------------------------------------------------------------------}
     Function s(k: integer; p : real) : real;
          var
             i : integer; z : real;
          begin
             z := 1;
             for i := 1 to k do z := z*p;
             s := z
         end;
{----------------------------------------------------------------------------------------}
     begin
        write('Задайте точность '); readln(eps);
        n := 1;
        repeat
           x := s(n, (1 + 1/n));
           n := n + 1;
           x1 := s(n, (1 + 1/n))
        until abs(x1 - x) < eps;
        writeln('Предел последовательности равен ', x1:6:t(eps));
        writeln('С точностью до ', eps:1:t(eps))
     end.
Задание 5
Последовательность un принимает значения
Числовые последовательности

Показать, что un
стремится к некоторому пределу при
Числовые последовательности
.
(При составлении программы использовать в качестве подпрограммы функцию вычисления степени числа 3 с показателем n).

Содержание раздела