Министерство образования РФ Департамент образования г. Заречного Пензенской области «Средняя общеобразовательная школа №222 с углублённым изучением предметов художественно-эстетического профиля» Секция информатики Нахождение числа Пи. Образовательный проект Научный руководитель: учитель информатики высшей категории МОУ школа №222 Зайцев Андрей Михайлович г. Заречный, 2007 год Содержание 1. Проектное задание .................................................................................................................... 2 2. Введение .................................................................................................................................... 3 3. Вычисление трансцендентных чисел ....................................................................................... 4 4. Выбор формул для нахождения трансцендентных чисел ...................................................... 7 5. Структурная схема проекта программы ................................................................................... 9 6. Интерфейс программы ............................................................................................................ 10 7. Инструкция для пользователя ................................................................................................ 12 8. Итоговый вывод ....................................................................................................................... 13 9. Литература ............................................................................................................................... 14 Приложение. Исходный текст программы.................................................................................. 15 1 1. Проектное задание Разработать проект программы для нахождения трансцендентных чисел. Провести исторический анализ нахождения трансцендентных чисел. Сравнить методы определения трансцендентных чисел. Разработать программу для вычисления чисел с высокой точностью. Программа должна иметь удобный интерфейс, операционной системы Windows. 2 работать под управлением 2. Введение Что такое трансцендентное число? По определению трансцендентным называют число, которое не является корнем никакого алгебраического уравнения с рациональными коэффициентами. Квадратный корень из 2 – число иррациональное, но это — «алгебраическое иррациональное» число, потому что есть корень квадратного 2 уравнения x2 – 2 = 0. Существуют два трансцендентных числа и e. Числа и e не могут быть корнем ни одного алгебраического уравнения с рациональными коэффициентами, они получаются в результате некоторого предельного перехода. Дробная часть десятичной записи чисел и e, как и у всех иррациональных чисел, бесконечна и непериодична. В высшей математике число e играет важную роль и встречается буквально на каждом шагу. Например, величина роста банковских процентов. Величины такого типа изменяются подобно снежному кому, несущемуся с горы: чем больше становится ком, тем быстрее налипает на него снег. Этот тип роста свойственен многим процессам в живой и неживой природе. Все они описываются формулами, в которые входит функция y=ex. Эта функция настолько важна, что она в отличие от других показательных функций получила собственное особое название. Её называют экспоненциальной функцией или кратко экспонентой. Экспонента в точности совпадает со своей производной. Именно этим и объясняется причина столь частного появления экспоненты в формулах математического анализа. Отношение длины окружности к её диаметру, которое древние греки обозначили буквой («пи»), возникает во многих ситуациях, не имеющих никакого отношения к окружностям. Английский математик Август де Морган назвал как-то «...загадочным числом 3,14159..., которое лезет в дверь, в окно и через крышу». Приведём лишь один пример. Рассмотрим множество целых положительных чисел. Если из них случайным образом выбрать два числа, то какова вероятность того: что выбранные числа не будут иметь общего делителя? Ответ неожидан: искомая вероятность равна 6 / Тем не менее именно то обстоятельство, что связано с окружностью, сделало его наиболее известным представителем бесконечного класса трансцендентных чисел. 3 3. Вычисление трансцендентных чисел Древние вавилоняне удовлетворялись значением ~ 3. Египтяне считали, что ~ 3,16. Архимед предлагал на выбор: 223 / 71 < < 22 / 7 . Но ни одна дробь с целым числителем и знаменателем не может быть в точности равной . исключительно хорошее приближение числа , хотя существуют такие, которые дают Самая замечательная была найдена в V веке до нашей эры китайским астрономом Цзу Чунь - чжи: ~ 355 / 113 = 3,1415929..... На Западе её открыли лишь тысячу лет спустя. Получить её можно с помощью числового фокуса. Напишем по два раза первые три нечётных числа: 1, 1, 3, 3, 5, 5. Три последних числа сделаем числителем, а три первых знаменателем дроби. Трудно поверить (а между тем это чистая правда), что эта дробь позволяет вычислить с точностью до седьмого знака. Для более точного расчета данные дроби не подходят. Для этого используются бесконечные ряды или произведения, сходящиеся к . Одно из простейших выражений открыл Валлис: 2 2 4 4 6 6 8 2 1 3 3 5 5 7 7 (1) В числителях дробей по два раза повторяются последовательные чётные числа. (Отметим случайное сходство между первыми пятью знаменателями и цифрами в рациональном приближении, открытом китайским астрономом!) Несколько десятилетий спустя великий Лейбниц открыл другую изящную формулу: 1 1 1 1 1 4 1 3 5 7 9 Начиная с XVII века началось вычисление числа . Так было получено: в 1699 г. - 72 десятичных знака, в 1719 г. - 127 десятичных знаков, в 1841 г. - 208 десятичных знаков, в 1853 г. - 261 десятичный знак. 4 (2) На 20 лет (с 1853 по1873 г.) растянулось у Вильяма Шенкса вычисление 707 десятичных знаков числа . К сожалению, несчастный Шенкс ошибся в 520 знаке и все последующие цифры в полученном им выражении неверны. Как и число , e не может быть корнем какого-нибудь алгебраического уравнения с рациональными коэффициентами. Подобно тому, как с помощью циркуля и линейки невозможно построить отрезок прямой, длина которого в соответствующих единицах в точности равна , не существует и способа построения отрезка, длина которого выражалась бы числом e. Число e, так же как и число , можно записать только двумя способами: либо в виде бесконечной цепной дроби, либо как сумму бесконечного ряда. Вот, например, как записывается число e в виде цепной дроби: 1 e 2 1 1 2 2 3 (3) 3 4 4 ... Эту бесконечную дробь открыл в XVIII веке великий математик Леонард Эйлер. Он же первым ввёл символ e . (Которое стали называть «числом Эйлера».) Разложив по степеням n выражение (1 + 1/n)n , мы получим следующий ряд: e 1 1 1 1 1 ... 1! 2! 3! 4! (4) Благодаря быстрой сходимости ряда число любого десятичного знака (проще чем число ). 5 e несложно вычислить с точностью до В 1952 году сотрудники Иллинойсского университета вычислили 60000 знаков числа e, а в 1961 году на одной из машин IBM было получено уже 100265 десятичных знаков числа e. В 1949 году ЭВМ знаков числа ENIAC, проработав в течение 70 часов, вычислила более 2000 . Позднее с помощью другой вычислительной машины, проработавшей всего 13 минут, были вычислены 3000 знаков числа . В 1959 году одна вычислительная машина в Англии и другая во Франции вычислили 10000 десятичных знаков В 1961 году машина IBM 7090 вычислила ( за 100 минут ). с точностью до 100625 знаков. Машинное время составило 8 часов 43 минуты. В числе , так же как и в числе e, десятичные знаки нигде не обрываются, а найти закон, по которому они чередуются, пока никому не удалось. 6 4. Выбор формул для нахождения трансцендентных чисел Для вычисления числа e применяется формула (4) из-за быстрой сходимости ряда. Трудность возникает при вычислении числа . В настоящее время существует много формул. Мы привели две из них из-за исключительной простоты. Однако практически для вычисления они малопригодны, потому что процесс сходится слишком медленно. Действительно, чтобы подсчитать по формуле (2) с тремя знаками после запятой, нужно просуммировать 2000 слагаемых. Однако с помощью ряда для арктангенса можно получить другие более эффективные, хотя и менее простые формулы для . За основу был взят следующий числовой ряд по которому Вильям Шенкс вычислял число : 1 1 1 1 16 3 5 7 5 3 5 5 5 7 5 1 1 1 1 4 3 5 239 5 7 239 7 239 3 239 (5) Достоинство заключается в быстрой сходимости данного числового ряда. Проведём сравнительный анализ скорости схождения числовых рядов. В качестве примера приведём расчёт числа для первых четырёх членов каждого ряда. Ряд 1 2 2 4 4 2 2,8444444444 1 3 3 5 Ряд 2 1 1 1 1 4 2,8952380952 5 7 1 3 7 Ряд 3 1 1 1 1 16 3 5 7 35 55 7 5 5 1 1 1 1 4 3 5 2395 7 2397 239 3 239 3,1415917721 Результат вычислений приведён таблице 1. Таблица 1 Номер числового ряда Значение числа Погрешность расчёта, (%) 1 2,8444444444 9,4585212646893 2 2,8952380952 7,8417091441885 3 3,1415917721 0,0000280586886 По результатам вычислений можно сделать вывод, что самой подходящей формулой для вычисления числа , является ряд Шенкса. Его мы и берём за основу при составлении программы нахождения числа . 8 5. Структурная схема проекта программы Структурная схема проекта программы представлена на рис. 1. Нахождение числа Пи Модуль заставки Главный модуль Справочный модуль Zastavka.frm Rabota.frm About.frm Окно ввода Окно вывода Text 1 Text 2 Процедура нахождения числа Процедура очистки Процедура выхода Sub Clear Sub Exit Sub P Процедура проверки ввода Процедура печати результата Sub Proverka Sub Pechat Установка начальных значений Процедуры арифметических операций (Sub Delenie, Sub DelenieDouble, Sub Summa, Sub Raznost, Sub Proizv) Sub Nachalo Рис. 1. 9 Функция окончания расчёта Function Epsilon 6. Интерфейс программы Проект программы «Нахождение числа Пи» состоит из трёх форм: Zastavka.frm (рис.2), Rabota.frm (рис. 3) и About.frm (рис.4). Рис. 2. Окно Zastavka.frm. Рис. 3. Окно Rabota.frm 10 Рис. 4. Окно About.frm 11 7. Инструкция для пользователя 1. Запустить программу «Нахождение числа ПИ». 2. После просмотра заставки нажать клавишу Enter. 3. Для получения числа : ввести количество цифр в числе в цифровое окно «Введите количество знаков после запятой», в соответствии с диапазоном разряда; выбрать пункт меню Преобразование команду Число Пи; дождаться получения результата. 4. Для проведения новых операций выбрать пункт меню Преобразование команду Очистить. 5. При введении чисел не соответствующих диапазону появится предупреждающее сообщение. Необходимо повторить ввод чисел. По окончании работы выполнить команду выбрать пункт меню Преобразование команду Закрыть. 12 8. Итоговый вывод На примере данной работы можно увидеть, как быстродействие компьютера позволяет легко решать многие практические задачи, требующие больших объёмов вычислений. Вычисление нескольких тысяч знаков в настоящее время стало популярным средством проверки новых вычислительных машин. "Загадочное и чудесное , - пишет Филипп Девис, - стало чем-то вроде покашливания, которым вычислительным машинам прочищают горло". Данная программа также может применяться на уроках математики. 13 9. Литература 1. Кофман А.,Фор Р. Займёмся исследованием операций: Пер. с фр. / Под ред А.А.Корбута М.:Мир, 1966. 2. Тихонов А.Н., Костомаров Д.П. Рассказы о прикладной математике: М., Наука, 1979. 3. Гарднер М. Математические головоломки и развлечения: Пер. с англ. / Под ред. Я.А. Смородинского. М.: Мир, 1971. 14 Приложение. Исходный текст программы Текст программы для Rabota '----------------------------------------------------------------------'Главный модуль программы исследования трансцендентных чисел '----------------------------------------------------------------------'Процедура очистки окон Private Sub Clear_Click() Text1.Text = "" Text2.Text = "" End Sub '----------------------------------------------------------------------'Процедура выхода из программы Private Sub Exit_Click() End End Sub '----------------------------------------------------------------------'Процедура вызова информации о программе Private Sub Programs_Click() Zastavka.Show End Sub '----------------------------------------------------------------------'Процедура вызова справки Private Sub TellMe_Click() About.Show End Sub '----------------------------------------------------------------------'Процедура нахождения числа Пи Private Sub P_Click() 'проверка вводимого числа Call Proverka(PassWord, Text1) If PassWord = 1 Then 'определение количества знаков в числе Razmer = Val(Text1) 'объявление массивов коэффициентов в зависимости 15 'от точности рассчета ReDim Pi(Razmer), Chl(Razmer), Pi1(Razmer), Koeff(Razmer) 'начальные установки коэффициентов первого ряда Pi(0) = 4 Call Nachalo(1, Razmer, Pi()) Koeff(0) = 4 Call Nachalo(1, Razmer, Koeff()) Call Nachalo(0, Razmer, Chl()) 'расчет первого и второго коэффициента первого ряда Call Delenie(5, Razmer, Pi()) Call Delenie(5, Razmer, Koeff()) 'установка четности n-го члена последовательности первого ряда Chet = 0 Nomer = 1 'расчет величины первого ряда до тех пор, пока ' последовательность не будет оставаться неизменной Do Nomer = Nomer + 2 Call Delenie(25, Razmer, Koeff()) Call DelenieDouble(Nomer, Razmer, Koeff(), Chl()) If Chet = 0 Then Chet = 1 Call Raznost(Razmer, Pi(), Chl()) Else Chet = 0 Call Summa(Razmer, Pi(), Chl()) End If Loop While Epsilon(Razmer, Chl()) = 0 'произведение полученного числа на 4 Call Proizv(4, Razmer, Pi()) 'начальные установки коэффициентов второго ряда Pi1(0) = 4 Call Nachalo(1, Razmer, Pi1()) Koeff(0) = 4 Call Nachalo(1, Razmer, Koeff()) 16 Call Nachalo(0, Razmer, Chl()) 'расчет первого и второго коэффициента второго ряда Call Delenie(239, Razmer, Pi1()) Call Delenie(239, Razmer, Koeff()) 'установка четности n-го члена последовательности второго ряда Chet = 0 Nomer = 1 'расчет величины второго ряда до тех пор, пока ' последовательность не будет оставаться неизменной Do Nomer = Nomer + 2 Call Delenie(239, Razmer, Koeff()) Call Delenie(239, Razmer, Koeff()) Call DelenieDouble(Nomer, Razmer, Koeff(), Chl()) If Chet = 0 Then Chet = 1 Call Raznost(Razmer, Pi1(), Chl()) Else Chet = 0 Call Summa(Razmer, Pi1(), Chl()) End If Loop While Epsilon(Razmer, Chl()) = 0 'разность первого и второго ряда Call Raznost(Razmer, Pi(), Pi1()) 'печать полученного результата Call Pechat(Razmer, Pi()) Else Text1.Text = "" Text2.Text = "" End If End Sub '----------------------------------------------------------------------'Эта процедура устанавливает значение элементов массива равными нулю Private Sub Nachalo(Start, Finish, Massiv()) For i = Start To Finish 17 Massiv(i) = 0 Next i End Sub '----------------------------------------------------------------------'Эта процедура осуществляет деление последовательность на число Private Sub Delenie(Nomer, Finish, Massiv()) 'обнуляем остаток Memory = 0 For i = 0 To Finish 'складываем увеличенный в 10 раз остаток с 'членом последовательности Chl = Memory * 10 + Massiv(i) 'получаем значение члена последовательности Massiv(i) = Chl \ Nomer 'определяем остаток Memory = Chl Mod Nomer Next i End Sub '----------------------------------------------------------------------'Эта процедура осуществляет деление промежуточного коэффициента 'для получения n - ного члена последовательности Private Sub DelenieDouble(Nomer, Finish, Massiv(), MassivDouble()) 'обнуляем остаток Memory = 0 For i = 0 To Finish 'складываем увеличенный в 10 раз остаток с 'членом последовательности промежуточного коэффициента Chl = Memory * 10 + Massiv(i) 'получаем значение члена последовательности MassivDouble(i) = Chl \ Nomer 'определяем остаток Memory = Chl Mod Nomer Next i End Sub '----------------------------------------------------------------------18 'Эта процедура осуществляет умножение числа на 'имеющуюся последовательность Private Sub Proizv(Nomer, Finish, Massiv()) 'обнуляем остаток Memory = 0 For i = Finish To 0 Step -1 'умножаем значение члена последовательности на число 'с учетом остатка Proiz = Massiv(i) * Nomer + Memory 'получаем значение члена последовательности Massiv(i) = Proiz Mod 10 'определяем остаток Memory = Proiz \ 10 Next i End Sub '----------------------------------------------------------------------'Эта процедура осуществляет вычитание нового члена от 'имеющейся последовательности Private Sub Raznost(Finish, First(), Second()) 'обнуляем остаток Memory = 0 For i = Finish To 0 Step -1 'увеличиваем уменьшаемое на 10 Ymens = 10 + First(i) 'вычитаем значение члена второй последовательности 'с учетом остатка Razn = Ymens - Second(i) - Memory 'получаем значение члена уменьшаемого First(i) = Razn Mod 10 'определяем остаток Memory = Ymens \ 10 - Razn \ 10 Next i End Sub '----------------------------------------------------------------------'Эта процедура осуществляет сложение нового члена с 19 'имеющейся последовательностью Private Sub Summa(Finish, First(), Second()) 'обнуляем остаток Memory = 0 For i = Finish To 0 Step -1 'складываем значение члена второй последовательности 'с учетом остатка Sum = First(i) + Second(i) + Memory 'получаем значение члена первой последовательности First(i) = Sum Mod 10 'определяем остаток Memory = Sum \ 10 Next i End Sub '----------------------------------------------------------------------'Процедура позволяет вывести в поле вывода значение числа 'с заданной точностью Private Sub Pechat(Finish, Massiv()) 'обнуление строки Stroka = "" 'печать первого знака и запятой Stroka = Stroka + Right$(Str$(Massiv(0)), 1) Stroka = Stroka + "," 'добавление остальных знаков For i = 1 To Finish Stroka = Stroka + Right$(Str$(Massiv(i)), 1) Next i 'вывод на печать Text2.Text = Stroka End Sub '----------------------------------------------------------------------'Процедура проверки правильности значение числа Private Sub Proverka(Kod, Okno) 'проверка правильности ввода числа Kod = 1 20 i = 1 Do Chislo = Mid$(Okno, i, 1) 'запрет ввода букв в числе If Asc(Chislo) < 48 Or Asc(Chislo) > 57 Then MsgBox "Неправильный знак в числе!", 48, "Предупреждение" Kod = 0 Exit Do End If i = i + 1 Loop While i <= Len(Okno) 'ограничение числа If Val(Okno) > 1000000 Then MsgBox "Слишком большое число!", 48, "Предупреждение" Kod = 0 End If End Sub '----------------------------------------------------------------------'Эта функция определяет, останется ли сумма последовательности 'неизменной при прибавлении нового члена Function Epsilon(Finish, Massiv()) 'значение функции устанавливаем равной 0 Epsilon = 0 Nomer = 0 'просматриваем последовательность ряда и если все члены равны 0, то 'устанавливаем значение функции равной 1 Do While Massiv(Nomer) = 0 Nomer = Nomer + 1 If Nomer = Finish + 1 Then Epsilon = 1 Exit Do End If Loop End Function Текст программы для Zastavka 21 '----------------------------------------------------------------------'Заставочный модуль программы исследования трансцендентных чисел '----------------------------------------------------------------------'Процедура отключения заставки Private Sub Command1_Click() Zastavka.Hide Rabota.Show End Sub '----------------------------------------------------------------------Текст программы для About '----------------------------------------------------------------------'Справочный модуль программы исследования трансцендентных чисел '----------------------------------------------------------------------'Процедура отключения справки Private Sub Command1_Click() About.Hide Rabota.Show End Sub 22