Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 56. Быстросходящиеся числовые последовательности.


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

Объявление. Серьезная организация возьмет на высокооплачиваемую должность опытного программиста. Резюме просим разместить на главной странице нашего официального сайта.

БЫСТРОСХОДЯЩИЙСЯ РЯД

На предыдущем занятии мы с вами рассмотрели числовую последовательность с плохой сходимостью. Это значит, что её члены медленно убывают по абсолютной величине, “благодаря” чему приходится прекращать процесс суммирования, задавая точность требуемого результата. Например, для знакочередующихся числовых последовательностей точность суммирования определяется достижением члена, модуль которого не превышает некоторого заданного малого числа e. При этом, как правило, для получения каждой очередной правильной цифры результата требуется на порядок увеличивать задаваемую точность результата. За счёт этого, также на порядок, увеличивается число слагаемых, что, естественно, плохо сказывается на быстродействии программы.

Тем не менее, возникает вопрос, а нельзя ли обеспечить максимально возможную точность результата суммирования, указав точность e = 0? К сожалению, вычислить таким образом число π с помощью рассмотренной ранее подпрограммы практически невозможно. Слишком долго. Уж такова соответствующая числовая последовательность, и ничего с этим не поделаешь… Попробуйте поэкспериментировать сами. Может быть, у вас хватит на это терпения.  

Тогда возникает второй вопрос, а существуют ли числовые последовательности, сумму которых можно находить, задавая точность e = 0? Ответ на этот вопрос положительный, в чём убеждает решение рассматриваемой ниже задачи.

Задача C.2.3. “Быстросходящися ряд”. Числовая последовательность задана рекуррентной формулой общего члена Ai = Ai–1  / ( 2i  1 ), A1 = sin x, i = 2,3,..., где x – заданное число. Построить подпрограмму вычисления суммы членов этой последовательности с наибольшей возможной точностью. Определить также, сколько слагаемых для этого потребовалось.

   Procedure Quick_Convergence(x:Real; Var S:Real; Var N:LongInt);
      Var A: Real; i: LongInt;
   Begin
      S := 0; i := 1; A := Sin(x);
      While A <> 0 Do
         Begin S := S + A; i := i + 1; A := A / (2*i–1) End;
      N := i – 1

   End;

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

В подпрограмме C.2.3 (процедура Quick_Convergence) условием окончания цикла суммирования является равенство нулю очередного члена последовательности. Очевидно, что более точно вычислить сумму просто невозможно.

Тестирование подпрограммы при x=1 показало, что при использовании типа Real получение суммы с такой точностью требует 28 слагаемых, а при использовании типа Extended – 1610 слагаемых. Кроме того, контроль членов последовательности в режиме отладки действительно показывает достижение нулевых значений.

Оговоримся, что теоретически это невозможно. Математически единственный вариант равенства нулю члена нашей последовательности – это равенство нулю предыдущего члена этой же последовательности. Чтобы понять это, достаточно взглянуть на формулу общего члена. Это может происходит только тогда, когда задано значение x, для которого sinx = 0.

Но, что же тогда делать с практикой? Объяснение этого явления достаточно простое. Теоретические представления основываются на том, что вещественные числа могут быть сколь угодно малыми. Реально же память любой ЭВМ способна хранить вещественные числа только ограниченной разрядности, которые имеют предел “малости”. К чему это приводит, рассмотрим на примере.

Предположим, что в памяти некоторой гипотетической ЭВМ могут храниться вещественные числа, для записи отрицательного порядка которых отводится не более двух десятичных разрядов. Таким образом, абсолютная величина наименьшего возможного числа, которое может быть представлено в памяти такой ЭВМ, равна M10–99, где M – абсолютная величина наименьшей возможной мантиссы. Разделим это число на 10. Теоретически это возможно, и результат равен M10–100. Однако, практически, поскольку для представления отрицательного числа 100 в памяти не хватает десятичных разрядов, происходит то, что называется “потерей порядка”. При этом такое число автоматически трансформируется в нуль на аппаратном уровне.

Именно потеря порядка происходит при вычислении суммы последовательности убывающих слагаемых подпрограммой C.2.3. При этом, поскольку значения слагаемых убывают быстро, то и слагаемых для этого нужно не очень много. И, наконец, при использовании типа Extended слагаемых получается больше, чем при использовании типа Real, так как наименьшее возможное число в типе Extended меньше наименьшего возможного числа в типе Real.

В данной задаче свойство потери порядка позволяет получить наибольшую возможную точность вычисления для ЭВМ данной разрядности. Этим свойством целесообразно пользоваться в тех случаях, когда процесс вычислений не слишком затягивается за счёт чрезмерного числа слагаемых.

На следующем занятии, уважаемые подписчики, мы продолжим изучение процессов суммирования членов убывающих числовых последовательностей.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.

 


В избранное